You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/10/23 16:41:38 UTC

svn commit: r587522 - in /harmony/enhanced/drlvm/trunk/vm/interpreter/src: interp_defs.h interp_exports.cpp interp_native_em64t.cpp interp_native_ia32.cpp interp_native_ipf.cpp interp_stack_trace.cpp interpreter.cpp interpreter_ti.cpp

Author: gshimansky
Date: Tue Oct 23 07:41:36 2007
New Revision: 587522

URL: http://svn.apache.org/viewvc?rev=587522&view=rev
Log:
Applied patch from HARMONY-4922
[drlvm][interpreter] Interpreter should be runtime switchable wrt compressed references


Modified:
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_defs.h
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_exports.cpp
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_em64t.cpp
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ia32.cpp
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ipf.cpp
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_stack_trace.cpp
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter.cpp
    harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter_ti.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_defs.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_defs.h?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_defs.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_defs.h Tue Oct 23 07:41:36 2007
@@ -79,7 +79,10 @@
 
 /** \def ASSERT_OBJECT(a)
   * \brief Checks the object.*/
-#define ASSERT_OBJECT(a) assert((a == 0) || ((*((a)->vt()->clss->get_class_handle()))->vt()->clss == VM_Global_State::loader_env->JavaLangClass_Class))
+#define ASSERT_OBJECT(a)                                       \
+    assert((a == 0) ||                                         \
+    ( (*((a)->vt()->clss->get_class_handle()))->vt()->clss ==  \
+            VM_Global_State::loader_env->JavaLangClass_Class))
 
 #ifndef INTERPRETER_USE_MALLOC_ALLOCATION
 /** \def ALLOC_FRAME(sz)
@@ -94,72 +97,74 @@
 #define FREE_FRAME(ptr) m_free(ptr)
 #endif
 
-/***** Compressed pointers on *****/
-#if defined _IPF_ || defined _EM64T_
-#define COMPRESS_MODE
+#if POINTER64
+#   define COMPACT_FIELDS
+#   define uword uint64
+#   define word int64
+#else
+#   define uword uint32
+#   define word int32
 #endif
 
-#if defined _IPF_ || defined _EM64T_
-#  define COMPACT_FIELDS
-#  define uword uint64
-#  define word int64
-#  ifdef COMPRESS_MODE
-#    define CREF COMPRESSED_REFERENCE
-#    define PTR32
-#  else
-#    define CREF ManagedObject*
-#  endif
+#if defined(POINTER64) && defined(REFS_USE_COMPRESSED)
+#define REF32                // Use compressed references
+typedef COMPRESSED_REFERENCE REF;
 #else
-// no define for: COMPACT_FIELDS
-/** The unsigned <code>int</code> value */
-#    define uword uint32
-/** The signed <code>int</code> value */
-#    define word int32
-/** The compressed reference */
-#    define CREF uint32
-#    define PTR32
+typedef ManagedObject* REF;  // Use uncompressed references
 #endif
 
-#ifdef COMPRESS_MODE
-/** \def COMPRESS_REF(ref)
-  * \brief Calls <code>compress_reference(ref)</code>.*/
-#define COMPRESS_REF(ref) compress_reference(ref)
-/** \def UNCOMPRESS_REF(cref)
-  * \brief Calls <code>uncompress_compressed_reference(cref)</code>.*/
-#define UNCOMPRESS_REF(cref) uncompress_compressed_reference(cref)
+#if defined(REF32) || !defined(POINTER64)
+#define VAL32 // Value is 32-bit
+#endif
 
-#else /* ! COMPRESS_MODE */
 
-/**
- * The fake compressed reference.
- * 
- * @param[in] obj - the object to compress
- * @return The compressed reference.
- */
-static inline CREF
-fake_compress_reference(ManagedObject *obj) {
-    return (CREF) obj;
-}
+// Create uncompressed value
+#define MAKEREFVAL(_val_)   (*((ManagedObject**)(&(_val_))))
+// Create compressed value
+#define MAKECRVAL(_val_)    (*((COMPRESSED_REFERENCE*)(&(_val_))))
+
+// Macros to compress/uncompress references in fiels and arrays
+// Note: VM references are references in heap and fields and arrays
+//       interpreter references are references in method stack and local vars
+#if defined(REFS_USE_COMPRESSED)
+// Both VM and interpreter references are compressed
+#define STORE_UREF_BY_ADDR(_addr_, _val_)                                    \
+    *((COMPRESSED_REFERENCE*)(_addr_)) = compress_reference(_val_)
+#define UNCOMPRESS_REF(cref) (uncompress_compressed_reference(MAKECRVAL(cref)))
+//----------------------
+#elif defined(REFS_USE_UNCOMPRESSED)
+// Both VM and interpreter references are uncompressed
+#define STORE_UREF_BY_ADDR(_addr_, _val_)                                    \
+    *((ManagedObject**)(_addr_)) = (ManagedObject*)(_val_)
+#define UNCOMPRESS_REF(cref) ((ManagedObject*)(cref))
+//----------------------
+#else // for REFS_USE_RUNTIME_SWITCH
+// interpreter refs are uncompressed; VM refs can be either
+#define STORE_UREF_BY_ADDR(_addr_, _val_)                                   \
+    if (REFS_IS_COMPRESSED_MODE) {                                          \
+        *((COMPRESSED_REFERENCE*)(_addr_)) = compress_reference(_val_);     \
+    } else {                                                                \
+        *((ManagedObject**)(_addr_)) = (ManagedObject*)(_val_);             \
+    }
+#define UNCOMPRESS_REF(cref)    ( REFS_IS_COMPRESSED_MODE ?                 \
+            (uncompress_compressed_reference(MAKECRVAL(cref))) :            \
+            (MAKEREFVAL(cref)))
+//----------------------
+#endif
 
-/**
- * Uncompresses the compressed reference.
- * 
- * @param[in] compressed_ref - the compressed reference
- * @return The uncompressed reference.
- */
-static inline ManagedObject*
-fake_uncompress_compressed_reference(CREF compressed_ref) {
-    return (ManagedObject*) compressed_ref;
-}
+// Macros for compressing/uncompressing referenceses in interpreter's
+// method stack and local vars
+#ifdef REF32
+#define COMPRESS_INTERP(ref)    (compress_reference(ref))
+#define UNCOMPRESS_INTERP(cref) (uncompress_compressed_reference(cref))
+#define REF_NULL                (MANAGED_NULL)
+#else // REF32
+#define COMPRESS_INTERP(ref)    ((ManagedObject*)(ref))
+#define UNCOMPRESS_INTERP(cref) ((ManagedObject*)(cref))
+#define REF_NULL                0
+#endif // REF32
 
-/** \def COMPRESS_REF(ref)
-  * \brief Calls <code>fake_compress_reference(ref)</code>.*/
-#define COMPRESS_REF(ref) fake_compress_reference(ref)
-/** \def UNCOMPRESS_REF(cref)
-  * \brief Calls <code>fake_uncompress_compressed_reference(cref)</code>.*/
-#define UNCOMPRESS_REF(cref) fake_uncompress_compressed_reference(cref)
 
-#endif
 
 /** Defines byte ordering in Value2 in different situations.*/
 
@@ -197,13 +202,13 @@
     int32 i;
 /** The float value.*/
     float f;
-/** The compressed reference.*/
-    CREF cr;
+///** Compressed/uncompressed reference.*/
+    REF ref;
 };
 
 /** Holds 64-bit values */
 union Value2 {
-#ifdef PTR32
+#ifdef VAL32
 /** Two 32-bit values */
     Value v[2];
 #else
@@ -215,6 +220,8 @@
     uint64 u64;
 /** The double value */
     double d;
+/** The reference */
+    ManagedObject* ref;
 };
 
 /** The local variable types.*/
@@ -361,7 +368,7 @@
 /** The storage for local variables of the executed Java method.*/
 class Locals {
     // local variable value
-    Value *var;
+    Value *vars;
     // references to the local variable type
     uint8 *refs;
     // locals size
@@ -689,8 +696,8 @@
 
 void
 Locals::init(void *ptr, uint32 size) {
-    var = (Value*) ptr;
-    refs = (uint8*)(var + size);
+    vars = (Value*) ptr;
+    refs = (uint8*)(vars + size);
     varNum = size;
     for(uint32 i = 0; i < varNum; i++) refs[i] = 0;
 }
@@ -703,12 +710,12 @@
 Value&
 Locals::operator () (uint32 id) {
     assert(id < varNum);
-    return var[id];
+    return vars[id];
 }
 
 void
 Locals::setLong(int idx, Value2 val) {
-#ifdef PTR32
+#ifdef VAL32
     operator() (idx+l0) = val.v[a0];
     operator() (idx+l1) = val.v[a1];
 #else
@@ -719,7 +726,7 @@
 Value2
 Locals::getLong(int idx) {
     Value2 val;
-#ifdef PTR32
+#ifdef VAL32
     val.v[a0] = operator() (idx+l0);
     val.v[a1] = operator() (idx+l1);
 #else
@@ -754,7 +761,7 @@
 
 void
 Stack::setLong(int idx, Value2 val) {
-#ifdef PTR32
+#ifdef VAL32
     pick(idx + s0) = val.v[a0];
     pick(idx + s1) = val.v[a1];
 #else
@@ -765,7 +772,7 @@
 Value2
 Stack::getLong(int idx) {
     Value2 val;
-#ifdef PTR32
+#ifdef VAL32
     val.v[a0] = pick(idx + s0);
     val.v[a1] = pick(idx + s1);
 #else

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_exports.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_exports.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_exports.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_exports.cpp Tue Oct 23 07:41:36 2007
@@ -141,10 +141,10 @@
 }
 
 EXPORT Boolean JIT_supports_compressed_references(JIT_Handle UNREF jh) {
-#if defined _IPF_ || defined _EM64T_
-    return true;
-#else
+#ifdef REFS_USE_UNCOMPRESSED
     return false;
+#else
+    return true;
 #endif
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_em64t.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_em64t.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_em64t.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_em64t.cpp Tue Oct 23 07:41:36 2007
@@ -326,17 +326,17 @@
             case JAVA_TYPE_ARRAY:
                 {
                     ASSERT_TAGS(prevFrame.stack.ref(pos));
-                    CREF& cr = prevFrame.stack.pick(pos--).cr;
-                    ASSERT_OBJECT(UNCOMPRESS_REF(cr));
-                    if (cr == 0) {
+                    REF& ref = prevFrame.stack.pick(pos--).ref;
+                    ASSERT_OBJECT(UNCOMPRESS_INTERP(ref));
+                    if (ref == 0) {
                         arg = 0;
                     } else {
-#ifdef COMPRESS_MODE
+#ifdef REF32
                         ObjectHandle new_handle = oh_allocate_local_handle();
-                        new_handle->object = UNCOMPRESS_REF(cr);
+                        new_handle->object = UNCOMPRESS_INTERP(ref);
                         arg = (uword) new_handle;
 #else
-                        arg = (uword) &cr;
+                        arg = (uword) &ref;
 #endif
                     }
                     if (n_ints != MAX_REG_INTS) {
@@ -459,9 +459,9 @@
                         << method->get_descriptor()->bytes <<
                         "\nVM WARNING: Not allowed, return NULL (0) instead\n");
                     }
-                    prevFrame.stack.pick().cr = COMPRESS_REF(*ref);
+                    prevFrame.stack.pick().ref = COMPRESS_INTERP(*ref);
                 } else {
-                    prevFrame.stack.pick().cr = 0;
+                    prevFrame.stack.pick().ref = 0;
                 }
                 prevFrame.stack.ref() = FLAG_OBJECT;
             }
@@ -615,17 +615,17 @@
             case JAVA_TYPE_ARRAY:
                 {
                     ASSERT_TAGS(prevFrame.stack.ref(pos));
-                    CREF& cr = prevFrame.stack.pick(pos--).cr;
-                    ASSERT_OBJECT(UNCOMPRESS_REF(cr));
-                    if (cr == 0) {
+                    REF& ref = prevFrame.stack.pick(pos--).ref;
+                    ASSERT_OBJECT(UNCOMPRESS_INTERP(ref));
+                    if (ref == 0) {
                         arg = 0;
                     } else {
-#ifdef COMPRESS_MODE
+#ifdef REF32
                         ObjectHandle new_handle = oh_allocate_local_handle();
-                        new_handle->object = UNCOMPRESS_REF(cr);
+                        new_handle->object = UNCOMPRESS_INTERP(ref);
                         arg = (uword) new_handle;
 #else
-                        arg = (uword) &cr;
+                        arg = (uword) &ref;
 #endif
                     }
                     if (n_ints != MAX_REG_INTS) {
@@ -745,9 +745,9 @@
                         << method->get_descriptor()->bytes <<
                         "\nVM WARNING: Not allowed, return NULL (0) instead\n");
                     }
-                    prevFrame.stack.pick().cr = COMPRESS_REF(*ref);
+                    prevFrame.stack.pick().ref = COMPRESS_INTERP(*ref);
                 } else {
-                    prevFrame.stack.pick().cr = 0;
+                    prevFrame.stack.pick().ref = 0;
                 }
                 prevFrame.stack.ref() = FLAG_OBJECT;
             }

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ia32.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ia32.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ia32.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ia32.cpp Tue Oct 23 07:41:36 2007
@@ -290,18 +290,12 @@
             case JAVA_TYPE_ARRAY:
                 {
                     ASSERT_TAGS(prevFrame.stack.ref(pos));
-                    CREF& cr = prevFrame.stack.pick(pos--).cr;
-                    ASSERT_OBJECT(UNCOMPRESS_REF(cr));
-                    if (cr == 0) {
+                    REF& ref = prevFrame.stack.pick(pos--).ref;
+                    ASSERT_OBJECT(ref);
+                    if (ref == 0) {
                         args[argId++] = 0;
                     } else {
-#ifdef COMPRESS_MODE
-                        ObjectHandle new_handle = oh_allocate_local_handle();
-                        new_handle->object = UNCOMPRESS_REF(cr);
-                        args[argId++] = (uword) new_handle;
-#else
-                        args[argId++] = (uword) &cr;
-#endif
+                        args[argId++] = (uword) &ref;
                     }
                     while(*mtype == '[') mtype++;
                     if (*mtype == 'L')
@@ -381,9 +375,9 @@
                         << method->get_descriptor()->bytes <<
                         "\nVM WARNING: Not allowed, return NULL (0) instead\n");
                     }
-                    prevFrame.stack.pick().cr = COMPRESS_REF(*ref);
+                    prevFrame.stack.pick().ref = *ref;
                 } else {
-                    prevFrame.stack.pick().cr = 0;
+                    prevFrame.stack.pick().ref = 0;
                 }
                 prevFrame.stack.ref() = FLAG_OBJECT;
             }
@@ -527,18 +521,12 @@
             case JAVA_TYPE_ARRAY:
                 {
                     ASSERT_TAGS(prevFrame.stack.ref(pos));
-                    CREF& cr = prevFrame.stack.pick(pos--).cr;
-                    ASSERT_OBJECT(UNCOMPRESS_REF(cr));
-                    if (cr == 0) {
+                    REF& ref = prevFrame.stack.pick(pos--).ref;
+                    ASSERT_OBJECT(ref);
+                    if (ref == 0) {
                         args[argId++] = 0;
                     } else {
-#ifdef COMPRESS_MODE
-                        ObjectHandle new_handle = oh_allocate_local_handle();
-                        new_handle->object = UNCOMPRESS_REF(cr);
-                        args[argId++] = (uword) new_handle;
-#else
-                        args[argId++] = (uword) &cr;
-#endif
+                        args[argId++] = (uword) &ref;
                     }
                     while(*mtype == '[') mtype++;
                     if (*mtype == 'L')
@@ -619,9 +607,9 @@
                         << method->get_descriptor()->bytes <<
                         "\nVM WARNING: Not allowed, return NULL (0) instead\n");
                     }
-                    prevFrame.stack.pick().cr = COMPRESS_REF(*ref);
+                    prevFrame.stack.pick().ref = *ref;
                 } else {
-                    prevFrame.stack.pick().cr = 0;
+                    prevFrame.stack.pick().ref = 0;
                 }
                 prevFrame.stack.ref() = FLAG_OBJECT;
             }

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ipf.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ipf.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ipf.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_native_ipf.cpp Tue Oct 23 07:41:36 2007
@@ -309,17 +309,17 @@
             case JAVA_TYPE_ARRAY:
                 {
                     ASSERT_TAGS(prevFrame.stack.ref(pos));
-                    CREF& cr = prevFrame.stack.pick(pos--).cr;
-                    ASSERT_OBJECT(UNCOMPRESS_REF(cr));
-                    if (cr == 0) {
+                    REF& ref = prevFrame.stack.pick(pos--).ref;
+                    ASSERT_OBJECT(UNCOMPRESS_INTERP(ref));
+                    if (ref == 0) {
                         args[argId++] = 0;
                     } else {
-#ifdef COMPRESS_MODE
+#ifdef REF32
                         ObjectHandle new_handle = oh_allocate_local_handle();
-                        new_handle->object = UNCOMPRESS_REF(cr);
+                        new_handle->object = UNCOMPRESS_INTERP(ref);
                         args[argId++] = (uword) new_handle;
 #else
-                        args[argId++] = (uword) &cr;
+                        args[argId++] = (uword) &ref;
 #endif
                     }
                     while(*mtype == '[') mtype++;
@@ -414,7 +414,7 @@
                 hythread_suspend_disable();
                 prevFrame.stack.popClearRef(sz);
 
-                CREF cr;
+                REF stack_ref;
                 prevFrame.stack.push();
                 if (ref != 0) {
                     ASSERT_OBJECT(*ref);
@@ -428,14 +428,14 @@
                         "\nVM WARNING: Not allowed, return NULL (0) instead\n");
                     }
                     if (*ref) {
-                        cr = COMPRESS_REF(*ref);
+                        stack_ref = COMPRESS_INTERP(*ref);
                     } else {
-                        cr = 0;
+                        stack_ref = 0;
                     }
                 } else {
-                    cr = 0;
+                    stack_ref = 0;
                 }
-                prevFrame.stack.pick().cr = cr;
+                prevFrame.stack.pick().ref = stack_ref;
                 prevFrame.stack.ref() = FLAG_OBJECT;
             }
             break;
@@ -583,17 +583,17 @@
             case JAVA_TYPE_ARRAY:
                 {
                     ASSERT_TAGS(prevFrame.stack.ref(pos));
-                    CREF& cr = prevFrame.stack.pick(pos--).cr;
-                    ASSERT_OBJECT(UNCOMPRESS_REF(cr));
-                    if (cr == 0) {
+                    REF& ref = prevFrame.stack.pick(pos--).ref;
+                    ASSERT_OBJECT(UNCOMPRESS_INTERP(ref));
+                    if (ref == 0) {
                         args[argId++] = 0;
                     } else {
-#ifdef COMPRESS_MODE
+#ifdef REF32
                         ObjectHandle new_handle = oh_allocate_local_handle();
-                        new_handle->object = UNCOMPRESS_REF(cr);
+                        new_handle->object = UNCOMPRESS_INTERP(ref);
                         args[argId++] = (uword) new_handle;
 #else
-                        args[argId++] = (uword) &cr;
+                        args[argId++] = (uword) &ref;
 #endif
                     }
                     while(*mtype == '[') mtype++;
@@ -688,7 +688,7 @@
                 hythread_suspend_disable();
                 prevFrame.stack.popClearRef(sz);
 
-                CREF cr;
+                REF stack_ref;
                 prevFrame.stack.push();
                 if (ref != 0) {
                     ASSERT_OBJECT(*ref);
@@ -703,14 +703,14 @@
 
                     }
                     if (*ref) {
-                        cr = COMPRESS_REF(*ref);
+                        stack_ref = COMPRESS_INTERP(*ref);
                     } else {
-                        cr = 0;
+                        stack_ref = 0;
                     }
                 } else {
-                    cr = 0;
+                    stack_ref = 0;
                 }
-                prevFrame.stack.pick().cr = cr;
+                prevFrame.stack.pick().ref = stack_ref;
                 prevFrame.stack.ref() = FLAG_OBJECT;
             }
             break;

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_stack_trace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_stack_trace.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_stack_trace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interp_stack_trace.cpp Tue Oct 23 07:41:36 2007
@@ -152,13 +152,14 @@
     interp_si_free(si);
 }
 
-#ifdef COMPRESS_MODE
+
+#if defined(REF32) // Compressed references; cref is COMPRESSED_REFERENCE
 #define vm_enumerate(cref,f) vm_enumerate_compressed_root_reference(cref,f)
-#else
-static inline void** m2v(CREF* obj) {
+#else // Uncompressed or runtime switchable; ref us uncompressed
+static inline void** m2v(REF* obj) {
     return (void**)obj;
 }
-#define vm_enumerate(cref,f) vm_enumerate_root_reference(m2v(cref),f)
+#define vm_enumerate(ref,f) vm_enumerate_root_reference(m2v(ref),f)
 #endif
 
 void
@@ -201,13 +202,13 @@
             for(i = 0; i <= si->stack.index; i++) {
                 if (si->stack.refs[i] == FLAG_OBJECT) {
                     DEBUG_GC("  Stack[" << i << "] ");
-                    CREF* cref = &si->stack.data[i].cr;
-                    ManagedObject *obj = UNCOMPRESS_REF(*cref);
+                    REF* ref = &si->stack.data[i].ref;
+                    ManagedObject *obj = UNCOMPRESS_INTERP(*ref);
                     if (obj == 0) {
                         DEBUG_GC("NULL");
                     } else {
                         DEBUG_GC(obj->vt()->clss->get_name()->bytes << endl);
-                        vm_enumerate(cref, FALSE);
+                        vm_enumerate(ref, FALSE); // CHECK!!! can we enumerate uncompressed ref in compressed mode
                     }
                 }
             }
@@ -217,13 +218,13 @@
             for(j = 0; j < si->locals.varNum; j++) {
                 if (si->locals.refs[j] == FLAG_OBJECT) {
                     DEBUG_GC("  Locals[" << j << "] ");
-                    CREF* cref = &si->locals.var[j].cr;
-                    ManagedObject *obj = UNCOMPRESS_REF(*cref);
+                    REF* ref = &si->locals.vars[j].ref;
+                    ManagedObject *obj = UNCOMPRESS_INTERP(*ref);
                     if (obj == 0) {
                         DEBUG_GC("NULL\n");
                     } else {
                         DEBUG_GC(obj->vt()->clss->get_name()->bytes << endl);
-                        vm_enumerate(cref, FALSE);
+                        vm_enumerate(ref, FALSE); // CHECK!!! can we enumerate uncompressed ref in compressed mode
                     }
                 }
             }
@@ -300,14 +301,14 @@
             for(i = 0; i <= si->stack.index; i++) {
                 if (si->stack.refs[i] == FLAG_OBJECT) {
                     DEBUG_GC("  Stack[" << i << "] ");
-                    CREF* cref = &si->stack.data[i].cr;
-                    ManagedObject *obj = UNCOMPRESS_REF(*cref);
+                    REF* ref = &si->stack.data[i].ref;
+                    ManagedObject *obj = UNCOMPRESS_INTERP(*ref);
                     if (obj == 0) {
                         DEBUG_GC("NULL");
                     } else {
                         DEBUG_GC(obj->vt()->clss->get_name()->bytes << endl);
                         vm_ti_enumerate_stack_root(ti_env,
-                            cref, (Managed_Object_Handle)obj, 
+                            ref, (Managed_Object_Handle)obj, 
                             JVMTI_HEAP_ROOT_STACK_LOCAL,
                             depth, method_id, slot++);
                     }
@@ -319,14 +320,14 @@
             for(j = 0; j < si->locals.varNum; j++) {
                 if (si->locals.refs[j] == FLAG_OBJECT) {
                     DEBUG_GC("  Locals[" << j << "] ");
-                    CREF* cref = &si->locals.var[j].cr;
-                    ManagedObject *obj = UNCOMPRESS_REF(*cref);
+                    REF* ref = &si->locals.vars[j].ref;
+                    ManagedObject *obj = UNCOMPRESS_INTERP(*ref);
                     if (obj == 0) {
                         DEBUG_GC("NULL\n");
                     } else {
                         DEBUG_GC(obj->vt()->clss->get_name()->bytes << endl);
                         vm_ti_enumerate_stack_root(ti_env,
-                            cref, (Managed_Object_Handle)obj, 
+                            ref, (Managed_Object_Handle)obj, 
                             JVMTI_HEAP_ROOT_STACK_LOCAL,
                             depth, method_id, slot++);
                     }

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter.cpp Tue Oct 23 07:41:36 2007
@@ -162,7 +162,7 @@
 static inline void
 Opcode_ACONST_NULL(StackFrame& frame) {
     frame.stack.push();
-    frame.stack.pick().u = 0;
+    frame.stack.pick().ref = 0;
     frame.stack.ref() = FLAG_OBJECT;
     frame.ip++;
 }
@@ -230,7 +230,7 @@
     frame.stack.push();
     frame.stack.pick() = val;
     frame.stack.ref() = frame.locals.ref(varId);
-    if (frame.locals.ref(varId) == FLAG_OBJECT) { ASSERT_OBJECT(UNCOMPRESS_REF(val.cr)); }
+    if (frame.locals.ref(varId) == FLAG_OBJECT) { ASSERT_OBJECT(UNCOMPRESS_INTERP(val.ref)); }
     DEBUG_BYTECODE("var" << (int)varId << " -> stack (val = " << (int)frame.stack.pick().i << ")");
     frame.ip += 2;
 }
@@ -988,12 +988,10 @@
 #endif
 
     frame.stack.push();
-    if(cp.is_string(index)) {
-        // FIXME: is string reference packed??
-        // possibly not
+    if(cp.is_string(index))
+    {
         String* str = cp.get_string(index);
-        // FIXME: only compressed references
-        frame.stack.pick().cr = COMPRESS_REF(vm_instantiate_cp_string_resolved(str));
+        frame.stack.pick().ref = COMPRESS_INTERP(vm_instantiate_cp_string_resolved(str));
         frame.stack.ref() = FLAG_OBJECT;
         return !check_current_thread_exception();
     } 
@@ -1005,7 +1003,7 @@
         }
         assert(!hythread_is_suspend_enabled());
         
-        frame.stack.pick().cr = COMPRESS_REF(*(other_class->get_class_handle()));
+        frame.stack.pick().ref = COMPRESS_INTERP(*(other_class->get_class_handle()));
         frame.stack.ref() = FLAG_OBJECT;
         
         return !exn_raised();
@@ -1093,8 +1091,7 @@
         return;
     }
    
-    // COMPRESS_REF will fail assertion if array == 0 on ipf 
-    frame.stack.pick().cr = COMPRESS_REF((ManagedObject*)array);
+    frame.stack.pick().ref = COMPRESS_INTERP((ManagedObject*)array);
     DEBUG_BYTECODE(" (val = " << hex << (int)frame.stack.pick().i << ")");
     frame.stack.ref() = FLAG_OBJECT;
     frame.ip += 2;
@@ -1127,8 +1124,7 @@
     set_vector_length(array, length);
     DEBUG_BYTECODE("length = " << dec << length);
 
-    // COMPRESS_REF will fail assertion if array == 0 on ipf 
-    frame.stack.pick().cr = COMPRESS_REF((ManagedObject*)array);
+    frame.stack.pick().ref = COMPRESS_INTERP((ManagedObject*)array);
     frame.stack.ref() = FLAG_OBJECT;
     frame.ip += 3;
 }
@@ -1156,7 +1152,7 @@
             if (d < max_depth) max_depth = d;
         }
 
-        frame.stack.pick(depth - 1 - d).cr = 0;
+        frame.stack.pick(depth - 1 - d).ref = 0;
         frame.stack.ref(depth - 1 - d) = FLAG_OBJECT;
     }
 
@@ -1175,7 +1171,7 @@
         return false;
     }
     set_vector_length(array, length[0]);
-    frame.stack.pick(depth - 1).cr = COMPRESS_REF(array);
+    frame.stack.pick(depth - 1).ref = COMPRESS_INTERP(array);
     if (max_depth == 0) return true;
 
     d = 1;
@@ -1190,15 +1186,17 @@
         set_vector_length(element, length[d]);
 
         if (d != max_depth) {
-            frame.stack.pick(depth - 1 - d).cr = COMPRESS_REF(element);
+            frame.stack.pick(depth - 1 - d).ref = COMPRESS_INTERP(element);
             d++;
             continue;
         }
 
         while(true) {
-            array = UNCOMPRESS_REF(frame.stack.pick((depth - 1) - (d - 1)).cr);
-            CREF* addr = (CREF*) get_vector_element_address_ref(array, pos[d-1]);
-            *addr = COMPRESS_REF(element);
+            array = UNCOMPRESS_INTERP(frame.stack.pick((depth - 1) - (d - 1)).ref);
+            // addr can be a pointer to either ManagedObject* or COMPRESSED_REFERENCE
+            ManagedObject** addr = get_vector_element_address_ref(array, pos[d-1]);
+
+            STORE_UREF_BY_ADDR(addr, element);
             pos[d-1]++;
 
             if (pos[d-1] < length[d-1]) {
@@ -1262,8 +1260,7 @@
    
     frame.stack.push();
 
-    // COMPRESS_REF will fail assertion if obj == 0 on ipf 
-    frame.stack.pick().cr = COMPRESS_REF((ManagedObject*)obj);
+    frame.stack.pick().ref = COMPRESS_INTERP(obj);
     DEBUG_BYTECODE(" (val = " << hex << (int)frame.stack.pick().i << ")");
     frame.stack.ref() = FLAG_OBJECT;
     frame.ip += 3;
@@ -1399,12 +1396,12 @@
 
 static inline void 
 Opcode_ARRAYLENGTH(StackFrame& frame) {
-    CREF cref = frame.stack.pick().cr;
-    if (cref == 0) {
+    REF st_ref = frame.stack.pick().ref;
+    if (st_ref == 0) {
         throwNPE();
         return;
     }
-    ManagedObject *ref = UNCOMPRESS_REF(cref);
+    ManagedObject *ref = UNCOMPRESS_INTERP(st_ref);
 
     frame.stack.ref() = FLAG_NONE;
     frame.stack.pick().i = get_vector_length((Vector_Handle)ref);
@@ -1414,12 +1411,12 @@
 
 static inline void
 Opcode_AALOAD(StackFrame& frame) {
-    CREF cref = frame.stack.pick(1).cr;
-    if (cref == 0) {
+    REF st_ref = frame.stack.pick(1).ref;
+    if (st_ref == 0) {
         throwNPE();
         return;
     }
-    Vector_Handle array = (Vector_Handle) UNCOMPRESS_REF(cref);
+    Vector_Handle array = (Vector_Handle) UNCOMPRESS_INTERP(st_ref);
     uint32 length = get_vector_length(array);
     uint32 pos = frame.stack.pick(0).u;
 
@@ -1432,21 +1429,25 @@
 
     frame.stack.pop();
 
-    CREF* addr = (CREF*) get_vector_element_address_ref(array, pos);
-    /* FIXME: assume compressed reference */
-    frame.stack.pick().cr = *addr;
+    // Array contains elements according to REFS_IS_COMPRESSED_MODE
+    // But even in compressed mode on 64-bit platform interpreter's
+    // stack can contain uncompressed references (according to REF32)
+    // So we'll convert references if needed
+    ManagedObject** pelem = get_vector_element_address_ref(array, pos);
+    ManagedObject* urefelem = UNCOMPRESS_REF(*pelem);
+    frame.stack.pick().ref = COMPRESS_INTERP(urefelem);
     frame.ip++;
 }
 
 #define DEF_OPCODE_XALOAD(CODE,arraytype,type,store)                            \
 static inline void                                                              \
 Opcode_ ## CODE(StackFrame& frame) {                                            \
-    CREF cref = frame.stack.pick(1).cr;                         \
-    if (cref == 0) {                                                            \
+    REF ref = frame.stack.pick(1).ref;                                          \
+    if (ref == 0) {                                                             \
         throwNPE();                                                             \
         return;                                                                 \
     }                                                                           \
-    Vector_Handle array = (Vector_Handle) UNCOMPRESS_REF(cref);                 \
+    Vector_Handle array = (Vector_Handle) UNCOMPRESS_INTERP(ref);               \
     uint32 length = get_vector_length(array);                                   \
     uint32 pos = frame.stack.pick(0).u;                                         \
                                                                                 \
@@ -1459,8 +1460,7 @@
                                                                                 \
     frame.stack.pop();                                                          \
                                                                                 \
-    type* addr = (type*) get_vector_element_address_ ## arraytype(array, pos);  \
-    /* FIXME: assume compressed reference */                                    \
+    type* addr = get_vector_element_address_ ## arraytype(array, pos);          \
     frame.stack.pick().store = *addr;                                           \
     frame.stack.ref() = FLAG_NONE;                                              \
     frame.ip++;                                                                 \
@@ -1474,12 +1474,12 @@
 
 static inline void
 Opcode_LALOAD(StackFrame& frame) {
-    CREF cref = frame.stack.pick(1).cr;
-    if (cref == 0) {
+    REF ref = frame.stack.pick(1).ref;
+    if (ref == 0) {
         throwNPE();
         return;
     }
-    Vector_Handle array = (Vector_Handle) UNCOMPRESS_REF(cref);
+    Vector_Handle array = (Vector_Handle) UNCOMPRESS_INTERP(ref);
     uint32 length = get_vector_length(array);
     uint32 pos = frame.stack.pick(0).u;
 
@@ -1499,12 +1499,12 @@
 
 static inline void
 Opcode_AASTORE(StackFrame& frame) {
-    CREF cref = frame.stack.pick(2).cr;
-    if (cref == 0) {
+    REF ref = frame.stack.pick(2).ref;
+    if (ref == 0) {
         throwNPE();
         return;
     }
-    Vector_Handle array = (Vector_Handle) UNCOMPRESS_REF(cref);
+    Vector_Handle array = (Vector_Handle) UNCOMPRESS_INTERP(ref);
     uint32 length = get_vector_length(array);
     uint32 pos = frame.stack.pick(1).u;
 
@@ -1515,19 +1515,22 @@
         return;
     }
 
-    // TODO: check ArrayStoreException
+    // Check ArrayStoreException
     ManagedObject *arrayObj = (ManagedObject*) array;
     Class *arrayClass = arrayObj->vt()->clss;
     Class *elementClass = arrayClass->get_array_element_class();
-    ManagedObject* obj = UNCOMPRESS_REF(frame.stack.pick().cr);
-    if (!(obj == 0 || vm_instanceof(obj, elementClass))) {
+    ManagedObject* obj = UNCOMPRESS_INTERP(frame.stack.pick().ref);
+    if (!obj == 0 && !vm_instanceof(obj, elementClass)) {
         interp_throw_exception("java/lang/ArrayStoreException");
         return;
     }
 
-    // FIXME: compressed refs only
-    CREF* addr = (CREF*) get_vector_element_address_ref(array, pos);
-    *addr = frame.stack.pick().cr;
+    // Array contains elements according to REFS_IS_COMPRESSED_MODE
+    // But even in compressed mode on 64-bit platform interpreter's
+    // stack can contain uncompressed references (according to REF32)
+    // So we'll convert references if needed
+    ManagedObject** pelem = get_vector_element_address_ref(array, pos);
+    STORE_UREF_BY_ADDR(pelem, obj);
     frame.stack.ref(2) = FLAG_NONE;
     frame.stack.ref(0) = FLAG_NONE;
     frame.stack.pop(3);
@@ -1537,12 +1540,12 @@
 #define DEF_OPCODE_IASTORE(CODE,arraytype,type,ldtype)                          \
 static inline void                                                              \
 Opcode_ ## CODE(StackFrame& frame) {                                            \
-    CREF cref = frame.stack.pick(2).cr;                         \
-    if (cref == 0) {                                                            \
+    REF ref = frame.stack.pick(2).ref;                                          \
+    if (ref == 0) {                                                             \
         throwNPE();                                                             \
         return;                                                                 \
     }                                                                           \
-    Vector_Handle array = (Vector_Handle) UNCOMPRESS_REF(cref);                 \
+    Vector_Handle array = (Vector_Handle) UNCOMPRESS_INTERP(ref);               \
     uint32 length = get_vector_length(array);                                   \
     uint32 pos = frame.stack.pick(1).u;                                         \
                                                                                 \
@@ -1577,12 +1580,12 @@
 
 static inline void
 Opcode_LASTORE(StackFrame& frame) {
-    CREF cref = frame.stack.pick(3).cr;
-    if (cref == 0) {
+    REF ref = frame.stack.pick(3).ref;
+    if (ref == 0) {
         throwNPE();
         return;
     }
-    Vector_Handle array = (Vector_Handle) UNCOMPRESS_REF(cref);
+    Vector_Handle array = (Vector_Handle) UNCOMPRESS_INTERP(ref);
     uint32 length = get_vector_length(array);
     uint32 pos = frame.stack.pick(2).u;
 
@@ -1678,11 +1681,13 @@
 
         case VM_DATA_TYPE_ARRAY:
         case VM_DATA_TYPE_CLASS:
-            frame.stack.ref() = FLAG_NONE;
-            *(CREF*)addr = frame.stack.pick().cr;
-            frame.stack.pop();
-            break;
-
+            {
+                ManagedObject* val = UNCOMPRESS_INTERP(frame.stack.pick().ref);
+                STORE_UREF_BY_ADDR(addr, val);
+                frame.stack.ref() = FLAG_NONE;
+                frame.stack.pop();
+                break;
+            }
         case VM_DATA_TYPE_INT64:
         case VM_DATA_TYPE_F8:
             {
@@ -1691,6 +1696,7 @@
                 frame.stack.pop(2);
                 break;
             }
+
         default:
             ABORT("Unexpected data type");
     }
@@ -1756,10 +1762,12 @@
             break;
         case VM_DATA_TYPE_ARRAY:
         case VM_DATA_TYPE_CLASS:
-            frame.stack.pick().cr = *(CREF*)addr;
-            frame.stack.ref() = FLAG_OBJECT;
-            break;
-            
+            {
+                ManagedObject* val = UNCOMPRESS_REF(*((ManagedObject**)addr));
+                frame.stack.pick().ref = COMPRESS_INTERP(val);
+                frame.stack.ref() = FLAG_OBJECT;
+                break;
+            }
         case VM_DATA_TYPE_INT64:
         case VM_DATA_TYPE_F8:
             {
@@ -1767,8 +1775,8 @@
                 val.d = *(double*)addr;
                 frame.stack.push();
                 frame.stack.setLong(0, val);
+                break;
             }
-            break;
 
         default:
             ABORT("Unexpected data type");
@@ -1802,138 +1810,84 @@
     DEBUG_BYTECODE(field->get_name()->bytes << " " << field->get_descriptor()->bytes
             << " (val = " << hex << (int)frame.stack.pick().i << ")");
 
+    uint16 obj_ref_pos = 1;
+
+    if (field->get_java_type() == VM_DATA_TYPE_INT64 ||
+        field->get_java_type() == VM_DATA_TYPE_F8)
+        ++obj_ref_pos;
+
+    REF ref = frame.stack.pick(obj_ref_pos).ref;
+
+    if (ref == 0) {
+        throwNPE();
+        return;
+    }
+
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
+    uint8* addr = ((uint8*)obj) + field->get_offset();
+
     switch (field->get_java_type()) {
 
 #ifdef COMPACT_FIELDS // use compact fields on ipf
         case VM_DATA_TYPE_BOOLEAN:
         case VM_DATA_TYPE_INT8:
-            {
-                uint32 val = frame.stack.pick(0).u;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                *(uint8*)addr = (uint8) val;
-                frame.stack.ref(1) = FLAG_NONE;
-                frame.stack.pop(2);
-                break;
-            }
+            *(uint8*)addr = (uint8)frame.stack.pick(0).u;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
 
         case VM_DATA_TYPE_CHAR:
         case VM_DATA_TYPE_INT16:
-            {
-                uint32 val = frame.stack.pick(0).u;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                *(uint16*)addr = (uint16) val;
-                frame.stack.ref(1) = FLAG_NONE;
-                frame.stack.pop(2);
-                break;
-            }
+            *(uint16*)addr = (uint16)frame.stack.pick(0).u;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
 
 #else // ia32 not using compact fields
         case VM_DATA_TYPE_BOOLEAN:
-            {
-                uint32 val = frame.stack.pick(0).u;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                *(uint32*)addr = (uint8) val;
-                frame.stack.ref(1) = FLAG_NONE;
-                frame.stack.pop(2);
-                break;
-            }
+            *(uint32*)addr = (uint8)frame.stack.pick(0).u;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
+
         case VM_DATA_TYPE_INT8:
-            {
-                int32 val = frame.stack.pick(0).i;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                *(int32*)addr = (int8) val;
-                frame.stack.ref(1) = FLAG_NONE;
-                frame.stack.pop(2);
-                break;
-            }
+            *(int32*)addr = (int8)frame.stack.pick(0).i;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
 
         case VM_DATA_TYPE_CHAR:
-            {
-                uint32 val = frame.stack.pick(0).u;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                *(uint32*)addr = (uint16) val;
-                frame.stack.ref(1) = FLAG_NONE;
-                frame.stack.pop(2);
-                break;
-            }
-        case VM_DATA_TYPE_INT16:
-            {
-                int32 val = frame.stack.pick(0).i;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                *(int32*)addr = (int16) val;
-                frame.stack.ref(1) = FLAG_NONE;
-                frame.stack.pop(2);
-                break;
-            }
+            *(uint32*)addr = (uint16)frame.stack.pick(0).u;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
 
+        case VM_DATA_TYPE_INT16:
+            *(int32*)addr = (int16)frame.stack.pick(0).i;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
 #endif
-        case VM_DATA_TYPE_ARRAY:
-        case VM_DATA_TYPE_CLASS:
         case VM_DATA_TYPE_INT32:
         case VM_DATA_TYPE_F4:
+            *(int32*)addr = frame.stack.pick(0).i;
+            frame.stack.ref(1) = FLAG_NONE;
+            frame.stack.pop(2);
+            break;
+
+        case VM_DATA_TYPE_ARRAY:
+        case VM_DATA_TYPE_CLASS:
             {
-                CREF val = frame.stack.pick(0).cr;
-                CREF cref = frame.stack.pick(1).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
-                // compressed references is uint32
-                *(CREF*)addr = val;
-                frame.stack.ref(1) = FLAG_NONE;
+                ManagedObject* val = UNCOMPRESS_INTERP(frame.stack.pick(0).ref);
+                STORE_UREF_BY_ADDR(addr, val);
                 frame.stack.ref(0) = FLAG_NONE;
+                frame.stack.ref(1) = FLAG_NONE;
                 frame.stack.pop(2);
                 break;
             }
-
         case VM_DATA_TYPE_INT64:
         case VM_DATA_TYPE_F8:
             {
-                CREF cref = frame.stack.pick(2).cr;
-                if (cref == 0) {
-                    throwNPE();
-                    return;
-                }
-                ManagedObject *obj = UNCOMPRESS_REF(cref);
-                uint8 *addr = ((uint8*)obj) + field->get_offset();
                 double *vaddr = (double*) addr;
                 *vaddr = frame.stack.getLong(0).d;
                 frame.stack.ref(2) = FLAG_NONE;
@@ -1963,12 +1917,12 @@
         M2N_FREE_MACRO;
     }
 
-    CREF cref = frame.stack.pick(0).cr;
-    if (cref == 0) {
+    REF ref = frame.stack.pick(0).ref;
+    if (ref == 0) {
         throwNPE();
         return;
     }
-    ManagedObject *obj = UNCOMPRESS_REF(cref);
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
     uint8 *addr = ((uint8*)obj) + field->get_offset();
     frame.stack.ref() = FLAG_NONE;
 
@@ -1976,51 +1930,42 @@
 
 #ifdef COMPACT_FIELDS // use compact fields on ipf
         case VM_DATA_TYPE_BOOLEAN:
-            {
-                frame.stack.pick(0).u = (uint32) *(uint8*)addr;
-                break;
-            }
+            frame.stack.pick(0).u = (uint32) *(uint8*)addr;
+            break;
+
         case VM_DATA_TYPE_INT8:
-            {
-                frame.stack.pick(0).i = (int32) *(int8*)addr;
-                break;
-            }
+            frame.stack.pick(0).i = (int32) *(int8*)addr;
+            break;
 
         case VM_DATA_TYPE_CHAR:
-            {
-                frame.stack.pick(0).u = (uint32) *(uint16*)addr;
-                break;
-            }
+            frame.stack.pick(0).u = (uint32) *(uint16*)addr;
+            break;
+
         case VM_DATA_TYPE_INT16:
-            {
-                frame.stack.pick(0).i = (int32) *(int16*)addr;
-                break;
-            }
+            frame.stack.pick(0).i = (int32) *(int16*)addr;
+            break;
+
 #else // ia32 - not using compact fields
         case VM_DATA_TYPE_BOOLEAN:
         case VM_DATA_TYPE_CHAR:
-                frame.stack.pick(0).u = *(uint32*)addr;
-                break;
+            frame.stack.pick(0).u = *(uint32*)addr;
+            break;
         case VM_DATA_TYPE_INT8:
         case VM_DATA_TYPE_INT16:
 #endif
-
         case VM_DATA_TYPE_INT32:
         case VM_DATA_TYPE_F4:
-            {
-                frame.stack.pick(0).i = *(int32*)addr;
-                break;
-            }
+            frame.stack.pick(0).i = *(int32*)addr;
+            break;
 
         case VM_DATA_TYPE_ARRAY:
         case VM_DATA_TYPE_CLASS:
             {
+                ManagedObject* val = UNCOMPRESS_REF(*((ManagedObject**)addr));
+                frame.stack.pick(0).ref = COMPRESS_INTERP(val);
                 frame.stack.ref() = FLAG_OBJECT;
-                frame.stack.pick(0).cr = *(CREF*)addr;
-                ASSERT_OBJECT(UNCOMPRESS_REF(frame.stack.pick(0).cr));
                 break;
             }
-
         case VM_DATA_TYPE_INT64:
         case VM_DATA_TYPE_F8:
             {
@@ -2231,7 +2176,7 @@
     
     DEBUG_BYTECODE("class = " << class_get_name(objClass));
 
-    ManagedObject *obj = UNCOMPRESS_REF(frame.stack.pick().cr);
+    ManagedObject *obj = UNCOMPRESS_INTERP(frame.stack.pick().ref);
 
     if (!(obj == 0 || vm_instanceof(obj, objClass))) {
         interp_throw_exception("java/lang/ClassCastException", obj->vt()->clss->get_java_name()->bytes);
@@ -2249,28 +2194,24 @@
     
     DEBUG_BYTECODE("class = " << class_get_name(objClass));
 
-    ManagedObject *obj = UNCOMPRESS_REF(frame.stack.pick().cr);
-
-#ifdef COMPRESS_MODE
+    ManagedObject *obj = UNCOMPRESS_INTERP(frame.stack.pick().ref);
     // FIXME ivan 20041027: vm_instanceof checks null pointers, it assumes
     // that null is Class::managed_null, but uncompress_compressed_reference
     // doesn't return managed_null for null compressed references
-    frame.stack.pick().u = (!(obj == 0)) && vm_instanceof(obj, objClass);
-#else
-    frame.stack.pick().u = vm_instanceof(obj, objClass);
-#endif
+    frame.stack.pick().u = (obj != 0) && vm_instanceof(obj, objClass);
+
     frame.stack.ref() = FLAG_NONE;
     frame.ip += 3;
 }
 
 static inline void
 Opcode_MONITORENTER(StackFrame& frame) {
-    CREF cr = frame.stack.pick().cr;
-    if (cr == 0) {
+    REF ref = frame.stack.pick().ref;
+    if (ref == 0) {
         throwNPE();
         return;
     }
-    frame.locked_monitors->monitor = UNCOMPRESS_REF(cr);
+    frame.locked_monitors->monitor = UNCOMPRESS_INTERP(ref);
 
     M2N_ALLOC_MACRO;
     vm_monitor_enter_wrapper(frame.locked_monitors->monitor);
@@ -2285,13 +2226,13 @@
 
 static inline void
 Opcode_MONITOREXIT(StackFrame& frame) {
-    CREF cr = frame.stack.pick().cr;
-    if (cr == 0) {
+    REF ref = frame.stack.pick().ref;
+    if (ref == 0) {
         throwNPE();
         return;
     }
     M2N_ALLOC_MACRO;
-    vm_monitor_exit_wrapper(UNCOMPRESS_REF(cr));
+    vm_monitor_exit_wrapper(UNCOMPRESS_INTERP(ref));
     M2N_FREE_MACRO;
 
     if (check_current_thread_exception())
@@ -2310,8 +2251,8 @@
 
 static inline void
 Opcode_ATHROW(StackFrame& frame) {
-    CREF cr = frame.stack.pick().cr;
-    ManagedObject *obj = UNCOMPRESS_REF(cr);
+    REF ref = frame.stack.pick().ref;
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
     if (obj == NULL) {
         throwNPE();
         return;
@@ -2538,7 +2479,7 @@
         case JAVA_TYPE_ARRAY:
         case JAVA_TYPE_STRING:
             h = oh_allocate_local_handle();
-            h->object = (ManagedObject*) UNCOMPRESS_REF(frame.stack.pick().cr);
+            h->object = UNCOMPRESS_INTERP(frame.stack.pick().ref);
             val.l = (jobject) h;
             break;
 
@@ -2620,7 +2561,7 @@
         if (frame.method->is_static()) {
             ml->monitor = *(frame.method->get_class()->get_class_handle());
         } else {
-            ml->monitor = UNCOMPRESS_REF(frame.locals(0).cr);
+            ml->monitor = UNCOMPRESS_INTERP(frame.locals(0).ref);
         }
         vm_monitor_enter_wrapper(ml->monitor);
     }
@@ -3088,7 +3029,7 @@
         if (processExceptionHandler(frame, &frame.exc)) {
             frame.stack.clear();
             frame.stack.push();
-            frame.stack.pick().cr = COMPRESS_REF(frame.exc);
+            frame.stack.pick().ref = COMPRESS_INTERP(frame.exc);
             frame.stack.ref() = FLAG_OBJECT;
             frame.exc = NULL;
             
@@ -3167,14 +3108,13 @@
 
     if(!method->is_static()) {
         frame.locals.ref(pos) = FLAG_OBJECT;
-        // COMPRESS_REF will fail assertion if obj == 0 on ipf
-        CREF cr = 0;
+        REF ref = 0;
         ObjectHandle h = (ObjectHandle) args[arg++].l;
         if (h) {
-            cr = COMPRESS_REF(h->object);
+            ref = COMPRESS_INTERP(h->object);
             frame.This = h->object;
         }
-        frame.locals(pos++).cr = cr;
+        frame.locals(pos++).ref = ref;
     }
 
     Arg_List_Iterator iter = method->get_argument_list();
@@ -3195,21 +3135,14 @@
             break;
         case JAVA_TYPE_CLASS:
         case JAVA_TYPE_ARRAY:
-            h = (ObjectHandle) args[arg++].l;
-#ifdef COMPRESS_MODE
-#ifdef REFS_USE_RUNTIME_SWITCH
-            assert(VM_Global_State::loader_env->compress_references);
-#endif // REFS_USE_RUNTIME_SWITCH
-#endif
-            CREF cref;
-            if (h == NULL) {
-                cref = 0;
-            } else {
-                cref = COMPRESS_REF(h->object);
-            }
-            frame.locals.ref(pos) = FLAG_OBJECT;
-            frame.locals(pos++).cr = cref;
-            ASSERT_OBJECT(UNCOMPRESS_REF(cref));
+            {
+                h = (ObjectHandle) args[arg++].l;
+
+                REF ref = (h == NULL) ? 0 : COMPRESS_INTERP(h->object);
+                frame.locals.ref(pos) = FLAG_OBJECT;
+                frame.locals(pos++).ref = ref;
+                ASSERT_OBJECT(UNCOMPRESS_INTERP(ref));
+            }
             break;
         case JAVA_TYPE_FLOAT:
             frame.locals(pos++).f = args[arg++].f;
@@ -3290,11 +3223,11 @@
         case JAVA_TYPE_STRING:
          
             { 
-                ASSERT_OBJECT(UNCOMPRESS_REF(frame.stack.pick().cr));
+                ASSERT_OBJECT(UNCOMPRESS_INTERP(frame.stack.pick().ref));
                 ObjectHandle h = 0; 
-                if (frame.stack.pick().cr) {
+                if (frame.stack.pick().ref) {
                     h = oh_allocate_local_handle();
-                    h->object = UNCOMPRESS_REF(frame.stack.pick().cr);
+                    h->object = UNCOMPRESS_INTERP(frame.stack.pick().ref);
                 } 
                 resultPtr->l = h;
             }
@@ -3490,14 +3423,14 @@
 interpreterInvokeVirtual(StackFrame& prevFrame, Method *method) {
 
     int args = method->get_num_arg_slots();
-    CREF cr = prevFrame.stack.pick(args-1).cr;
+    REF ref = prevFrame.stack.pick(args-1).ref;
 
-    if (cr == 0) {
+    if (ref == 0) {
         throwNPE();
         return;
     }
 
-    ManagedObject *obj = UNCOMPRESS_REF(cr);
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
     ASSERT_OBJECT(obj);
 
     Class *objClass = obj->vt()->clss;
@@ -3524,14 +3457,14 @@
 interpreterInvokeInterface(StackFrame& prevFrame, Method *method) {
 
     int args = method->get_num_arg_slots();
-    CREF cr = prevFrame.stack.pick(args-1).cr;
+    REF ref = prevFrame.stack.pick(args-1).ref;
 
-    if (cr == 0) {
+    if (ref == 0) {
         throwNPE();
         return;
     }
 
-    ManagedObject *obj = UNCOMPRESS_REF(cr);
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
     ASSERT_OBJECT(obj);
 
     if (!vm_instanceof(obj, method->get_class())) {
@@ -3580,9 +3513,9 @@
 interpreterInvokeSpecial(StackFrame& prevFrame, Method *method) {
 
     int args = method->get_num_arg_slots();
-    CREF cr = prevFrame.stack.pick(args-1).cr;
+    REF ref = prevFrame.stack.pick(args-1).ref;
 
-    if (cr == 0) {
+    if (ref == 0) {
         throwNPE();
         return;
     }
@@ -3595,7 +3528,7 @@
         return;
     }
 
-    ManagedObject *obj = UNCOMPRESS_REF(cr);
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
 
     StackFrame frame;
     memset(&frame, 0, sizeof(frame));

Modified: harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter_ti.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter_ti.cpp?rev=587522&r1=587521&r2=587522&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter_ti.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/interpreter/src/interpreter_ti.cpp Tue Oct 23 07:41:36 2007
@@ -177,7 +177,7 @@
 
     assert(hythread_is_suspend_enabled());
     hythread_suspend_disable();
-    ManagedObject *obj = UNCOMPRESS_REF(frame->locals(slot).cr);
+    ManagedObject *obj = UNCOMPRESS_INTERP(frame->locals(slot).ref);
     if (NULL == obj) {
         *value_ptr = NULL;
     } else {
@@ -263,7 +263,7 @@
     }
 
     ObjectHandle handle = (ObjectHandle) value;
-    frame->locals(slot).cr = COMPRESS_REF(handle->object);
+    frame->locals(slot).ref = COMPRESS_INTERP(handle->object);
     return JVMTI_ERROR_NONE;
 }
 
@@ -568,8 +568,8 @@
 void getfield_callback(Field *field, StackFrame& frame) {
     if (!field_event_mask(field, false)) return;
 
-    CREF cref = frame.stack.pick(0).cr;
-    ManagedObject *obj = UNCOMPRESS_REF(cref);
+    REF ref = frame.stack.pick(0).ref;
+    ManagedObject *obj = UNCOMPRESS_INTERP(ref);
     field_access_callback(field, frame, obj);
 }
 
@@ -595,7 +595,7 @@
         case VM_DATA_TYPE_CLASS:
         {
             ObjectHandle h = oh_allocate_local_handle();
-            h->object = UNCOMPRESS_REF(frame.stack.pick().cr);
+            h->object = UNCOMPRESS_INTERP(frame.stack.pick().ref);
             val.l = h;
         }
             break;
@@ -618,17 +618,17 @@
     if (!field_event_mask(field, true)) return;
 
     Java_Type type = field->get_java_type();
-    CREF cref;
+    REF ref;
 
     if (type == VM_DATA_TYPE_INT64 || type == VM_DATA_TYPE_F8) {
-        cref = frame.stack.pick(2).cr;
+        ref = frame.stack.pick(2).ref;
     } else {
-        cref = frame.stack.pick(1).cr;
+        ref = frame.stack.pick(1).ref;
     }
 
     M2N_ALLOC_MACRO;
     jvalue val = new_field_value(field, frame);
-    field_modification_callback(field, frame, UNCOMPRESS_REF(cref), val);
+    field_modification_callback(field, frame, UNCOMPRESS_INTERP(ref), val);
     M2N_FREE_MACRO;
 }