summaryrefslogtreecommitdiff
path: root/libjava/resolve.cc
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-20 15:10:49 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-20 15:10:49 +0000
commitf5fd351e820e52279292c06431fb503d5886374a (patch)
tree5fe7164c297cc6a841a25c673434a465963b9818 /libjava/resolve.cc
parenta48d03e267d460209759aef711cf1f42b5422230 (diff)
downloadgcc-f5fd351e820e52279292c06431fb503d5886374a.tar.gz
For PR libgcj/7073:
* resolve.cc (_Jv_PrepareClass): Only resolve superclass if it exists. * defineclass.cc (handleClassBegin): Superclass for interface is `null'. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54835 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/resolve.cc')
-rw-r--r--libjava/resolve.cc26
1 files changed, 17 insertions, 9 deletions
diff --git a/libjava/resolve.cc b/libjava/resolve.cc
index fba6cba8e13..f55875509e3 100644
--- a/libjava/resolve.cc
+++ b/libjava/resolve.cc
@@ -516,11 +516,14 @@ _Jv_PrepareClass(jclass klass)
if (klass->state >= JV_STATE_PREPARED)
return;
- // make sure super-class is linked. This involves taking a lock on
- // the super class, so we use the Java method resolveClass, which will
- // unlock it properly, should an exception happen.
+ // Make sure super-class is linked. This involves taking a lock on
+ // the super class, so we use the Java method resolveClass, which
+ // will unlock it properly, should an exception happen. If there's
+ // no superclass, do nothing -- Object will already have been
+ // resolved.
- java::lang::ClassLoader::resolveClass0 (klass->superclass);
+ if (klass->superclass)
+ java::lang::ClassLoader::resolveClass0 (klass->superclass);
_Jv_InterpClass *clz = (_Jv_InterpClass*)klass;
@@ -529,8 +532,12 @@ _Jv_PrepareClass(jclass klass)
int instance_size;
int static_size;
- // java.lang.Object is never interpreted!
- instance_size = clz->superclass->size ();
+ // Although java.lang.Object is never interpreted, an interface can
+ // have a null superclass.
+ if (clz->superclass)
+ instance_size = clz->superclass->size();
+ else
+ instance_size = java::lang::Object::class$.size();
static_size = 0;
for (int i = 0; i < clz->field_count; i++)
@@ -646,9 +653,6 @@ _Jv_PrepareClass(jclass klass)
jclass super_class = clz->getSuperclass ();
- if (super_class == 0)
- throw_internal_error ("cannot handle interpreted base classes");
-
for (int i = 0; i < clz->method_count; i++)
{
_Jv_Method *this_meth = &clz->methods[i];
@@ -708,6 +712,10 @@ _Jv_PrepareClass(jclass klass)
while (effective_superclass && effective_superclass->vtable == NULL)
effective_superclass = effective_superclass->superclass;
+ /* If we ended up without a superclass, use Object. */
+ if (! effective_superclass)
+ effective_superclass = &java::lang::Object::class$;
+
/* copy super class' vtable entries. */
if (effective_superclass && effective_superclass->vtable)
for (int i = 0; i < effective_superclass->vtable_method_count; ++i)