aboutsummaryrefslogtreecommitdiff
path: root/libjava/verify.cc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-02-15 06:55:42 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-02-15 06:55:42 +0000
commitef9c7b8eedc192c97ded2902dfe99f25c94f0ce4 (patch)
treebf4df495a5c9b138460a843a0849e987d9305402 /libjava/verify.cc
parent15b28697de9a1f3ca0cbfb7cfb7fba09e13c8bec (diff)
downloadgcc-ef9c7b8eedc192c97ded2902dfe99f25c94f0ce4.zip
gcc-ef9c7b8eedc192c97ded2902dfe99f25c94f0ce4.tar.gz
gcc-ef9c7b8eedc192c97ded2902dfe99f25c94f0ce4.tar.bz2
re PR libgcj/5695 (verify.cc test that target is an object before running down interfaces)
Fix for PR libgcj/5695: * verify.cc (is_assignable_from_slow): Check to see if target is an Object before checking to see if source is an interface. (verify_instructions_0) [op_invokeinterface]: Handle case where we're making an interface call on Object. From-SVN: r49783
Diffstat (limited to 'libjava/verify.cc')
-rw-r--r--libjava/verify.cc30
1 files changed, 26 insertions, 4 deletions
diff --git a/libjava/verify.cc b/libjava/verify.cc
index ed734ea..cbadd9f 100644
--- a/libjava/verify.cc
+++ b/libjava/verify.cc
@@ -259,6 +259,11 @@ private:
if (source == NULL)
return false;
}
+ // We must do this check before we check to see if SOURCE is
+ // an interface. This way we know that any interface is
+ // assignable to an Object.
+ else if (target == &java::lang::Object::class$)
+ return true;
else if (source->isInterface ())
{
for (int i = 0; i < target->interface_count; ++i)
@@ -272,8 +277,6 @@ private:
if (target == NULL)
return false;
}
- else if (target == &java::lang::Object::class$)
- return true;
else if (source == &java::lang::Object::class$)
return false;
else
@@ -2786,9 +2789,28 @@ private:
// In this case the PC doesn't matter.
t.set_uninitialized (type::UNINIT, this);
}
- t = pop_type (t);
+ type raw = pop_raw ();
+ bool ok = false;
+ if (t.compatible (raw, this))
+ {
+ ok = true;
+ }
+ else if (opcode == op_invokeinterface)
+ {
+ // This is a hack. We might have merged two
+ // items and gotten `Object'. This can happen
+ // because we don't keep track of where merges
+ // come from. This is safe as long as the
+ // interpreter checks interfaces at runtime.
+ type obj (&java::lang::Object::class$);
+ ok = raw.compatible (obj, this);
+ }
+
+ if (! ok)
+ verify_fail ("incompatible type on stack");
+
if (is_init)
- current_state->set_initialized (t.get_pc (),
+ current_state->set_initialized (raw.get_pc (),
current_method->max_locals);
}