diff options
author | Tom Tromey <tromey@redhat.com> | 2002-01-28 18:52:44 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-01-28 18:52:44 +0000 |
commit | 8987cc881fe0b7b7c91bda35f850f81e0466114f (patch) | |
tree | 53e82853f723a42c220adfb09d0d0b52ab9783c1 /libjava/verify.cc | |
parent | e83cb5f0179be58ba7829f732a2ec824c47a388d (diff) | |
download | gcc-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.cc | 23 |
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) { |