aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-03-07 18:45:35 +0000
committerAndrew Haley <aph@redhat.com>2006-03-07 18:45:35 +0000
commit31a0836f762adfae821e50d6b6a9f51e85416e1d (patch)
treee17b852baa6559968c298bfe32df462153d63116
parentcb0e335406b63bbe1176a4cf0f7681de795c0a88 (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/ChangeLog7
-rw-r--r--libjava/gnu/gcj/runtime/natSharedLibLoader.cc6
-rw-r--r--libjava/java/lang/natClassLoader.cc26
-rw-r--r--libjava/link.cc36
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.