verify.cc (_Jv_BytecodeVerifier::is_assignable_from_slow): Handle case of array whose...
authorTom Tromey <tromey@redhat.com>
Sun, 9 Dec 2001 00:14:00 +0000 (00:14 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Sun, 9 Dec 2001 00:14:00 +0000 (00:14 +0000)
* verify.cc (_Jv_BytecodeVerifier::is_assignable_from_slow):
Handle case of array whose component type is not prepared.

From-SVN: r47799

libjava/ChangeLog
libjava/verify.cc

index 04779dec1eb70856937883552aa09b889b0ded23..15f5bd5706300ffb4da0d854923056d102ba5bb1 100644 (file)
@@ -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
index b0206d15f983c202da89b5d0e1a6c9a4a6f69b30..74499ed4fa1fb23d62402b2567c7099afeeddbef 100644 (file)
@@ -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)