]> gcc.gnu.org Git - gcc.git/commitdiff
verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end of bytecode.
authorTom Tromey <tromey@redhat.com>
Mon, 3 Mar 2003 23:25:52 +0000 (23:25 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 3 Mar 2003 23:25:52 +0000 (23:25 +0000)
* verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end
of bytecode.
(handle_ret_insn): Fail if returning to jsr that appears at end of
bytecode.

From-SVN: r63744

libjava/ChangeLog
libjava/verify.cc

index aaa9512761afc9c8b84960e01033f6e7d8090102..b799649016fdde7f02eac953b0bb0334f8f2c81e 100644 (file)
@@ -1,3 +1,10 @@
+2003-03-03  Tom Tromey  <tromey@redhat.com>
+
+       * verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end
+       of bytecode.
+       (handle_ret_insn): Fail if returning to jsr that appears at end of
+       bytecode.
+
 2003-03-03  Michael Koch  <konqueror@gmx.de>
 
        * Makefile.am
index dcb003dfb22a01debf94d9076de2b50778a93d5d..8f8c1df9eb18782aad568434be5f8db03fb498a4 100644 (file)
@@ -1526,6 +1526,12 @@ private:
 
     for (subr_info *subr = jsr_ptrs[csub]; subr != NULL; subr = subr->next)
       {
+       // We might be returning to a `jsr' that is at the end of the
+       // bytecode.  This is ok if we never return from the called
+       // subroutine, but if we see this here it is an error.
+       if (subr->pc >= current_method->code_length)
+         verify_fail ("fell off end");
+
        // Temporarily modify the current state so it looks like we're
        // in the enclosing context.
        current_state->subroutine = get_subroutine (subr->pc);
@@ -1575,16 +1581,15 @@ private:
     // the local variable state across the jsr, but the subroutine
     // might change the stack depth, so we can't make any assumptions
     // about it.  So we have yet another special case.  We know that
-    // at this point PC points to the instruction after the jsr.
-
-    // FIXME: what if we have a jsr at the end of the code, but that
-    // jsr has no corresponding ret?  Is this verifiable, or is it
-    // not?  If it is then we need a special case here.
-    if (PC >= current_method->code_length)
-      verify_fail ("fell off end");
-
-    current_state->stacktop = state::NO_STACK;
-    push_jump_merge (PC, current_state);
+    // at this point PC points to the instruction after the jsr.  Note
+    // that it is ok to have a `jsr' at the end of the bytecode,
+    // provided that the called subroutine never returns.  So, we have
+    // a special case here and another one when we handle the ret.
+    if (PC < current_method->code_length)
+      {
+       current_state->stacktop = state::NO_STACK;
+       push_jump_merge (PC, current_state);
+      }
     invalidate_pc ();
   }
 
This page took 0.071062 seconds and 5 git commands to generate.