aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/ChangeLog5
-rw-r--r--libjava/verify.cc14
2 files changed, 13 insertions, 6 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 04779de..15f5bd5 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,8 @@
+2001-12-08 Tom Tromey <tromey@redhat.com>
+
+ * verify.cc (_Jv_BytecodeVerifier::is_assignable_from_slow):
+ Handle case of array whose component type is not prepared.
+
2001-12-07 Tom Tromey <tromey@redhat.com>
* java/lang/ClassLoader.java (defineClass): Rethrow any
diff --git a/libjava/verify.cc b/libjava/verify.cc
index b0206d1..74499ed 100644
--- a/libjava/verify.cc
+++ b/libjava/verify.cc
@@ -237,12 +237,9 @@ private:
if (target->isPrimitive () || source->isPrimitive ())
return false;
- // _Jv_IsAssignableFrom can handle a target which is an
- // interface even if it hasn't been prepared.
- if ((target->state > JV_STATE_LINKED || target->isInterface ())
- && source->state > JV_STATE_LINKED)
- return _Jv_IsAssignableFrom (target, source);
-
+ // Check array case first because we can have an array whose
+ // component type is not prepared; _Jv_IsAssignableFrom
+ // doesn't handle this correctly.
if (target->isArray ())
{
if (! source->isArray ())
@@ -250,6 +247,11 @@ private:
target = target->getComponentType ();
source = source->getComponentType ();
}
+ // _Jv_IsAssignableFrom can handle a target which is an
+ // interface even if it hasn't been prepared.
+ else if ((target->state > JV_STATE_LINKED || target->isInterface ())
+ && source->state > JV_STATE_LINKED)
+ return _Jv_IsAssignableFrom (target, source);
else if (target->isInterface ())
{
for (int i = 0; i < source->interface_count; ++i)