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.
}
// 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
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;
}
{
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;
}
{
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;
}