diff options
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/lang/Class.h | 6 | ||||
-rw-r--r-- | libjava/java/lang/natClassLoader.cc | 23 |
2 files changed, 19 insertions, 10 deletions
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 0e5066f..aafd00c 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -40,8 +40,8 @@ extern "Java" // We declare these here to avoid including gcj/cni.h. extern "C" void _Jv_InitClass (jclass klass); extern "C" jclass _Jv_NewClassFromInitializer - (const jclass class_initializer); -extern "C" void _Jv_RegisterNewClasses (void **classes); + (const char *class_initializer); +extern "C" void _Jv_RegisterNewClasses (char **classes); extern "C" void _Jv_RegisterClasses (const jclass *classes); extern "C" void _Jv_RegisterClasses_Counted (const jclass *classes, size_t count); @@ -447,7 +447,7 @@ private: int method_idx); friend void ::_Jv_InitClass (jclass klass); - friend java::lang::Class* ::_Jv_NewClassFromInitializer (const jclass class_initializer); + friend java::lang::Class* ::_Jv_NewClassFromInitializer (const char *class_initializer); friend void _Jv_RegisterNewClasses (void **classes); friend _Jv_Method* ::_Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *, diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 6b3c3ef..b05c0b1 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -218,11 +218,20 @@ _Jv_RegisterClasses_Counted (const jclass * classes, size_t count) // Create a class on the heap from an initializer struct. jclass -_Jv_NewClassFromInitializer (const jclass class_initializer) +_Jv_NewClassFromInitializer (const char *class_initializer) { - jclass new_class = (jclass)_Jv_AllocObj (sizeof *new_class, - &java::lang::Class::class$); - memcpy ((void*)new_class, (void*)class_initializer, sizeof *new_class); + /* We create an instance of java::lang::Class and copy all of its + fields except the first word (the vtable pointer) from + CLASS_INITIALIZER. This first word is pre-initialized by + _Jv_AllocObj, and we don't want to overwrite it. */ + + jclass new_class + = (jclass)_Jv_AllocObj (sizeof (java::lang::Class), + &java::lang::Class::class$); + const char *src = class_initializer + sizeof (void*); + char *dst = (char*)new_class + sizeof (void*); + size_t len = sizeof (*new_class) - sizeof (void*); + memcpy (dst, src, len); new_class->engine = &_Jv_soleIndirectCompiledEngine; @@ -240,13 +249,13 @@ _Jv_NewClassFromInitializer (const jclass class_initializer) // heap) and we write the address of the new class into the address // pointed to by the second word. void -_Jv_RegisterNewClasses (void **classes) +_Jv_RegisterNewClasses (char **classes) { _Jv_InitGC (); - jclass initializer; + const char *initializer; - while ((initializer = (jclass)*classes++)) + while ((initializer = *classes++)) { jclass *class_ptr = (jclass *)*classes++; *class_ptr = _Jv_NewClassFromInitializer (initializer); |