mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8051012: Regression in verifier for <init> method call from inside of a branch
Fix stackmap matching for branches. Reviewed-by: coleenp, lfoltan, acorn
This commit is contained in:
parent
7b1571089e
commit
f588cd1325
4 changed files with 15 additions and 41 deletions
|
@ -620,8 +620,6 @@ void ClassVerifier::verify_method(methodHandle m, TRAPS) {
|
|||
// flow from current instruction to the next
|
||||
// instruction in sequence
|
||||
|
||||
set_furthest_jump(0);
|
||||
|
||||
Bytecodes::Code opcode;
|
||||
while (!bcs.is_last_bytecode()) {
|
||||
// Check for recursive re-verification before each bytecode.
|
||||
|
@ -1780,7 +1778,7 @@ u2 ClassVerifier::verify_stackmap_table(u2 stackmap_index, u2 bci,
|
|||
// If matched, current_frame will be updated by this method.
|
||||
bool matches = stackmap_table->match_stackmap(
|
||||
current_frame, this_offset, stackmap_index,
|
||||
!no_control_flow, true, &ctx, CHECK_VERIFY_(this, 0));
|
||||
!no_control_flow, true, false, &ctx, CHECK_VERIFY_(this, 0));
|
||||
if (!matches) {
|
||||
// report type error
|
||||
verify_error(ctx, "Instruction type does not match stack map");
|
||||
|
@ -1827,7 +1825,7 @@ void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, S
|
|||
}
|
||||
ErrorContext ctx;
|
||||
bool matches = stackmap_table->match_stackmap(
|
||||
new_frame, handler_pc, true, false, &ctx, CHECK_VERIFY(this));
|
||||
new_frame, handler_pc, true, false, true, &ctx, CHECK_VERIFY(this));
|
||||
if (!matches) {
|
||||
verify_error(ctx, "Stack map does not match the one at "
|
||||
"exception handler %d", handler_pc);
|
||||
|
@ -2238,13 +2236,6 @@ void ClassVerifier::verify_invoke_init(
|
|||
return;
|
||||
}
|
||||
|
||||
// Make sure that this call is not jumped over.
|
||||
if (bci < furthest_jump()) {
|
||||
verify_error(ErrorContext::bad_code(bci),
|
||||
"Bad <init> method call from inside of a branch");
|
||||
return;
|
||||
}
|
||||
|
||||
// Make sure that this call is not done from within a TRY block because
|
||||
// that can result in returning an incomplete object. Simply checking
|
||||
// (bci >= start_pc) also ensures that this call is not done after a TRY
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue