Author: mturk
Date: Fri Mar 25 11:16:39 2011
New Revision: 1085321

URL: http://svn.apache.org/viewvc?rev=1085321&view=rev
Log:
Add more Unsafe methods

Modified:
    
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
    commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c

Modified: 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java?rev=1085321&r1=1085320&r2=1085321&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Unsafe.java
 Fri Mar 25 11:16:39 2011
@@ -15,6 +15,7 @@
  */
 
 package org.apache.commons.runtime;
+import java.lang.reflect.Field;
 
 /**
  * Wrapper over sun.misc.Unsafe.
@@ -30,8 +31,11 @@ public final class Unsafe
         // No instance.
     }
 
-    private static final Object unsafe;
+    private static final  Object unsafe;
     private static native Object get0();
+    private static native int    get1(Field f);
+    private static native int    get2(Field f);
+    private static native int    get3(Field f);
     static {
         unsafe = get0();
     }
@@ -45,7 +49,40 @@ public final class Unsafe
     }
 
     public static Object getInstance()
+        throws UnsupportedOperationException
     {
+        if (unsafe == null)
+            throw new UnsupportedOperationException();
         return unsafe;
     }
+
+    public static int objectFieldOffset(Field field)
+        throws UnsupportedOperationException, IllegalArgumentException
+    {
+        if (unsafe == null)
+            throw new UnsupportedOperationException();
+        if (field == null)
+            throw new IllegalArgumentException();
+        return get1(field);
+    }
+
+    public static int staticFieldBase(Field field)
+        throws UnsupportedOperationException, IllegalArgumentException
+    {
+        if (unsafe == null)
+            throw new UnsupportedOperationException();
+        if (field == null)
+            throw new IllegalArgumentException();
+        return get2(field);
+    }
+
+    public static int staticFieldOffset(Field field)
+        throws UnsupportedOperationException, IllegalArgumentException
+    {
+        if (unsafe == null)
+            throw new UnsupportedOperationException();
+        if (field == null)
+            throw new IllegalArgumentException();
+        return get3(field);
+    }
 }

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c?rev=1085321&r1=1085320&r2=1085321&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/unsafe.c Fri Mar 25 
11:16:39 2011
@@ -50,6 +50,12 @@ J_DECLARE_M_ID(0002) = {
 
 J_DECLARE_M_ID(0003) = {
     0,
+    "staticFieldBase",
+    "(Ljava/lang/reflect/Field;)J"
+};
+
+J_DECLARE_M_ID(0004) = {
+    0,
     "staticFieldOffset",
     "(Ljava/lang/reflect/Field;)J"
 };
@@ -67,6 +73,7 @@ ACR_CLASS_CTOR(Unsafe)
     J_LOAD_METHOD(0001);
     J_LOAD_METHOD(0002);
     J_LOAD_METHOD(0003);
+    J_LOAD_METHOD(0004);
 
     return 0;
 }
@@ -78,8 +85,8 @@ ACR_CLASS_DTOR(Unsafe)
 
 static jobject _unsafe_instance = 0;
 
-jobject
-AcrUnsafeGetInstance(JNI_STDENV)
+ACR_INLINE(jobject)
+_get_unsafe(JNI_STDENV)
 {
     if (_unsafe_instance == 0 && _clazzn.i != 0) {
         _unsafe_instance = GET_SFIELD_O(0000, _clazzn.i);
@@ -87,41 +94,82 @@ AcrUnsafeGetInstance(JNI_STDENV)
     return _unsafe_instance;
 }
 
-jlong
+jint
 AcrUnsafeObjectFieldOffset(JNI_STDARGS)
 {
-    if (AcrUnsafeGetInstance(_E) == 0) {
+    jlong fo;
+    if (_get_unsafe(_E) == 0) {
+        return 0;
+    }
+    fo = CALL_METHOD1(Long, 0002, _unsafe_instance, _O);
+    if (fo > 0 && fo < INT_MAX)
+        return (jint)fo;
+    else
+        return 0;
+}
+
+jint
+AcrUnsafeStaticFieldBase(JNI_STDARGS)
+{
+    jlong fo;
+    if (_get_unsafe(_E) == 0) {
         return 0;
     }
-    return CALL_METHOD1(Long, 0002, _unsafe_instance, _O);
+    fo = CALL_METHOD1(Long, 0003, _unsafe_instance, _O);
+    if (fo > 0 && fo < INT_MAX)
+        return (jint)fo;
+    else
+        return 0;
 }
 
-jlong
+jint
 AcrUnsafeStaticFieldOffset(JNI_STDARGS)
 {
-    if (AcrUnsafeGetInstance(_E) == 0) {
+    jlong fo;
+    if (_get_unsafe(_E) == 0) {
         return 0;
     }
-    return CALL_METHOD1(Long, 0003, _unsafe_instance, _O);
+    fo = CALL_METHOD1(Long, 0004, _unsafe_instance, _O);
+    if (fo > 0 && fo < INT_MAX)
+        return (jint)fo;
+    else
+        return 0;
 }
 
 ACR_JNI_EXPORT(jobject, Unsafe, get0)(JNI_STDARGS)
 {
-    return AcrUnsafeGetInstance(_E);
+    return _get_unsafe(_E);
+}
+
+ACR_JNI_EXPORT(jint, Unsafe, get1)(JNI_STDARGS, jobject field)
+{
+    return AcrUnsafeObjectFieldOffset(_E, field);
+}
+
+ACR_JNI_EXPORT(jint, Unsafe, get2)(JNI_STDARGS, jobject field)
+{
+    return AcrUnsafeStaticFieldBase(_E, field);
+}
+
+ACR_JNI_EXPORT(jint, Unsafe, get3)(JNI_STDARGS, jobject field)
+{
+    return AcrUnsafeStaticFieldOffset(_E, field);
 }
 
 #if defined(ENABLE_TEST_PRIVATE)
-ACR_JNI_EXPORT(jint, TestUnsafe, get0)(JNI_STDARGS, jobject o, jlong off)
+ACR_JNI_EXPORT(jint, TestUnsafe, get0)(JNI_STDARGS, jobject o, jint off)
 {
-    if (o != 0) {
-        char *ob = (*(char **)o + (ptrdiff_t)off);
-        return *((jint *)ob);
+    if (o != 0 && off > 0) {
+        char *oa = *(char **)o;
+        if (oa != 0) {
+            char *fa = (oa + (ptrdiff_t)off);
+            return *((jint *)fa);
+        }
     }
-    else
-        return 0;
+    return 0;
 }
 
-ACR_JNI_EXPORT(jlong, TestUnsafe, get1)(JNI_STDARGS, jobject o)
+ACR_JNI_EXPORT(jint, TestUnsafe, get1)(JNI_STDARGS, jobject o)
 {
     return AcrUnsafeObjectFieldOffset(_E, o);
 }


Reply via email to