7132180: JSR 292: C1 JVM crash with ClassValue/MethodHandle
Reviewed-by: never
This commit is contained in:
parent
1b91bcb342
commit
2fd128fe15
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -3683,56 +3683,61 @@ bool GraphBuilder::for_method_handle_inline(ciMethod* callee) {
|
|||||||
// Get the two MethodHandle inputs from the Phi.
|
// Get the two MethodHandle inputs from the Phi.
|
||||||
Value op1 = phi->operand_at(0);
|
Value op1 = phi->operand_at(0);
|
||||||
Value op2 = phi->operand_at(1);
|
Value op2 = phi->operand_at(1);
|
||||||
ciMethodHandle* mh1 = op1->type()->as_ObjectType()->constant_value()->as_method_handle();
|
ObjectType* op1type = op1->type()->as_ObjectType();
|
||||||
ciMethodHandle* mh2 = op2->type()->as_ObjectType()->constant_value()->as_method_handle();
|
ObjectType* op2type = op2->type()->as_ObjectType();
|
||||||
|
|
||||||
// Set the callee to have access to the class and signature in
|
if (op1type->is_constant() && op2type->is_constant()) {
|
||||||
// the MethodHandleCompiler.
|
ciMethodHandle* mh1 = op1type->constant_value()->as_method_handle();
|
||||||
mh1->set_callee(callee);
|
ciMethodHandle* mh2 = op2type->constant_value()->as_method_handle();
|
||||||
mh1->set_caller(method());
|
|
||||||
mh2->set_callee(callee);
|
|
||||||
mh2->set_caller(method());
|
|
||||||
|
|
||||||
// Get adapters for the MethodHandles.
|
// Set the callee to have access to the class and signature in
|
||||||
ciMethod* mh1_adapter = mh1->get_method_handle_adapter();
|
// the MethodHandleCompiler.
|
||||||
ciMethod* mh2_adapter = mh2->get_method_handle_adapter();
|
mh1->set_callee(callee);
|
||||||
|
mh1->set_caller(method());
|
||||||
|
mh2->set_callee(callee);
|
||||||
|
mh2->set_caller(method());
|
||||||
|
|
||||||
if (mh1_adapter != NULL && mh2_adapter != NULL) {
|
// Get adapters for the MethodHandles.
|
||||||
set_inline_cleanup_info();
|
ciMethod* mh1_adapter = mh1->get_method_handle_adapter();
|
||||||
|
ciMethod* mh2_adapter = mh2->get_method_handle_adapter();
|
||||||
|
|
||||||
// Build the If guard
|
if (mh1_adapter != NULL && mh2_adapter != NULL) {
|
||||||
BlockBegin* one = new BlockBegin(next_bci());
|
set_inline_cleanup_info();
|
||||||
BlockBegin* two = new BlockBegin(next_bci());
|
|
||||||
BlockBegin* end = new BlockBegin(next_bci());
|
|
||||||
Instruction* iff = append(new If(phi, If::eql, false, op1, one, two, NULL, false));
|
|
||||||
block()->set_end(iff->as_BlockEnd());
|
|
||||||
|
|
||||||
// Connect up the states
|
// Build the If guard
|
||||||
one->merge(block()->end()->state());
|
BlockBegin* one = new BlockBegin(next_bci());
|
||||||
two->merge(block()->end()->state());
|
BlockBegin* two = new BlockBegin(next_bci());
|
||||||
|
BlockBegin* end = new BlockBegin(next_bci());
|
||||||
|
Instruction* iff = append(new If(phi, If::eql, false, op1, one, two, NULL, false));
|
||||||
|
block()->set_end(iff->as_BlockEnd());
|
||||||
|
|
||||||
// Save the state for the second inlinee
|
// Connect up the states
|
||||||
ValueStack* state_before = copy_state_before();
|
one->merge(block()->end()->state());
|
||||||
|
two->merge(block()->end()->state());
|
||||||
|
|
||||||
// Parse first adapter
|
// Save the state for the second inlinee
|
||||||
_last = _block = one;
|
ValueStack* state_before = copy_state_before();
|
||||||
if (!try_inline_full(mh1_adapter, /*holder_known=*/ true, end)) {
|
|
||||||
restore_inline_cleanup_info();
|
// Parse first adapter
|
||||||
block()->clear_end(); // remove appended iff
|
_last = _block = one;
|
||||||
return false;
|
if (!try_inline_full(mh1_adapter, /*holder_known=*/ true, end)) {
|
||||||
|
restore_inline_cleanup_info();
|
||||||
|
block()->clear_end(); // remove appended iff
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse second adapter
|
||||||
|
_last = _block = two;
|
||||||
|
_state = state_before;
|
||||||
|
if (!try_inline_full(mh2_adapter, /*holder_known=*/ true, end)) {
|
||||||
|
restore_inline_cleanup_info();
|
||||||
|
block()->clear_end(); // remove appended iff
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect_to_end(end);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse second adapter
|
|
||||||
_last = _block = two;
|
|
||||||
_state = state_before;
|
|
||||||
if (!try_inline_full(mh2_adapter, /*holder_known=*/ true, end)) {
|
|
||||||
restore_inline_cleanup_info();
|
|
||||||
block()->clear_end(); // remove appended iff
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
connect_to_end(end);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user