diff options
author | Jeff Sturm <jsturm@one-point.com> | 2002-12-23 19:59:31 +0000 |
---|---|---|
committer | Jeff Sturm <jsturm@gcc.gnu.org> | 2002-12-23 19:59:31 +0000 |
commit | 4017ae6e8b8f427065a97d0e99afa7347186c1ab (patch) | |
tree | a094b01d9cbc1da5277a2f87e776b7fb146d7e2f /libjava/java/lang/natClassLoader.cc | |
parent | d3ab697ba4d1eeeecc4ab37337cbcad455c80057 (diff) | |
download | gcc-4017ae6e8b8f427065a97d0e99afa7347186c1ab.zip gcc-4017ae6e8b8f427065a97d0e99afa7347186c1ab.tar.gz gcc-4017ae6e8b8f427065a97d0e99afa7347186c1ab.tar.bz2 |
exception.cc (PERSONALITY_FUNCTION): Clear least-significant-bit of catch_type.
* 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.
From-SVN: r60450
Diffstat (limited to 'libjava/java/lang/natClassLoader.cc')
-rw-r--r-- | libjava/java/lang/natClassLoader.cc | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 96a8181..176f16a 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); |