From e5e80d40d79599acccc7da72bf71ffacd7ac082b Mon Sep 17 00:00:00 2001 From: aph Date: Fri, 16 Jun 2006 08:56:29 +0000 Subject: 2006-06-16 Andrew Haley * class.c (make_class_data): When using flag_indirect_classes, don't initialize the vtable of Class instances. 2006-06-16 Andrew Haley * java/lang/natClassLoader.cc (_Jv_NewClassFromInitializer): Don't copy the whole Class instance from the initializer: instead, copy everything but the first word (the vtable pointer). Change prototype to (const char* class_initializer). (_Jv_RegisterNewClasses): Change prototype to (const char**). * java/lang/Class.h (_Jv_RegisterNewClasses): Change prototype to (const char**). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114714 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/java/lang/natClassLoader.cc | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'libjava/java/lang/natClassLoader.cc') diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 6b3c3ef9cd5..b05c0b1045b 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); -- cgit v1.2.3