summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorjsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4>2002-12-23 19:59:31 +0000
committerjsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4>2002-12-23 19:59:31 +0000
commitc1dccbcc1603c23acc4b6a13efd7a12d007588f9 (patch)
treea094b01d9cbc1da5277a2f87e776b7fb146d7e2f /libjava
parentdeff3a7fa78048cc09415ce94a8170935730bda2 (diff)
downloadgcc-c1dccbcc1603c23acc4b6a13efd7a12d007588f9.tar.gz
* exception.cc (PERSONALITY_FUNCTION): Clear least-significant-bit
of catch_type. * java/lang/natClass.cc (initializeClass): Link vtable, otable, idt tables after initializing superclass. * java/lang/natClassLoader.cc (uaddr): New typedef. (_Jv_PrepareCompiledClass): Resolve superclass, interfaces if they are constant pool indicies. Don't link vtable, otable yet. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60450 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog10
-rw-r--r--libjava/exception.cc2
-rw-r--r--libjava/java/lang/natClass.cc11
-rw-r--r--libjava/java/lang/natClassLoader.cc28
4 files changed, 40 insertions, 11 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 4cd1b0c42b6..2044fc49694 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,13 @@
+2002-12-23 Jeff Sturm <jsturm@one-point.com>
+
+ * exception.cc (PERSONALITY_FUNCTION): Clear least-significant-bit
+ of catch_type.
+ * java/lang/natClass.cc (initializeClass): Link vtable, otable,
+ idt tables after initializing superclass.
+ * java/lang/natClassLoader.cc (uaddr): New typedef.
+ (_Jv_PrepareCompiledClass): Resolve superclass, interfaces
+ if they are constant pool indicies. Don't link vtable, otable yet.
+
2002-12-21 Anthony Green <green@redhat.com>
* Makefile.am: Move org.xml.sax and org.w3c.dom into their own
diff --git a/libjava/exception.cc b/libjava/exception.cc
index 917d6e10a76..d983f98f8fa 100644
--- a/libjava/exception.cc
+++ b/libjava/exception.cc
@@ -338,7 +338,7 @@ PERSONALITY_FUNCTION (int version,
// The catch_type is either a (java::lang::Class*) or
// is one more than a (Utf8Const*).
if ((size_t)catch_type & 1)
- catch_type = _Jv_FindClass ((Utf8Const*)catch_type - 1, NULL);
+ catch_type = _Jv_FindClass ((Utf8Const*)((size_t)catch_type ^ 1), NULL);
if (_Jv_IsInstanceOf (xh->value, catch_type))
{
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index 768ced611ac..0960649e71c 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -758,9 +758,6 @@ java::lang::Class::initializeClass (void)
}
}
- if (state <= JV_STATE_LINKED)
- _Jv_PrepareConstantTimeTables (this);
-
// Step 2.
java::lang::Thread *self = java::lang::Thread::currentThread();
// FIXME: `self' can be null at startup. Hence this nasty trick.
@@ -805,6 +802,14 @@ java::lang::Class::initializeClass (void)
}
}
+ _Jv_PrepareConstantTimeTables (this);
+
+ if (vtable == NULL)
+ _Jv_MakeVTable(this);
+
+ if (otable != NULL && otable->state == 0)
+ _Jv_LinkOffsetTable(this);
+
// Steps 8, 9, 10, 11.
try
{
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc
index 96a81812219..176f16a7343 100644
--- a/libjava/java/lang/natClassLoader.cc
+++ b/libjava/java/lang/natClassLoader.cc
@@ -178,6 +178,8 @@ java::lang::VMClassLoader::getPrimitiveClass (jchar type)
return _Jv_FindClassFromSignature (sig, NULL);
}
+typedef unsigned int uaddr __attribute__ ((mode (pointer)));
+
/** This function does class-preparation for compiled classes.
NOTE: It contains replicated functionality from
_Jv_ResolvePoolEntry, and this is intentional, since that function
@@ -193,6 +195,9 @@ _Jv_PrepareCompiledClass (jclass klass)
klass->state = JV_STATE_LINKED;
_Jv_Constants *pool = &klass->constants;
+
+ // Resolve class constants first, since other constant pool
+ // entries may rely on these.
for (int index = 1; index < pool->size; ++index)
{
if (pool->tags[index] == JV_CONSTANT_Class)
@@ -215,7 +220,22 @@ _Jv_PrepareCompiledClass (jclass klass)
pool->data[index].clazz = found;
pool->tags[index] |= JV_CONSTANT_ResolvedFlag;
}
- else if (pool->tags[index] == JV_CONSTANT_String)
+ }
+
+ // If superclass looks like a constant pool entry,
+ // resolve it now.
+ if ((uaddr) klass->superclass < pool->size)
+ klass->superclass = pool->data[(int) klass->superclass].clazz;
+
+ // Likewise for interfaces.
+ for (int i = 0; i < klass->interface_count; i++)
+ if ((uaddr) klass->interfaces[i] < pool->size)
+ klass->interfaces[i] = pool->data[(int) klass->interfaces[i]].clazz;
+
+ // Resolve the remaining constant pool entries.
+ for (int index = 1; index < pool->size; ++index)
+ {
+ if (pool->tags[index] == JV_CONSTANT_String)
{
jstring str;
@@ -251,12 +271,6 @@ _Jv_PrepareCompiledClass (jclass klass)
}
#endif /* INTERPRETER */
- if (klass->vtable == NULL)
- _Jv_MakeVTable(klass);
-
- if (klass->otable != NULL && klass->otable->state == 0)
- _Jv_LinkOffsetTable(klass);
-
klass->notifyAll ();
_Jv_PushClass (klass);