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

View File

@ -31,7 +31,7 @@ public final class Double extends Number {
}
public static String toString(double v) {
return "todo";
return "Double.toString: todo";
}
public byte byteValue() {
@ -60,7 +60,7 @@ public final class Double extends Number {
public static double parseDouble(String s) {
// todo
return 0.0;
throw new NumberFormatException(s);
}
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) {
return "todo";
return "Float.toString: todo";
}
public byte byteValue() {

View File

@ -34,7 +34,10 @@ public final class Long extends Number {
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;
char[] array = new char[size];
@ -50,7 +53,7 @@ public final class Long extends Number {
--i;
}
if (v < 0) {
if (negative) {
array[i] = '-';
}

View File

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

View File

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

View File

@ -28,15 +28,13 @@ public final class Array {
return Boolean.valueOf(((boolean[]) array)[index]);
case 'L':
case '[':
return getObject(array, index);
return ((Object[]) array)[index];
default:
throw new Error();
}
}
private static native Object getObject(Object array, int index);
public static void set(Object array, int index, Object value) {
String className = array.getClass().getName();
if (! className.startsWith("[")) {
@ -71,7 +69,7 @@ public final class Array {
case 'L':
case '[':
if (array.getClass().getComponentType().isInstance(value)) {
setObject(array, index, value);
((Object[]) array)[index] = value;
} else {
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);
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);
} else {
String name = spec.substring(start, i + 1);
types[index++] = Class.forName(name);
types[index++] = Class.forCanonicalName(name);
}
} else {
String name = spec.substring(i, i + 1);
types[index++] = Class.forName(name);
types[index++] = Class.forCanonicalName(name);
}
}
} catch (ClassNotFoundException e) {

View File

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

View File

@ -260,7 +260,7 @@ Field_setObject(Thread* t, jclass, jobject instance, jint offset,
jobject
Constructor_make(Thread* t, jclass, jclass c)
{
return pushReference(t, make(t, c));
return pushReference(t, make(t, *c));
}
jobject
@ -281,18 +281,6 @@ Method_invoke(Thread* t, jclass, jobject method, jobject instance,
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
Array_getLength(Thread* t, jclass, jobject array)
{
@ -663,10 +651,6 @@ populateBuiltinMap(Thread* t, object map)
{ "Java_java_lang_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",
reinterpret_cast<void*>(::Array_getLength) },
{ "Java_java_lang_reflect_Array_makeObjectArray",

View File

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