aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorTodd Stock <toddastock@yahoo.com>2002-02-14 17:48:36 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-02-14 17:48:36 +0000
commit30fbb95c050ae400fecc0ea84a66c2042c8ed5dc (patch)
tree7645434815392b2fd12c17e6cdea16812d401fc7 /libjava
parent6c4cf6956ed5f4d8a36ab8e1e1cc9f808b6c087a (diff)
downloadgcc-30fbb95c050ae400fecc0ea84a66c2042c8ed5dc.zip
gcc-30fbb95c050ae400fecc0ea84a66c2042c8ed5dc.tar.gz
gcc-30fbb95c050ae400fecc0ea84a66c2042c8ed5dc.tar.bz2
re PR libgcj/5670 (verify.cc not properly merging states)
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
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/verify.cc16
2 files changed, 20 insertions, 2 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 2438a8d..9688503 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 38421f4..ed734ea 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 ();