Index: vmcore/include/Class.h =================================================================== --- vmcore/include/Class.h (revision 587853) +++ vmcore/include/Class.h (working copy) @@ -1168,7 +1168,7 @@ unsigned get_number_of_virtual_method_entries() const { return m_num_virtual_method_entries; } - + /** Gets the first subclass for Class Hierarchy Analysis. * @return The first subclass.*/ Class* get_first_child() const { return m_cha_first_child; } @@ -1232,6 +1232,11 @@ return (size_t)((char*)(&dummy->m_array_element_class) - (char*)dummy); } + static size_t get_offset_of_mo() { + Class* dummy=NULL; + return (size_t)((char*)(&dummy->m_class_handle) - (char*)dummy); + } + /** Gets the number of array dimensions. * @return Number of dimentions in an array represented by this class.*/ unsigned char get_number_of_dimensions() const { Index: vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp =================================================================== --- vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp (revision 587853) +++ vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp (working copy) @@ -23,6 +23,12 @@ #include "open/vm.h" #include +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getClassManagedObjectOffset(JNIEnv *e, jclass c) +{ + return (jint)Class::get_offset_of_mo(); +} + + JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getObjectVtableOffset(JNIEnv *e, jclass c) { return object_get_vtable_offset(); Index: vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h =================================================================== --- vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h (revision 587853) +++ vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h (working copy) @@ -27,7 +27,11 @@ extern "C" { #endif +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getClassManagedObjectOffset + (JNIEnv *, jclass); + + /* * Class: org_apache_harmony_drlvm_VMHelperFastPath * Method: getObjectVtableOffset Index: vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java =================================================================== --- vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java (revision 587853) +++ vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java (working copy) @@ -25,6 +25,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Member; +import org.apache.harmony.drlvm.VMHelperFastPath; /** @@ -103,8 +104,13 @@ * {@link Object#getClass() Object.getClass()} method. * @api2vm */ - static native Class getClass(Object obj); + //static native Class getClass(Object obj); + static Class getClass(Object obj) { + return (Class)VMHelperFastPath.getClassAddress(obj).loadAddress().toObjectReference().toObject(); + } + + /** * This method satisfies the requirements of the specification for the * {@link Class#getClassLoader() Class.getClassLoader()} method except Index: vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java =================================================================== --- vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java (revision 587853) +++ vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java (working copy) @@ -35,6 +35,7 @@ private static final int CLASS_INF_TABLE_1_OFFSET = getVtableIntfTableOffset(1); private static final int CLASS_INF_TYPE_2_OFFSET = getVtableIntfTypeOffset(2); private static final int CLASS_INF_TABLE_2_OFFSET = getVtableIntfTableOffset(2); + private static final int CLASS_MO_OFFSET = getClassManagedObjectOffset(); private VMHelperFastPath() {} @@ -171,10 +172,19 @@ return depthSubType.EQ(castType); } + @Inline + public static Address getClassAddress(Object obj) { + Address objClassType = getVTableAddress(obj).loadAddress(Offset.fromIntZeroExtend(VTABLE_CLASS_OFFSET)); + Address moAddr = objClassType.loadAddress(Offset.fromIntZeroExtend(CLASS_MO_OFFSET)); + return moAddr; + } + + private static native int getObjectVtableOffset(); private static native int getVtableIntfTypeOffset(int n); private static native int getVtableIntfTableOffset(int n); private static native int getVtableClassOffset(); private static native int getVtableSuperclassesOffset(); + private static native int getClassManagedObjectOffset(); }