diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-19 00:31:37 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-19 00:31:37 +0000 |
commit | a5a42e04812a6eab9c68e9802936c396bd9cbc77 (patch) | |
tree | fca4c0afbe6be4db09f2e125e67db3f1fa699867 /libjava | |
parent | e066425dd70681b63d24e2c3dd78844ed478cb6e (diff) | |
download | gcc-a5a42e04812a6eab9c68e9802936c396bd9cbc77.tar.gz |
* verify.cc (_Jv_BytecodeVerifier::pop_type): Put PC into error
message.
(_Jv_BytecodeVerifier::pop64): Likewise.
(_Jv_BytecodeVerifier::pop32): Likewise.
(_Jv_BytecodeVerifier::pop_raw): Likewise.
(_Jv_BytecodeVerifier::pop_type): Promote the match type.
(type::set_initialized): Only modify uninitialized types.
(type::set_uninitialized): Fix shadowing bug. Simplify code.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47158 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 9 | ||||
-rw-r--r-- | libjava/verify.cc | 28 |
2 files changed, 25 insertions, 12 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index ac1a38ec981..0afaa103bbb 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,14 @@ 2001-11-18 Tom Tromey <tromey@redhat.com> + * verify.cc (_Jv_BytecodeVerifier::pop_type): Put PC into error + message. + (_Jv_BytecodeVerifier::pop64): Likewise. + (_Jv_BytecodeVerifier::pop32): Likewise. + (_Jv_BytecodeVerifier::pop_raw): Likewise. + (_Jv_BytecodeVerifier::pop_type): Promote the match type. + (type::set_initialized): Only modify uninitialized types. + (type::set_uninitialized): Fix shadowing bug. Simplify code. + * verify.cc: Include StringBuffer.h. (verify_fail): Added pc argument. Use StringBuffer to construct exception message. diff --git a/libjava/verify.cc b/libjava/verify.cc index 9917d0ccbf3..5d8fd809de7 100644 --- a/libjava/verify.cc +++ b/libjava/verify.cc @@ -353,20 +353,23 @@ private: } // Mark this type as the uninitialized result of `new'. - void set_uninitialized (int pc) + void set_uninitialized (int npc) { - if (key != reference_type && key != unresolved_reference_type) + if (key == reference_type) + key = uninitialized_reference_type; + else if (key == unresolved_reference_type) + key = uninitialized_unresolved_reference_type; + else verify_fail ("internal error in type::uninitialized"); - key = (key == reference_type - ? uninitialized_reference_type - : uninitialized_unresolved_reference_type); - pc = pc; + pc = npc; } // Mark this type as now initialized. void set_initialized (int npc) { - if (pc == npc) + if (npc != UNINIT && pc == npc + && (key == uninitialized_reference_type + || key == uninitialized_unresolved_reference_type)) { key = (key == uninitialized_reference_type ? reference_type @@ -834,11 +837,11 @@ private: type pop_raw () { if (current_state->stacktop <= 0) - verify_fail ("stack empty"); + verify_fail ("stack empty", start_PC); type r = current_state->stack[--current_state->stacktop]; current_state->stackdepth -= r.depth (); if (current_state->stackdepth < 0) - verify_fail ("stack empty"); + verify_fail ("stack empty", start_PC); return r; } @@ -846,7 +849,7 @@ private: { type r = pop_raw (); if (r.iswide ()) - verify_fail ("narrow pop of wide type"); + verify_fail ("narrow pop of wide type", start_PC); return r; } @@ -854,15 +857,16 @@ private: { type r = pop_raw (); if (! r.iswide ()) - verify_fail ("wide pop of narrow type"); + verify_fail ("wide pop of narrow type", start_PC); return r; } type pop_type (type match) { + match.promote (); type t = pop_raw (); if (! match.compatible (t)) - verify_fail ("incompatible type on stack"); + verify_fail ("incompatible type on stack", start_PC); return t; } |