heap o' bugfixes

This commit is contained in:
Joel Dice
2007-08-19 20:57:32 -06:00
parent 7a340fd8fb
commit e2f3e80bdf
11 changed files with 47 additions and 49 deletions

View File

@ -25,6 +25,10 @@ public final class Class <T> {
private Class() { } private Class() { }
public String toString() {
return getName();
}
public String getName() { public String getName() {
return new String(name, 0, name.length - 1, false); return new String(name, 0, name.length - 1, false);
} }
@ -73,7 +77,7 @@ public final class Class <T> {
public Class getComponentType() { public Class getComponentType() {
if (isArray()) { if (isArray()) {
return forCanonicalName(new String(name, 1, name.length - 2, false)); return (Class) (Object) staticTable;
} else { } else {
return null; return null;
} }
@ -258,12 +262,14 @@ public final class Class <T> {
private int countMethods(boolean publicOnly) { private int countMethods(boolean publicOnly) {
int count = 0; int count = 0;
for (int i = 0; i < methodTable.length; ++i) { if (methodTable != null) {
if (((! publicOnly) for (int i = 0; i < methodTable.length; ++i) {
|| ((methodTable[i].getModifiers() & Modifier.PUBLIC)) != 0) if (((! publicOnly)
&& (! methodTable[i].getName().startsWith("<"))) || ((methodTable[i].getModifiers() & Modifier.PUBLIC)) != 0)
{ && (! methodTable[i].getName().startsWith("<")))
++ count; {
++ count;
}
} }
} }
return count; return count;

View File

@ -31,7 +31,7 @@ public final class Double extends Number {
} }
public static String toString(double v) { public static String toString(double v) {
return "todo"; return "Double.toString: todo";
} }
public byte byteValue() { public byte byteValue() {
@ -60,7 +60,7 @@ public final class Double extends Number {
public static double parseDouble(String s) { public static double parseDouble(String s) {
// todo // todo
return 0.0; throw new NumberFormatException(s);
} }
public static native long doubleToRawLongBits(double value); public static native long doubleToRawLongBits(double value);

View File

@ -26,7 +26,7 @@ public final class Float extends Number {
} }
public static String toString(float v) { public static String toString(float v) {
return "todo"; return "Float.toString: todo";
} }
public byte byteValue() { public byte byteValue() {

View File

@ -34,7 +34,10 @@ public final class Long extends Number {
return "0"; return "0";
} }
int size = (v < 0 ? 1 : 0); boolean negative = v < 0;
if (negative) v = -v;
int size = (negative ? 1 : 0);
for (long n = v; n > 0; n /= radix) ++size; for (long n = v; n > 0; n /= radix) ++size;
char[] array = new char[size]; char[] array = new char[size];
@ -50,7 +53,7 @@ public final class Long extends Number {
--i; --i;
} }
if (v < 0) { if (negative) {
array[i] = '-'; array[i] = '-';
} }

View File

@ -122,7 +122,7 @@ public final class String implements Comparable<String> {
} }
public int indexOf(int c) { public int indexOf(int c) {
for (int i = 0; i < length - 1; ++i) { for (int i = 0; i < length; ++i) {
if (charAt(i) == c) { if (charAt(i) == c) {
return i; return i;
} }
@ -144,7 +144,7 @@ public final class String implements Comparable<String> {
public int indexOf(String s) { public int indexOf(String s) {
if (s.length == 0) return 0; if (s.length == 0) return 0;
for (int i = 0; i < length - s.length; ++i) { for (int i = 0; i < length - s.length + 1; ++i) {
int j = 0; int j = 0;
for (; j < s.length; ++j) { for (; j < s.length; ++j) {
if (charAt(i + j) != s.charAt(j)) { if (charAt(i + j) != s.charAt(j)) {

View File

@ -36,7 +36,12 @@ public class Throwable {
} }
public String toString() { public String toString() {
return getClass().getName() + ": " + message; StringBuilder sb = new StringBuilder();
sb.append(getClass().getName());
if (message != null) {
sb.append(": ").append(message);
}
return sb.toString();
} }
private static native Object trace(int skipCount); private static native Object trace(int skipCount);
@ -69,11 +74,7 @@ public class Throwable {
} }
private void printStackTrace(StringBuilder sb, String nl) { private void printStackTrace(StringBuilder sb, String nl) {
sb.append(getClass().getName()); sb.append(toString()).append(nl);
if (message != null) {
sb.append(": ").append(message);
}
sb.append(nl);
StackTraceElement[] trace = resolveTrace(); StackTraceElement[] trace = resolveTrace();
for (int i = 0; i < trace.length; ++i) { for (int i = 0; i < trace.length; ++i) {

View File

@ -28,15 +28,13 @@ public final class Array {
return Boolean.valueOf(((boolean[]) array)[index]); return Boolean.valueOf(((boolean[]) array)[index]);
case 'L': case 'L':
case '[': case '[':
return getObject(array, index); return ((Object[]) array)[index];
default: default:
throw new Error(); throw new Error();
} }
} }
private static native Object getObject(Object array, int index);
public static void set(Object array, int index, Object value) { public static void set(Object array, int index, Object value) {
String className = array.getClass().getName(); String className = array.getClass().getName();
if (! className.startsWith("[")) { if (! className.startsWith("[")) {
@ -71,7 +69,7 @@ public final class Array {
case 'L': case 'L':
case '[': case '[':
if (array.getClass().getComponentType().isInstance(value)) { if (array.getClass().getComponentType().isInstance(value)) {
setObject(array, index, value); ((Object[]) array)[index] = value;
} else { } else {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
@ -82,8 +80,6 @@ public final class Array {
} }
} }
private static native void setObject(Object array, int index, Object value);
public static native int getLength(Object array); public static native int getLength(Object array);
private static native Object makeObjectArray(Class elementType, int length); private static native Object makeObjectArray(Class elementType, int length);

View File

@ -73,11 +73,11 @@ public class Method<T> extends AccessibleObject implements Member {
types[index++] = Class.forName(name); types[index++] = Class.forName(name);
} else { } else {
String name = spec.substring(start, i + 1); String name = spec.substring(start, i + 1);
types[index++] = Class.forName(name); types[index++] = Class.forCanonicalName(name);
} }
} else { } else {
String name = spec.substring(i, i + 1); String name = spec.substring(i, i + 1);
types[index++] = Class.forName(name); types[index++] = Class.forCanonicalName(name);
} }
} }
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {

View File

@ -233,8 +233,8 @@ $(jni-library): $(jni-objects)
$(executable): $(interpreter-objects) $(stdcpp-objects) $(executable): $(interpreter-objects) $(stdcpp-objects)
@echo "linking $(@)" @echo "linking $(@)"
$(cc) $(lflags) $(^) -o $(@) $(cc) $(lflags) $(^) -o $(@)
$(strip) --strip-all $(@) @$(strip) --strip-all $(@)
$(show-size) $(@) @$(show-size) $(@)
.PHONY: generator .PHONY: generator
generator: $(generator-executable) generator: $(generator-executable)

View File

@ -260,7 +260,7 @@ Field_setObject(Thread* t, jclass, jobject instance, jint offset,
jobject jobject
Constructor_make(Thread* t, jclass, jclass c) Constructor_make(Thread* t, jclass, jclass c)
{ {
return pushReference(t, make(t, c)); return pushReference(t, make(t, *c));
} }
jobject jobject
@ -281,18 +281,6 @@ Method_invoke(Thread* t, jclass, jobject method, jobject instance,
return pushReference(t, v); return pushReference(t, v);
} }
jobject
Array_getObject(Thread* t, jclass, jobject array, int index)
{
return pushReference(t, objectArrayBody(t, *array, index));
}
void
Array_setObject(Thread* t, jclass, jobject array, int index, jobject value)
{
set(t, objectArrayBody(t, *array, index), (value ? *value : 0));
}
jint jint
Array_getLength(Thread* t, jclass, jobject array) Array_getLength(Thread* t, jclass, jobject array)
{ {
@ -663,10 +651,6 @@ populateBuiltinMap(Thread* t, object map)
{ "Java_java_lang_Object_clone", { "Java_java_lang_Object_clone",
reinterpret_cast<void*>(::Object_clone) }, reinterpret_cast<void*>(::Object_clone) },
{ "Java_java_lang_reflect_Array_getObject",
reinterpret_cast<void*>(::Array_getObject) },
{ "Java_java_lang_reflect_Array_setObject",
reinterpret_cast<void*>(::Array_setObject) },
{ "Java_java_lang_reflect_Array_getLength", { "Java_java_lang_reflect_Array_getLength",
reinterpret_cast<void*>(::Array_getLength) }, reinterpret_cast<void*>(::Array_getLength) },
{ "Java_java_lang_reflect_Array_makeObjectArray", { "Java_java_lang_reflect_Array_makeObjectArray",

View File

@ -1172,6 +1172,7 @@ object
makeArrayClass(Thread* t, unsigned dimensions, object spec, makeArrayClass(Thread* t, unsigned dimensions, object spec,
object elementClass) object elementClass)
{ {
// todo: arrays should implement Cloneable and Serializable
return makeClass return makeClass
(t, (t,
0, 0,
@ -1182,11 +1183,11 @@ makeArrayClass(Thread* t, unsigned dimensions, object spec,
classObjectMask(t, arrayBody(t, t->vm->types, Machine::ArrayType)), classObjectMask(t, arrayBody(t, t->vm->types, Machine::ArrayType)),
spec, spec,
arrayBody(t, t->vm->types, Machine::JobjectType), arrayBody(t, t->vm->types, Machine::JobjectType),
elementClass, 0,
classVirtualTable(t, arrayBody(t, t->vm->types, Machine::JobjectType)), classVirtualTable(t, arrayBody(t, t->vm->types, Machine::JobjectType)),
0, 0,
0, 0,
0, elementClass,
t->vm->loader); t->vm->loader);
} }
@ -1688,6 +1689,8 @@ stringChars(Thread* t, object string, char* chars)
bool bool
isAssignableFrom(Thread* t, object a, object b) isAssignableFrom(Thread* t, object a, object b)
{ {
if (a == b) return true;
if (classFlags(t, a) & ACC_INTERFACE) { if (classFlags(t, a) & ACC_INTERFACE) {
for (; b; b = classSuper(t, b)) { for (; b; b = classSuper(t, b)) {
object itable = classInterfaceTable(t, b); object itable = classInterfaceTable(t, b);
@ -1697,6 +1700,11 @@ isAssignableFrom(Thread* t, object a, object b)
} }
} }
} }
} else if (classArrayDimensions(t, a)) {
if (classArrayDimensions(t, b)) {
return isAssignableFrom
(t, classStaticTable(t, a), classStaticTable(t, b));
}
} else { } else {
for (; b; b = classSuper(t, b)) { for (; b; b = classSuper(t, b)) {
if (b == a) { if (b == a) {