verify.c (verify_jvm_instructions): Better error msgs for dup.
authorPer Bothner <per@bothner.com>
Fri, 16 Mar 2001 04:16:54 +0000 (20:16 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Fri, 16 Mar 2001 04:16:54 +0000 (20:16 -0800)
* verify.c (verify_jvm_instructions):  Better error msgs for dup.
(type_stack_dup):  Remove no-longer neded error check.

From-SVN: r40529

gcc/java/ChangeLog
gcc/java/verify.c

index 848e17559d776fd8f54cd78edf1cba06bf070c9e..80e2102d083420445927a219d76b173c0c2007e1 100644 (file)
@@ -1,3 +1,8 @@
+2001-03-13  Per Bothner  <per@bothner.com>
+
+       * verify.c (verify_jvm_instructions):  Better error msgs for dup.
+       (type_stack_dup):  Remove no-longer neded error check.
+
 2001-03-15  Bryce McKinlay  <bryce@albatross.co.nz>
 
        * mangle.c (mangle_record_type): Rename 'from_pointer' argument
index 5ac1d057e5c4281ffb05313805427bd25fbfd1eb..bb10b447c95c965ea467a5320a0c47991296eb99 100644 (file)
@@ -294,8 +294,6 @@ type_stack_dup (size, offset)
 {
   tree type[4];
   int index;
-  if (size + offset > stack_pointer)
-    error ("stack underflow - dup* operation");
   for (index = 0;  index < size + offset; index++)
     {
       type[index] = stack_type_map[stack_pointer - 1];
@@ -923,12 +921,18 @@ verify_jvm_instructions (jcf, byte_ops, length)
        case OPCODE_new:
          PUSH_TYPE (get_class_constant (jcf, IMMEDIATE_u2));
          break;
-       case OPCODE_dup:     type_stack_dup (1, 0);  break;
-       case OPCODE_dup_x1:  type_stack_dup (1, 1);  break;
-       case OPCODE_dup_x2:  type_stack_dup (1, 2);  break;
-       case OPCODE_dup2:    type_stack_dup (2, 0);  break;
-       case OPCODE_dup2_x1: type_stack_dup (2, 1);  break;
-       case OPCODE_dup2_x2: type_stack_dup (2, 2);  break;
+       case OPCODE_dup:     wide = 1; index = 0;  goto dup;
+       case OPCODE_dup_x1:  wide = 1; index = 1;  goto dup;
+       case OPCODE_dup_x2:  wide = 1; index = 2;  goto dup;
+       case OPCODE_dup2:    wide = 2; index = 0;  goto dup;
+       case OPCODE_dup2_x1: wide = 2; index = 1;  goto dup;
+       case OPCODE_dup2_x2: wide = 2; index = 2;  goto dup;
+       dup:
+         if (wide + index > stack_pointer)
+           VERIFICATION_ERROR ("stack underflow - dup* operation");
+         type_stack_dup (wide, index);
+         wide = 0;
+         break;
        case OPCODE_pop:  index = 1;  goto pop;
        case OPCODE_pop2: index = 2;  goto pop;
        pop: