From 8987cc881fe0b7b7c91bda35f850f81e0466114f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 28 Jan 2002 18:52:44 +0000 Subject: [PATCH] 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 --- libjava/ChangeLog | 5 +++++ libjava/verify.cc | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index ee9b2910f79..1dedce8b966 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,8 @@ +2002-01-28 Tom Tromey + + * verify.cc (class _Jv_BytecodeVerifier) [op_invokeinterface]: + `nargs' byte is number of words, not number of arguments. + 2002-01-27 Tom Tromey * java/awt/event/MouseEvent.java (modifiers): Removed field. 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) {