OSDN Git Service

* verify.cc (class _Jv_BytecodeVerifier) [op_invokeinterface]:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 28 Jan 2002 18:52:44 +0000 (18:52 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 28 Jan 2002 18:52:44 +0000 (18:52 +0000)
`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

libjava/ChangeLog
libjava/verify.cc

index ee9b291..1dedce8 100644 (file)
@@ -1,3 +1,8 @@
+2002-01-28  Tom Tromey  <tromey@redhat.com>
+
+       * verify.cc (class _Jv_BytecodeVerifier) [op_invokeinterface]:
+       `nargs' byte is number of words, not number of arguments.
+
 2002-01-27  Tom Tromey  <tromey@redhat.com>
 
        * java/awt/event/MouseEvent.java (modifiers): Removed field.
index f45a276..9100831 100644 (file)
@@ -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)
                {