diff options
author | Andrew Haley <aph@redhat.com> | 2006-03-07 18:45:35 +0000 |
---|---|---|
committer | Andrew Haley <aph@redhat.com> | 2006-03-07 18:45:35 +0000 |
commit | 31a0836f762adfae821e50d6b6a9f51e85416e1d (patch) | |
tree | e17b852baa6559968c298bfe32df462153d63116 | |
parent | cb0e335406b63bbe1176a4cf0f7681de795c0a88 (diff) |
2006-03-07 Andrew Haley <aph@redhat.com>
* java/lang/natClassLoader.cc (_Jv_NewClassFromInitializer): Don't
allocate constant pool or static fields here.
* link.cc (resolve_pool_entry): Allocate constant pool here.
(wait_for_state): Allocate static fields here.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcj/gcj-abi-experimental-branch@111817 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libjava/ChangeLog | 7 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natSharedLibLoader.cc | 6 | ||||
-rw-r--r-- | libjava/java/lang/natClassLoader.cc | 26 | ||||
-rw-r--r-- | libjava/link.cc | 36 |
4 files changed, 47 insertions, 28 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6d6c7dcaf2f..db2783ecde6 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,12 @@ 2006-03-07 Andrew Haley <aph@redhat.com> + * java/lang/natClassLoader.cc (_Jv_NewClassFromInitializer): Don't + allocate constant pool or static fields here. + * link.cc (resolve_pool_entry): Allocate constant pool here. + (wait_for_state): Allocate static fields here. + +2006-03-07 Andrew Haley <aph@redhat.com> + * include/execution.h (do_allocate_static_fields): Allocate the static fields. * java/lang/Class.h (_Jv_NewClassFromInitializer): Declare diff --git a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc index 4970240019e..ece6cad0f31 100644 --- a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc +++ b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc @@ -36,7 +36,7 @@ _Jv_GC_has_static_roots (struct dl_phdr_info * info, size_t size, void *ptr) static const char suffix[] = "libgcj.so.7"; const char *name = info->dlpi_name; - fprintf (stderr, "%p: lib %s ", ptr, name); +// fprintf (stderr, "%p: lib %s ", ptr, name); if (strlen (name) <= strlen (suffix)) goto defaul; @@ -45,12 +45,12 @@ _Jv_GC_has_static_roots (struct dl_phdr_info * info, size_t size, void *ptr) if (strcmp (name + strlen (name) - strlen (suffix), suffix) == 0) { - fprintf (stderr, "registered\n"); +// fprintf (stderr, "registered\n"); return 1; } defaul: - fprintf (stderr, "not registered\n"); +// fprintf (stderr, "not registered\n"); return 0; } diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index b82096cd979..09536c2d1a0 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -193,35 +193,11 @@ _Jv_NewClassFromInitializer (const jclass class_initializer) memcpy ((void*)new_class, (void*)class_initializer, sizeof *new_class); if (_Jv_CheckABIVersion ((unsigned long) new_class->next_or_version)) - { - jsize count = new_class->field_count; - if (count) - { - new_class->fields - = (_Jv_Field*) _Jv_AllocRawObj (count * sizeof (_Jv_Field)); - memcpy ((void*)new_class->fields, - (void*)class_initializer->fields, - count * sizeof (_Jv_Field)); - } - - count = new_class->constants.size; - if (count) - { - new_class->constants.data - = (_Jv_word*) _Jv_AllocRawObj (count * sizeof (_Jv_word)); - memcpy ((void*)new_class->constants.data, - (void*)class_initializer->constants.data, - count * sizeof (_Jv_word)); - } - - (*_Jv_RegisterClassHook) (new_class); - } + (*_Jv_RegisterClassHook) (new_class); return new_class; } - - void _Jv_RegisterClassHookDefault (jclass klass) { diff --git a/libjava/link.cc b/libjava/link.cc index 481f98a138b..e54d958fb83 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -17,6 +17,12 @@ details. */ #include <java-interp.h> +// Set GC_DEBUG before including gc.h! +#ifdef LIBGCJ_GC_DEBUG +# define GC_DEBUG +#endif +#include <gc.h> + #include <jvm.h> #include <gcj/cni.h> #include <string.h> @@ -261,6 +267,21 @@ _Jv_Linker::resolve_pool_entry (jclass klass, int index, bool lazy) { using namespace java::lang::reflect; + if (GC_base (klass) && klass->constants.data + && ! GC_base (klass->constants.data)) + { + jsize count = klass->constants.size; + if (count) + { + _Jv_word* constants + = (_Jv_word*) _Jv_AllocRawObj (count * sizeof (_Jv_word)); + memcpy ((void*)constants, + (void*)klass->constants.data, + count * sizeof (_Jv_word)); + klass->constants.data = constants; + } + } + _Jv_Constants *pool = &klass->constants; if ((pool->tags[index] & JV_CONSTANT_ResolvedFlag) != 0) @@ -1877,6 +1898,21 @@ _Jv_Linker::wait_for_state (jclass klass, int state) java::lang::Thread *save = klass->thread; klass->thread = self; + // Allocate memory for static fields and constants. + if (GC_base (klass) && klass->fields && ! GC_base (klass->fields)) + { + jsize count = klass->field_count; + if (count) + { + _Jv_Field* fields + = (_Jv_Field*) _Jv_AllocRawObj (count * sizeof (_Jv_Field)); + memcpy ((void*)fields, + (void*)klass->fields, + count * sizeof (_Jv_Field)); + klass->fields = fields; + } + } + // Print some debugging info if requested. Interpreted classes are // handled in defineclass, so we only need to handle the two // pre-compiled cases here. |