OSDN Git Service

Establish a subclass relationship between DataObject and Object.
authorCarl Shapiro <cshapiro@google.com>
Tue, 3 May 2011 03:01:42 +0000 (20:01 -0700)
committerCarl Shapiro <cshapiro@google.com>
Tue, 3 May 2011 03:05:50 +0000 (20:05 -0700)
Change-Id: Ifd0e364f7789d9e13f769f8d6a65c3c573915fd3

vm/Common.h
vm/interp/Stack.cpp
vm/oo/Class.cpp
vm/oo/Object.h
vm/reflect/Reflect.cpp

index aacbbbd..8e73cd0 100644 (file)
@@ -102,6 +102,11 @@ union JValue {
     Object* l;
 };
 
+#define OFFSETOF_MEMBER(t, f)         \
+  (reinterpret_cast<char*>(           \
+     &reinterpret_cast<t*>(16)->f) -  \
+   reinterpret_cast<char*>(16))
+
 #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
 
 #endif /*_DALVIK_COMMON*/
index 23d8049..c65a78e 100644 (file)
@@ -638,7 +638,7 @@ static void throwArgumentTypeMismatch(int argIndex, ClassObject* expected,
 {
     char* expectedClassName = dvmHumanReadableDescriptor(expected->descriptor);
     char* actualClassName = (arg != NULL)
-        ? dvmHumanReadableDescriptor(arg->obj.clazz->descriptor)
+        ? dvmHumanReadableDescriptor(arg->clazz->descriptor)
         : strdup("null");
     dvmThrowExceptionFmt(gDvm.exIllegalArgumentException,
         "argument %d should have type %s, got %s",
index 4c2c300..cfb1050 100644 (file)
@@ -3553,7 +3553,7 @@ static bool computeFieldOffsets(ClassObject* clazz)
     if (clazz->super != NULL)
         fieldOffset = clazz->super->objectSize;
     else
-        fieldOffset = offsetof(DataObject, instanceData);
+        fieldOffset = OFFSETOF_MEMBER(DataObject, instanceData);
 
     LOGVV("--- computeFieldOffsets '%s'\n", clazz->descriptor);
 
index abc819a..ef232d4 100644 (file)
@@ -226,9 +226,7 @@ struct Object {
 /*
  * Data objects have an Object header followed by their instance data.
  */
-struct DataObject {
-    Object          obj;                /* MUST be first item */
-
+struct DataObject : Object {
     /* variable #of u4 slots; u8 uses 2 slots */
     u4              instanceData[1];
 };
index e9c27f1..3fd46e6 100644 (file)
@@ -844,12 +844,11 @@ ArrayObject* dvmGetInterfaces(ClassObject* clazz)
 static PrimitiveType getBoxedType(DataObject* arg)
 {
     static const int kJavaLangLen = 11;     // strlen("Ljava/lang/")
-    const char* name;
 
     if (arg == NULL)
         return PRIM_NOT;
 
-    name = arg->obj.clazz->descriptor;
+    const char* name = arg->clazz->descriptor;
 
     if (strncmp(name, "Ljava/lang/", kJavaLangLen) != 0)
         return PRIM_NOT;
@@ -1015,7 +1014,7 @@ int dvmConvertArgument(DataObject* arg, ClassObject* type, s4* destPtr)
         srcType = getBoxedType(arg);
         if (srcType == PRIM_NOT) {     // didn't pass a boxed primitive in
             LOGVV("conv arg: type '%s' not boxed primitive\n",
-                arg->obj.clazz->descriptor);
+                arg->clazz->descriptor);
             return -1;
         }
 
@@ -1026,12 +1025,12 @@ int dvmConvertArgument(DataObject* arg, ClassObject* type, s4* destPtr)
                     valuePtr, destPtr);
     } else {
         /* verify object is compatible */
-        if ((arg == NULL) || dvmInstanceof(arg->obj.clazz, type)) {
+        if ((arg == NULL) || dvmInstanceof(arg->clazz, type)) {
             *destPtr = (s4) arg;
             retVal = 1;
         } else {
             LOGVV("Arg %p (%s) not compatible with %s\n",
-                arg, arg->obj.clazz->descriptor, type->descriptor);
+                arg, arg->clazz->descriptor, type->descriptor);
             retVal = -1;
         }
     }