diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-28 18:52:44 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-28 18:52:44 +0000 |
commit | b6e6352c2aaa93ebd96cfcecc72cb28cd3a00038 (patch) | |
tree | 53e82853f723a42c220adfb09d0d0b52ab9783c1 /libjava/verify.cc | |
parent | 4d8598856e89d5ef1ff8115218e54f2938afe6f3 (diff) | |
download | gcc-b6e6352c2aaa93ebd96cfcecc72cb28cd3a00038.tar.gz |
* verify.cc (class _Jv_BytecodeVerifier) [op_invokeinterface]:
`nargs' byte is number of words, not number of arguments.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49292 138bc75d-0d04-0410-961f-82ee72b054a4
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 f45a276ef23..91008310487 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) { |