diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 2438a8d75d87b8255a3b9ea2ebb5af27b6dd2f75..9688503e8c057434d2d89d76017c97b7477606fc 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -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. diff --git a/libjava/verify.cc b/libjava/verify.cc index 38421f46ad63f3ea8a1c8fdb011b7589c9510b3e..ed734eab8f6f2972fe88c067a281b3c40bff8d64 100644 --- a/libjava/verify.cc +++ b/libjava/verify.cc @@ -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 ();