OSDN Git Service

* exception.cc (PERSONALITY_FUNCTION): Clear least-significant-bit
authorjsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Dec 2002 19:59:31 +0000 (19:59 +0000)
committerjsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Dec 2002 19:59:31 +0000 (19:59 +0000)
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

libjava/ChangeLog
libjava/exception.cc
libjava/java/lang/natClass.cc
libjava/java/lang/natClassLoader.cc

index 4cd1b0c..2044fc4 100644 (file)
@@ -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
index 917d6e1..d983f98 100644 (file)
@@ -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))
                {
index 768ced6..0960649 100644 (file)
@@ -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
     {
index 96a8181..176f16a 100644 (file)
@@ -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);