sketch of singleton support

This commit is contained in:
Joel Dice
2007-11-02 15:08:14 -06:00
parent 80775f6cf8
commit e820b6a8a4
6 changed files with 279 additions and 328 deletions

View File

@ -47,176 +47,108 @@ public class Field<T> extends AccessibleObject {
}
public Object get(Object instance) throws IllegalAccessException {
Object target;
if ((flags & Modifier.STATIC) != 0) {
Object v = class_.staticTable()[offset];
switch (code) {
case ByteField:
return Byte.valueOf
((byte) (v == null ? 0 : ((Integer) v).intValue()));
case BooleanField:
return Boolean.valueOf
(v == null ? false : ((Integer) v) != 0);
case CharField:
return Character.valueOf
((char) (v == null ? 0 : ((Integer) v).intValue()));
case ShortField:
return Short.valueOf
((short) (v == null ? 0 : ((Integer) v).intValue()));
case FloatField:
return Float.valueOf
(Float.intBitsToFloat(v == null ? 0 : (Integer) v));
case DoubleField:
return Double.valueOf
(Double.longBitsToDouble(v == null ? 0 : (Long) v));
case IntField:
case LongField:
case ObjectField:
return v;
default:
throw new Error();
}
target = class_.staticTable();
} else if (class_.isInstance(instance)) {
switch (code) {
case ByteField:
return Byte.valueOf((byte) getPrimitive(instance, code, offset));
case BooleanField:
return Boolean.valueOf(getPrimitive(instance, code, offset) != 0);
case CharField:
return Character.valueOf((char) getPrimitive(instance, code, offset));
case ShortField:
return Short.valueOf((short) getPrimitive(instance, code, offset));
case IntField:
return Integer.valueOf((int) getPrimitive(instance, code, offset));
case LongField:
return Long.valueOf((int) getPrimitive(instance, code, offset));
case FloatField:
return Float.valueOf
(Float.intBitsToFloat((int) getPrimitive(instance, code, offset)));
case DoubleField:
return Double.valueOf
(Double.longBitsToDouble(getPrimitive(instance, code, offset)));
case ObjectField:
return getObject(instance, offset);
default:
throw new Error();
}
target = instance;
} else {
throw new IllegalArgumentException();
}
switch (code) {
case ByteField:
return Byte.valueOf((byte) getPrimitive(target, code, offset));
case BooleanField:
return Boolean.valueOf(getPrimitive(target, code, offset) != 0);
case CharField:
return Character.valueOf((char) getPrimitive(target, code, offset));
case ShortField:
return Short.valueOf((short) getPrimitive(target, code, offset));
case IntField:
return Integer.valueOf((int) getPrimitive(target, code, offset));
case LongField:
return Long.valueOf((int) getPrimitive(target, code, offset));
case FloatField:
return Float.valueOf
(Float.intBitsToFloat((int) getPrimitive(target, code, offset)));
case DoubleField:
return Double.valueOf
(Double.longBitsToDouble(getPrimitive(target, code, offset)));
case ObjectField:
return getObject(instance, offset);
default:
throw new Error();
}
}
public void set(Object instance, Object value)
throws IllegalAccessException
{
Object target;
if ((flags & Modifier.STATIC) != 0) {
Object[] a = class_.staticTable();
switch (code) {
case ByteField:
a[offset] = Integer.valueOf((Byte) value);
break;
case BooleanField:
a[offset] = Integer.valueOf(((Boolean) value) ? 1 : 0);
break;
case CharField:
a[offset] = Integer.valueOf((Character) value);
break;
case ShortField:
a[offset] = Integer.valueOf((Short) value);
break;
case FloatField:
a[offset] = Integer.valueOf(Float.floatToRawIntBits((Float) value));
break;
case DoubleField:
a[offset] = Long.valueOf(Double.doubleToRawLongBits((Double) value));
break;
case IntField:
case LongField:
a[offset] = value;
break;
case ObjectField:
if (getType().isInstance(value)) {
a[offset] = value;
} else {
throw new IllegalArgumentException();
}
break;
default:
throw new Error();
}
target = class_.staticTable();
} else if (class_.isInstance(instance)) {
switch (code) {
case ByteField:
setPrimitive(instance, code, offset, (Byte) value);
break;
case BooleanField:
setPrimitive(instance, code, offset, ((Boolean) value) ? 1 : 0);
break;
case CharField:
setPrimitive(instance, code, offset, (Character) value);
break;
case ShortField:
setPrimitive(instance, code, offset, (Short) value);
break;
case IntField:
setPrimitive(instance, code, offset, (Integer) value);
break;
case LongField:
setPrimitive(instance, code, offset, (Long) value);
break;
case FloatField:
setPrimitive(instance, code, offset,
Float.floatToRawIntBits((Float) value));
break;
case DoubleField:
setPrimitive(instance, code, offset,
Double.doubleToRawLongBits((Double) value));
break;
case ObjectField:
if (getType().isInstance(value)) {
setObject(instance, offset, value);
} else {
throw new IllegalArgumentException();
}
break;
default:
throw new Error();
}
target = instance;
} else {
throw new IllegalArgumentException();
}
switch (code) {
case ByteField:
setPrimitive(target, code, offset, (Byte) value);
break;
case BooleanField:
setPrimitive(target, code, offset, ((Boolean) value) ? 1 : 0);
break;
case CharField:
setPrimitive(target, code, offset, (Character) value);
break;
case ShortField:
setPrimitive(target, code, offset, (Short) value);
break;
case IntField:
setPrimitive(target, code, offset, (Integer) value);
break;
case LongField:
setPrimitive(target, code, offset, (Long) value);
break;
case FloatField:
setPrimitive(target, code, offset,
Float.floatToRawIntBits((Float) value));
break;
case DoubleField:
setPrimitive(target, code, offset,
Double.doubleToRawLongBits((Double) value));
break;
case ObjectField:
if (getType().isInstance(value)) {
setObject(target, offset, value);
} else {
throw new IllegalArgumentException();
}
break;
default:
throw new Error();
}
}
private static native long getPrimitive