From 8e73ea4796c832271cd578727b5834f7a10bc693 Mon Sep 17 00:00:00 2001 From: Piotr Jastrzebski Date: Thu, 7 May 2015 09:41:00 +0100 Subject: [PATCH] Implement some more of sun.misc.Unsafe. Change-Id: If005462fb188472c0177fb95b3045d78536042f9 --- runtime/native/sun_misc_Unsafe.cc | 107 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/runtime/native/sun_misc_Unsafe.cc b/runtime/native/sun_misc_Unsafe.cc index d613f73a8..b431d0ed4 100644 --- a/runtime/native/sun_misc_Unsafe.cc +++ b/runtime/native/sun_misc_Unsafe.cc @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "common_throws.h" #include "gc/accounting/card_table-inl.h" #include "jni_internal.h" #include "mirror/array.h" @@ -21,6 +22,10 @@ #include "mirror/object-inl.h" #include "scoped_fast_native_object_access.h" +#include +#include +#include + namespace art { static jboolean Unsafe_compareAndSwapInt(JNIEnv* env, jobject, jobject javaObj, jlong offset, @@ -182,6 +187,7 @@ static jint Unsafe_getArrayIndexScaleForComponentType(JNIEnv* env, jclass, jobje Primitive::Type primitive_type = component->GetPrimitiveType(); return Primitive::ComponentSize(primitive_type); } + static jint Unsafe_addressSize(JNIEnv* env, jobject) { return sizeof(void*); } @@ -365,6 +371,95 @@ static void Unsafe_copyMemoryFromPrimitiveArray(JNIEnv *env, ThrowIllegalAccessException(nullptr, "not a primitive array"); } } +static jboolean Unsafe_getBoolean(JNIEnv* env, jobject, jobject javaObj, jlong offset) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + //return obj->GetField8(MemberOffset(offset)); + return 0; +} + +static void Unsafe_putBoolean(JNIEnv* env, jobject, jobject javaObj, jlong offset, jboolean newValue) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + // JNI must use non transactional mode. + //obj->SetField8(MemberOffset(offset), newValue); +} + +static jbyte Unsafe_getByte(JNIEnv* env, jobject, jobject javaObj, jlong offset) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + //return obj->GetField8(MemberOffset(offset)); + return 0; +} + +static void Unsafe_putByte(JNIEnv* env, jobject, jobject javaObj, jlong offset, jbyte newValue) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + // JNI must use non transactional mode. + //obj->SetField8(MemberOffset(offset), newValue); +} + +static jchar Unsafe_getChar(JNIEnv* env, jobject, jobject javaObj, jlong offset) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + //return obj->GetField16(MemberOffset(offset)); + return 0; +} + +static void Unsafe_putChar(JNIEnv* env, jobject, jobject javaObj, jlong offset, jchar newValue) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + // JNI must use non transactional mode. + //obj->SetField16(MemberOffset(offset), newValue); +} + +static jshort Unsafe_getShort(JNIEnv* env, jobject, jobject javaObj, jlong offset) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + //return obj->GetField16(MemberOffset(offset)); + return 0; +} + +static void Unsafe_putShort(JNIEnv* env, jobject, jobject javaObj, jlong offset, jshort newValue) { + // TODO(haaawk): Fix this. + //ScopedFastNativeObjectAccess soa(env); + //mirror::Object* obj = soa.Decode(javaObj); + // JNI must use non transactional mode. + //obj->SetField16(MemberOffset(offset), newValue); +} + +static jfloat Unsafe_getFloat(JNIEnv* env, jobject, jobject javaObj, jlong offset) { + ScopedFastNativeObjectAccess soa(env); + mirror::Object* obj = soa.Decode(javaObj); + return obj->GetField32(MemberOffset(offset)); +} + +static void Unsafe_putFloat(JNIEnv* env, jobject, jobject javaObj, jlong offset, jfloat newValue) { + ScopedFastNativeObjectAccess soa(env); + mirror::Object* obj = soa.Decode(javaObj); + // JNI must use non transactional mode. + obj->SetField32(MemberOffset(offset), newValue); +} + +static jdouble Unsafe_getDouble(JNIEnv* env, jobject, jobject javaObj, jlong offset) { + ScopedFastNativeObjectAccess soa(env); + mirror::Object* obj = soa.Decode(javaObj); + return obj->GetField64(MemberOffset(offset)); +} + +static void Unsafe_putDouble(JNIEnv* env, jobject, jobject javaObj, jlong offset, jdouble newValue) { + ScopedFastNativeObjectAccess soa(env); + mirror::Object* obj = soa.Decode(javaObj); + // JNI must use non transactional mode. + obj->SetField64(MemberOffset(offset), newValue); +} static JNINativeMethod gMethods[] = { NATIVE_METHOD(Unsafe, compareAndSwapInt, "!(Ljava/lang/Object;JII)Z"), @@ -410,6 +505,18 @@ static JNINativeMethod gMethods[] = { NATIVE_METHOD(Unsafe, copyMemory, "!(JJJ)V"), NATIVE_METHOD(Unsafe, copyMemoryToPrimitiveArray, "!(JLjava/lang/Object;JJ)V"), NATIVE_METHOD(Unsafe, copyMemoryFromPrimitiveArray, "!(Ljava/lang/Object;JJJ)V"), + NATIVE_METHOD(Unsafe, getBoolean, "!(Ljava/lang/Object;J)Z"), + NATIVE_METHOD(Unsafe, getByte, "!(Ljava/lang/Object;J)B"), + NATIVE_METHOD(Unsafe, getChar, "!(Ljava/lang/Object;J)C"), + NATIVE_METHOD(Unsafe, getShort, "!(Ljava/lang/Object;J)S"), + NATIVE_METHOD(Unsafe, getFloat, "!(Ljava/lang/Object;J)F"), + NATIVE_METHOD(Unsafe, getDouble, "!(Ljava/lang/Object;J)D"), + NATIVE_METHOD(Unsafe, putBoolean, "!(Ljava/lang/Object;JZ)V"), + NATIVE_METHOD(Unsafe, putByte, "!(Ljava/lang/Object;JB)V"), + NATIVE_METHOD(Unsafe, putChar, "!(Ljava/lang/Object;JC)V"), + NATIVE_METHOD(Unsafe, putShort, "!(Ljava/lang/Object;JS)V"), + NATIVE_METHOD(Unsafe, putFloat, "!(Ljava/lang/Object;JF)V"), + NATIVE_METHOD(Unsafe, putDouble, "!(Ljava/lang/Object;JD)V"), }; void register_sun_misc_Unsafe(JNIEnv* env) { -- 2.11.0