From 4017ae6e8b8f427065a97d0e99afa7347186c1ab Mon Sep 17 00:00:00 2001 From: Jeff Sturm Date: Mon, 23 Dec 2002 19:59:31 +0000 Subject: [PATCH] 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 --- libjava/ChangeLog | 10 ++++++++++ libjava/exception.cc | 2 +- libjava/java/lang/natClass.cc | 11 ++++++++--- libjava/java/lang/natClassLoader.cc | 28 +++++++++++++++++++++------- 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 + + * 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 * 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);