re PR libgcj/5670 (verify.cc not properly merging states)
authorTodd Stock <toddastock@yahoo.com>
Thu, 14 Feb 2002 17:48:36 +0000 (17:48 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Thu, 14 Feb 2002 17:48:36 +0000 (17:48 +0000)
2002-02-13  Todd Stock  <toddastock@yahoo.com>

Fix for PR libgcj/5670:
* verify.cc (is_assignable_from_slow): If `source' is interface,
recursively look for merge with `target'.

From-SVN: r49769

libjava/ChangeLog
libjava/verify.cc

index 2438a8d75d87b8255a3b9ea2ebb5af27b6dd2f75..9688503e8c057434d2d89d76017c97b7477606fc 100644 (file)
@@ -1,3 +1,9 @@
+2002-02-13  Todd Stock  <toddastock@yahoo.com>
+
+       Fix for PR libgcj/5670:
+       * verify.cc (is_assignable_from_slow): If `source' is interface,
+       recursively look for merge with `target'.
+
 2002-02-14  Martin Kahlert  <martin.kahlert@infineon.com>
 
        * include/jni.h: Fix typo.
index 38421f46ad63f3ea8a1c8fdb011b7589c9510b3e..ed734eab8f6f2972fe88c067a281b3c40bff8d64 100644 (file)
@@ -259,10 +259,22 @@ private:
            if (source == NULL)
              return false;
          }
+       else if (source->isInterface ())
+         {
+           for (int i = 0; i < target->interface_count; ++i)
+             {
+               // We use a recursive call because we also need to
+               // check superinterfaces.
+               if (is_assignable_from_slow (target->interfaces[i], source))
+                 return true;
+             }
+           target = target->getSuperclass ();
+           if (target == NULL)
+             return false;
+         }
        else if (target == &java::lang::Object::class$)
          return true;
-       else if (source->isInterface ()
-                || source == &java::lang::Object::class$)
+       else if (source == &java::lang::Object::class$)
          return false;
        else
          source = source->getSuperclass ();