diff --git a/runtime/native/unsafe.cpp b/runtime/native/unsafe.cpp index 889bb85e..6e106e14 100644 --- a/runtime/native/unsafe.cpp +++ b/runtime/native/unsafe.cpp @@ -59,8 +59,8 @@ Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafeObj } void -Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, jobject, jobject, jlong, jint) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI"); +Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jint value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } extern "C" { @@ -69,13 +69,13 @@ extern "C" { jobject Java_sun_misc_Unsafe_getObject(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset) { - // dw475 TODO autobox primative types (need to inspect object field) + // dw475 TODO autobox primative types (need to inspect object field) (may not have to) return *(reinterpret_cast(reinterpret_cast(obj) + offset)); } void -Java_sun_misc_Unsafe_putObject(JNIEnv *env, jobject, jobject, jlong, jobject) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putObject"); +Java_sun_misc_Unsafe_putObject(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jobject value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jboolean @@ -84,8 +84,8 @@ Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, jobject unsafeObj, jobject obj, jlo } void -Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, jobject, jobject, jlong, jboolean) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putBoolean"); +Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jboolean value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jbyte @@ -94,8 +94,8 @@ Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafeOb } void -Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, jobject, jobject, jlong, jbyte) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB"); +Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jbyte value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jshort @@ -104,8 +104,8 @@ Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafeO } void -Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, jobject, jobject, jlong, jshort) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS"); +Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jshort value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jchar @@ -114,8 +114,8 @@ Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafeOb } void -Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, jobject, jobject, jlong, jchar) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC"); +Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jchar value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jlong @@ -124,8 +124,8 @@ Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafeOb } void -Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, jobject, jobject, jlong, jlong) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ"); +Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jlong value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jfloat @@ -134,8 +134,8 @@ Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafeO } void -Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, jobject, jobject, jlong, jfloat) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF"); +Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jfloat value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jdouble @@ -144,8 +144,8 @@ Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, jobject unsafe } void -Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, jobject, jobject, jlong, jdouble) { - UnsafeUnimplemented("Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD"); +Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jdouble value) { + *(reinterpret_cast(reinterpret_cast(obj) + offset)) = value; } jbyte diff --git a/tests/isolated/FieldReflection.java b/tests/isolated/FieldReflection.java index b4efb042..93662a57 100644 --- a/tests/isolated/FieldReflection.java +++ b/tests/isolated/FieldReflection.java @@ -16,6 +16,9 @@ public class FieldReflection { public long ll = 1231231232; public Long L; public String s; + public String[] sarr; + public int[] iarr; + public FieldReflectionGen frGeneric; static Integer b; static String ss = "AAAA"; @@ -30,13 +33,41 @@ public static void main(String[] args) throws Exception { System.out.println(fld.getModifiers()); System.out.println(fld.getType()); System.out.println(fld.get(aaa)); - System.out.println(fld.getGenericType()); + // TODO fix something with generics + // System.out.println(fld.getGenericType()); + + if (fld.getName().equals("a")) { + fld.setInt(aaa, 123412); + } else if (fld.getName().equals("bb")) { + fld.setBoolean(aaa, true); + } else if (fld.getName().equals("cc")) { + fld.setShort(aaa, new Short((short)17)); + fld.set(aaa, new Short((short)34)); + } else if (fld.getName().equals("ff")) { + fld.setFloat(aaa, 0.3432f); + } else if (fld.getName().equals("d")) { + fld.set(aaa, new Double(1234544.92)); + } else if (fld.getName().equals("j")) { + fld.setByte(aaa, (byte) 11); + } } + + System.out.println(aaa.a); + System.out.println(aaa.bb); + System.out.println(aaa.cc); + System.out.println(aaa.ff); + System.out.println(aaa.d); + System.out.println(aaa.j); } FieldReflection(int i, int j) { a = i; s = "A string"; b = j; + sarr = new String[]{"one", "two"}; + } + + static class FieldReflectionGen { + T[] arr; } }