diff options
author | Tom Tromey <tromey@redhat.com> | 2003-03-03 23:25:52 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2003-03-03 23:25:52 +0000 |
commit | 9b94c8d18c83411425fc09af02f9b397912493b5 (patch) | |
tree | ab7b0c0f257f39479e009961f187e972c645f326 /libjava/verify.cc | |
parent | b89a3806812e3b0980988d9ae67d9af40116ee5d (diff) | |
download | gcc-9b94c8d18c83411425fc09af02f9b397912493b5.zip gcc-9b94c8d18c83411425fc09af02f9b397912493b5.tar.gz gcc-9b94c8d18c83411425fc09af02f9b397912493b5.tar.bz2 |
verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end of bytecode.
* 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
Diffstat (limited to 'libjava/verify.cc')
-rw-r--r-- | libjava/verify.cc | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/libjava/verify.cc b/libjava/verify.cc index dcb003d..8f8c1df 100644 --- a/libjava/verify.cc +++ b/libjava/verify.cc @@ -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 (); } |