Commit e7b35eec by Tom Tromey Committed by Tom Tromey

verify.cc (_Jv_BytecodeVerifier::pop_type): Put PC into error message.

	* 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.

From-SVN: r47158
parent 39244792
2001-11-18 Tom Tromey <tromey@redhat.com> 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.cc: Include StringBuffer.h.
(verify_fail): Added pc argument. Use StringBuffer to construct (verify_fail): Added pc argument. Use StringBuffer to construct
exception message. exception message.
......
...@@ -353,20 +353,23 @@ private: ...@@ -353,20 +353,23 @@ private:
} }
// Mark this type as the uninitialized result of `new'. // 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"); verify_fail ("internal error in type::uninitialized");
key = (key == reference_type pc = npc;
? uninitialized_reference_type
: uninitialized_unresolved_reference_type);
pc = pc;
} }
// Mark this type as now initialized. // Mark this type as now initialized.
void set_initialized (int npc) 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 key = (key == uninitialized_reference_type
? reference_type ? reference_type
...@@ -834,11 +837,11 @@ private: ...@@ -834,11 +837,11 @@ private:
type pop_raw () type pop_raw ()
{ {
if (current_state->stacktop <= 0) if (current_state->stacktop <= 0)
verify_fail ("stack empty"); verify_fail ("stack empty", start_PC);
type r = current_state->stack[--current_state->stacktop]; type r = current_state->stack[--current_state->stacktop];
current_state->stackdepth -= r.depth (); current_state->stackdepth -= r.depth ();
if (current_state->stackdepth < 0) if (current_state->stackdepth < 0)
verify_fail ("stack empty"); verify_fail ("stack empty", start_PC);
return r; return r;
} }
...@@ -846,7 +849,7 @@ private: ...@@ -846,7 +849,7 @@ private:
{ {
type r = pop_raw (); type r = pop_raw ();
if (r.iswide ()) if (r.iswide ())
verify_fail ("narrow pop of wide type"); verify_fail ("narrow pop of wide type", start_PC);
return r; return r;
} }
...@@ -854,15 +857,16 @@ private: ...@@ -854,15 +857,16 @@ private:
{ {
type r = pop_raw (); type r = pop_raw ();
if (! r.iswide ()) if (! r.iswide ())
verify_fail ("wide pop of narrow type"); verify_fail ("wide pop of narrow type", start_PC);
return r; return r;
} }
type pop_type (type match) type pop_type (type match)
{ {
match.promote ();
type t = pop_raw (); type t = pop_raw ();
if (! match.compatible (t)) if (! match.compatible (t))
verify_fail ("incompatible type on stack"); verify_fail ("incompatible type on stack", start_PC);
return t; return t;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment