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*/
{
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",
if (clazz->super != NULL)
fieldOffset = clazz->super->objectSize;
else
- fieldOffset = offsetof(DataObject, instanceData);
+ fieldOffset = OFFSETOF_MEMBER(DataObject, instanceData);
LOGVV("--- computeFieldOffsets '%s'\n", clazz->descriptor);
/*
* 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];
};
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;
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;
}
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;
}
}