aboutsummaryrefslogtreecommitdiff
path: root/libjava/verify.cc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-01-28 18:52:44 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-01-28 18:52:44 +0000
commit8987cc881fe0b7b7c91bda35f850f81e0466114f (patch)
tree53e82853f723a42c220adfb09d0d0b52ab9783c1 /libjava/verify.cc
parente83cb5f0179be58ba7829f732a2ec824c47a388d (diff)
downloadgcc-8987cc881fe0b7b7c91bda35f850f81e0466114f.zip
gcc-8987cc881fe0b7b7c91bda35f850f81e0466114f.tar.gz
gcc-8987cc881fe0b7b7c91bda35f850f81e0466114f.tar.bz2
verify.cc (class _Jv_BytecodeVerifier): `nargs' byte is number of words, not number of arguments.
* verify.cc (class _Jv_BytecodeVerifier) [op_invokeinterface]: `nargs' byte is number of words, not number of arguments. From-SVN: r49292
Diffstat (limited to 'libjava/verify.cc')
-rw-r--r--libjava/verify.cc23
1 files changed, 16 insertions, 7 deletions
diff --git a/libjava/verify.cc b/libjava/verify.cc
index f45a276..9100831 100644
--- a/libjava/verify.cc
+++ b/libjava/verify.cc
@@ -2653,16 +2653,15 @@ private:
opcode == op_invokeinterface,
&method_name,
&method_signature);
- int arg_count = _Jv_count_arguments (method_signature);
+ // NARGS is only used when we're processing
+ // invokeinterface. It is simplest for us to compute it
+ // here and then verify it later.
+ int nargs = 0;
if (opcode == op_invokeinterface)
{
- int nargs = get_byte ();
- if (nargs == 0)
- verify_fail ("too few arguments to invokeinterface");
+ nargs = get_byte ();
if (get_byte () != 0)
verify_fail ("invokeinterface dummy byte is wrong");
- if (nargs - 1 != arg_count)
- verify_fail ("wrong argument count for invokeinterface");
}
bool is_init = false;
@@ -2676,10 +2675,20 @@ private:
verify_fail ("can't invoke method starting with `<'");
// Pop arguments and check types.
+ int arg_count = _Jv_count_arguments (method_signature);
type arg_types[arg_count];
compute_argument_types (method_signature, arg_types);
for (int i = arg_count - 1; i >= 0; --i)
- pop_type (arg_types[i]);
+ {
+ // This is only used for verifying the byte for
+ // invokeinterface.
+ nargs -= arg_types[i].depth ();
+ pop_type (arg_types[i]);
+ }
+
+ if (opcode == op_invokeinterface
+ && nargs != 1)
+ verify_fail ("wrong argument count for invokeinterface");
if (opcode != op_invokestatic)
{