Merge branch 'master' of dice:git/vm

This commit is contained in:
Joel Dice 2007-10-11 16:43:11 -06:00
commit ebbb45ad98
6 changed files with 75 additions and 12 deletions

View File

@ -1,3 +1,5 @@
#include "math.h"
#include "stdlib.h"
#include "sys/time.h" #include "sys/time.h"
#include "time.h" #include "time.h"
#include "time.h" #include "time.h"
@ -22,7 +24,8 @@ Java_java_lang_System_getProperty(JNIEnv* e, jclass, jint code)
LineSeparator = 100, LineSeparator = 100,
FileSeparator = 101, FileSeparator = 101,
OsName = 102, OsName = 102,
JavaIoTmpdir = 103 JavaIoTmpdir = 103,
UserHome = 104
}; };
switch (code) { switch (code) {
@ -38,6 +41,14 @@ Java_java_lang_System_getProperty(JNIEnv* e, jclass, jint code)
case JavaIoTmpdir: case JavaIoTmpdir:
return e->NewStringUTF("/tmp"); return e->NewStringUTF("/tmp");
case UserHome:
return e->NewStringUTF("/home/scharff");
#ifdef WIN32
LPWSTR home = _wgetenv(L"USERPROFILE");
return JvNewString(reinterpret_cast<jchar*>(home), lstrlenW(home));
#else
return e->NewStringUTF(getenv("HOME"));
#endif
default: default:
throwNew(e, "java/lang/RuntimeException", 0); throwNew(e, "java/lang/RuntimeException", 0);
return 0; return 0;
@ -70,8 +81,14 @@ Java_java_lang_System_doMapLibraryName(JNIEnv* e, jclass, jstring name)
return r; return r;
} }
extern "C" JNIEXPORT jdouble JNICALL
Java_java_lang_Math_floor(JNIEnv*, jclass, jdouble val)
{
return floor(val);
}
extern "C" JNIEXPORT jint JNICALL extern "C" JNIEXPORT jint JNICALL
Java_java_lang_Double_fillBufferWithDouble(JNIEnv *e, jclass, jdouble val, Java_java_lang_Double_fillBufferWithDouble(JNIEnv* e, jclass, jdouble val,
jbyteArray buffer, jint bufferSize) { jbyteArray buffer, jint bufferSize) {
jboolean isCopy; jboolean isCopy;
jbyte* buf = e->GetByteArrayElements(buffer, &isCopy); jbyte* buf = e->GetByteArrayElements(buffer, &isCopy);

View File

@ -301,13 +301,13 @@ public final class String implements Comparable<String> {
return getBytes(); return getBytes();
} }
public void getChars(int srcOffset, int srcLength, public void getChars(int srcOffset, int srcEnd,
char[] dst, int dstOffset) char[] dst, int dstOffset)
{ {
if (srcOffset < 0 || srcOffset + srcLength > length) { if (srcOffset < 0 || srcEnd > length) {
throw new IndexOutOfBoundsException(); throw new IndexOutOfBoundsException();
} }
int srcLength = srcEnd-srcOffset;
if (data instanceof char[]) { if (data instanceof char[]) {
char[] src = (char[]) data; char[] src = (char[]) data;
System.arraycopy(src, offset + srcOffset, dst, dstOffset, srcLength); System.arraycopy(src, offset + srcOffset, dst, dstOffset, srcLength);

View File

@ -15,6 +15,7 @@ public abstract class System {
private static final int FileSeparator = 101; private static final int FileSeparator = 101;
private static final int OsName = 102; private static final int OsName = 102;
private static final int JavaIoTmpdir = 103; private static final int JavaIoTmpdir = 103;
private static final int UserHome = 104;
private static Property properties; private static Property properties;
@ -50,6 +51,8 @@ public abstract class System {
code = LineSeparator; code = LineSeparator;
} else if (name.equals("file.separator")) { } else if (name.equals("file.separator")) {
code = FileSeparator; code = FileSeparator;
} else if (name.equals("user.home")) {
code = UserHome;
} else if (name.equals("os.name")) { } else if (name.equals("os.name")) {
code = OsName; code = OsName;
} }

View File

@ -6,17 +6,19 @@ public class ByteBuffer {
private int capacity; private int capacity;
private int position; private int position;
private int limit; private int limit;
private final boolean readOnly;
public static ByteBuffer allocate(int capacity) { public static ByteBuffer allocate(int capacity) {
return new ByteBuffer(new byte[capacity]); return new ByteBuffer(new byte[capacity], false);
} }
public static ByteBuffer wrap(byte[] array) { public static ByteBuffer wrap(byte[] array) {
return new ByteBuffer(array); return new ByteBuffer(array, false);
} }
private ByteBuffer(byte[] array) { private ByteBuffer(byte[] array, boolean readOnly) {
this.array = array; this.array = array;
this.readOnly = readOnly;
arrayOffset = 0; arrayOffset = 0;
capacity = array.length; capacity = array.length;
limit = capacity; limit = capacity;
@ -27,11 +29,17 @@ public class ByteBuffer {
return array; return array;
} }
public ByteBuffer clear() {
position = 0;
limit = capacity;
return this;
}
public ByteBuffer slice() { public ByteBuffer slice() {
ByteBuffer buf = new ByteBuffer(array); ByteBuffer buf = new ByteBuffer(array, true);
buf.arrayOffset = arrayOffset + position; buf.arrayOffset = arrayOffset + position;
buf.position = 0; buf.position = 0;
buf.capacity = capacity - position; buf.capacity = remaining();
buf.limit = buf.capacity; buf.limit = buf.capacity;
return buf; return buf;
} }
@ -77,13 +85,15 @@ public class ByteBuffer {
} }
public ByteBuffer put(byte val) { public ByteBuffer put(byte val) {
checkPut(1);
array[arrayOffset+(position++)] = val; array[arrayOffset+(position++)] = val;
return this; return this;
} }
public ByteBuffer put(ByteBuffer src) { public ByteBuffer put(ByteBuffer src) {
checkPut(src.remaining());
put(src.array, src.arrayOffset + src.position, src.remaining()); put(src.array, src.arrayOffset + src.position, src.remaining());
position += src.remaining(); src.position += src.remaining();
return this; return this;
} }
@ -92,12 +102,14 @@ public class ByteBuffer {
} }
public ByteBuffer put(byte[] arr, int offset, int len) { public ByteBuffer put(byte[] arr, int offset, int len) {
checkPut(len);
System.arraycopy(arr, offset, array, arrayOffset+position, len); System.arraycopy(arr, offset, array, arrayOffset+position, len);
position += len; position += len;
return this; return this;
} }
public ByteBuffer putInt(int position, int val) { public ByteBuffer putInt(int position, int val) {
checkPut(position, 4);
array[arrayOffset+position] = (byte)((val >> 24) & 0xff); array[arrayOffset+position] = (byte)((val >> 24) & 0xff);
array[arrayOffset+position+1] = (byte)((val >> 16) & 0xff); array[arrayOffset+position+1] = (byte)((val >> 16) & 0xff);
array[arrayOffset+position+2] = (byte)((val >> 8) & 0xff); array[arrayOffset+position+2] = (byte)((val >> 8) & 0xff);
@ -106,18 +118,21 @@ public class ByteBuffer {
} }
public ByteBuffer putInt(int val) { public ByteBuffer putInt(int val) {
checkPut(4);
putInt(position, val); putInt(position, val);
position += 4; position += 4;
return this; return this;
} }
public ByteBuffer putShort(short val) { public ByteBuffer putShort(short val) {
checkPut(2);
put((byte)((val >> 8) & 0xff)); put((byte)((val >> 8) & 0xff));
put((byte)(val & 0xff)); put((byte)(val & 0xff));
return this; return this;
} }
public ByteBuffer putLong(long val) { public ByteBuffer putLong(long val) {
checkPut(8);
putInt((int)(val >> 32)); putInt((int)(val >> 32));
putInt((int)val); putInt((int)val);
return this; return this;
@ -129,10 +144,12 @@ public class ByteBuffer {
} }
public byte get() { public byte get() {
checkGet(1);
return array[arrayOffset+(position++)]; return array[arrayOffset+(position++)];
} }
public byte get(int position) { public byte get(int position) {
checkGet(position, 1);
return array[arrayOffset+position]; return array[arrayOffset+position];
} }
@ -143,6 +160,7 @@ public class ByteBuffer {
} }
public int getInt() { public int getInt() {
checkGet(4);
int i = get() << 24; int i = get() << 24;
i |= (get() & 0xff) << 16; i |= (get() & 0xff) << 16;
i |= (get() & 0xff) << 8; i |= (get() & 0xff) << 8;
@ -151,14 +169,36 @@ public class ByteBuffer {
} }
public short getShort() { public short getShort() {
checkGet(2);
short s = (short)(get() << 8); short s = (short)(get() << 8);
s |= get() & 0xff; s |= get() & 0xff;
return s; return s;
} }
public long getLong() { public long getLong() {
checkGet(8);
long l = getInt() << 32; long l = getInt() << 32;
l |= getInt() & 0xffffffff; l |= getInt() & 0xffffffff;
return l; return l;
} }
private void checkPut(int amount) {
if (readOnly) throw new ReadOnlyBufferException();
if (amount > limit-position) throw new IndexOutOfBoundsException();
}
private void checkPut(int position, int amount) {
if (readOnly) throw new ReadOnlyBufferException();
if (position < 0 || position+amount > limit)
throw new IndexOutOfBoundsException();
}
private void checkGet(int amount) {
if (amount > limit-position) throw new IndexOutOfBoundsException();
}
private void checkGet(int position, int amount) {
if (position < 0 || position+amount > limit)
throw new IndexOutOfBoundsException();
}
} }

View File

@ -57,6 +57,7 @@ public class SocketChannel extends SelectableChannel
if (! connected) { if (! connected) {
natThrowWriteError(socket); natThrowWriteError(socket);
} }
if (b.remaining() == 0) return 0;
int w = natWrite(socket, b.array(), b.arrayOffset() + b.position(), b.remaining()); int w = natWrite(socket, b.array(), b.arrayOffset() + b.position(), b.remaining());
if (w > 0) { if (w > 0) {
b.position(b.position() + w); b.position(b.position() + w);

View File

@ -33,6 +33,7 @@ public class LinkedList<T> implements List<T> {
front = rear = c; front = rear = c;
} else { } else {
c.next = front; c.next = front;
front.prev = c;
front = c; front = c;
} }
} }
@ -44,6 +45,7 @@ public class LinkedList<T> implements List<T> {
front = rear = c; front = rear = c;
} else { } else {
c.prev = rear; c.prev = rear;
rear.next = c;
rear = c; rear = c;
} }
} }
@ -103,7 +105,7 @@ public class LinkedList<T> implements List<T> {
} }
public boolean add(T element) { public boolean add(T element) {
addFirst(element); addLast(element);
return true; return true;
} }