6987634: JSR 292 assert(start_bci() >= 0 && start_bci() < code_size()) failed: correct osr_bci argument
Reviewed-by: never, kvn
This commit is contained in:
parent
5384d6be9e
commit
59ea7a14e6
@ -94,6 +94,60 @@ CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index,
|
|||||||
if (cg != NULL) return cg;
|
if (cg != NULL) return cg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do MethodHandle calls.
|
||||||
|
// NOTE: This must happen before normal inlining logic below since
|
||||||
|
// MethodHandle.invoke* are native methods which obviously don't
|
||||||
|
// have bytecodes and so normal inlining fails.
|
||||||
|
if (call_method->is_method_handle_invoke()) {
|
||||||
|
if (jvms->method()->java_code_at_bci(jvms->bci()) != Bytecodes::_invokedynamic) {
|
||||||
|
GraphKit kit(jvms);
|
||||||
|
Node* n = kit.argument(0);
|
||||||
|
|
||||||
|
if (n->Opcode() == Op_ConP) {
|
||||||
|
const TypeOopPtr* oop_ptr = n->bottom_type()->is_oopptr();
|
||||||
|
ciObject* const_oop = oop_ptr->const_oop();
|
||||||
|
ciMethodHandle* method_handle = const_oop->as_method_handle();
|
||||||
|
|
||||||
|
// Set the actually called method to have access to the class
|
||||||
|
// and signature in the MethodHandleCompiler.
|
||||||
|
method_handle->set_callee(call_method);
|
||||||
|
|
||||||
|
// Get an adapter for the MethodHandle.
|
||||||
|
ciMethod* target_method = method_handle->get_method_handle_adapter();
|
||||||
|
|
||||||
|
CallGenerator* hit_cg = this->call_generator(target_method, vtable_index, false, jvms, true, prof_factor);
|
||||||
|
if (hit_cg != NULL && hit_cg->is_inline())
|
||||||
|
return hit_cg;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CallGenerator::for_direct_call(call_method);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Get the MethodHandle from the CallSite.
|
||||||
|
ciMethod* caller_method = jvms->method();
|
||||||
|
ciBytecodeStream str(caller_method);
|
||||||
|
str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci.
|
||||||
|
ciCallSite* call_site = str.get_call_site();
|
||||||
|
ciMethodHandle* method_handle = call_site->get_target();
|
||||||
|
|
||||||
|
// Set the actually called method to have access to the class
|
||||||
|
// and signature in the MethodHandleCompiler.
|
||||||
|
method_handle->set_callee(call_method);
|
||||||
|
|
||||||
|
// Get an adapter for the MethodHandle.
|
||||||
|
ciMethod* target_method = method_handle->get_invokedynamic_adapter();
|
||||||
|
|
||||||
|
CallGenerator* hit_cg = this->call_generator(target_method, vtable_index, false, jvms, true, prof_factor);
|
||||||
|
if (hit_cg != NULL && hit_cg->is_inline()) {
|
||||||
|
CallGenerator* miss_cg = CallGenerator::for_dynamic_call(call_method);
|
||||||
|
return CallGenerator::for_predicted_dynamic_call(method_handle, miss_cg, hit_cg, prof_factor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If something failed, generate a normal dynamic call.
|
||||||
|
return CallGenerator::for_dynamic_call(call_method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Do not inline strict fp into non-strict code, or the reverse
|
// Do not inline strict fp into non-strict code, or the reverse
|
||||||
bool caller_method_is_strict = jvms->method()->is_strict();
|
bool caller_method_is_strict = jvms->method()->is_strict();
|
||||||
if( caller_method_is_strict ^ call_method->is_strict() ) {
|
if( caller_method_is_strict ^ call_method->is_strict() ) {
|
||||||
@ -216,57 +270,6 @@ CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do MethodHandle calls.
|
|
||||||
if (call_method->is_method_handle_invoke()) {
|
|
||||||
if (jvms->method()->java_code_at_bci(jvms->bci()) != Bytecodes::_invokedynamic) {
|
|
||||||
GraphKit kit(jvms);
|
|
||||||
Node* n = kit.argument(0);
|
|
||||||
|
|
||||||
if (n->Opcode() == Op_ConP) {
|
|
||||||
const TypeOopPtr* oop_ptr = n->bottom_type()->is_oopptr();
|
|
||||||
ciObject* const_oop = oop_ptr->const_oop();
|
|
||||||
ciMethodHandle* method_handle = const_oop->as_method_handle();
|
|
||||||
|
|
||||||
// Set the actually called method to have access to the class
|
|
||||||
// and signature in the MethodHandleCompiler.
|
|
||||||
method_handle->set_callee(call_method);
|
|
||||||
|
|
||||||
// Get an adapter for the MethodHandle.
|
|
||||||
ciMethod* target_method = method_handle->get_method_handle_adapter();
|
|
||||||
|
|
||||||
CallGenerator* hit_cg = this->call_generator(target_method, vtable_index, false, jvms, true, prof_factor);
|
|
||||||
if (hit_cg != NULL && hit_cg->is_inline())
|
|
||||||
return hit_cg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CallGenerator::for_direct_call(call_method);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Get the MethodHandle from the CallSite.
|
|
||||||
ciMethod* caller_method = jvms->method();
|
|
||||||
ciBytecodeStream str(caller_method);
|
|
||||||
str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci.
|
|
||||||
ciCallSite* call_site = str.get_call_site();
|
|
||||||
ciMethodHandle* method_handle = call_site->get_target();
|
|
||||||
|
|
||||||
// Set the actually called method to have access to the class
|
|
||||||
// and signature in the MethodHandleCompiler.
|
|
||||||
method_handle->set_callee(call_method);
|
|
||||||
|
|
||||||
// Get an adapter for the MethodHandle.
|
|
||||||
ciMethod* target_method = method_handle->get_invokedynamic_adapter();
|
|
||||||
|
|
||||||
CallGenerator* hit_cg = this->call_generator(target_method, vtable_index, false, jvms, true, prof_factor);
|
|
||||||
if (hit_cg != NULL && hit_cg->is_inline()) {
|
|
||||||
CallGenerator* miss_cg = CallGenerator::for_dynamic_call(call_method);
|
|
||||||
return CallGenerator::for_predicted_dynamic_call(method_handle, miss_cg, hit_cg, prof_factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If something failed, generate a normal dynamic call.
|
|
||||||
return CallGenerator::for_dynamic_call(call_method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// There was no special inlining tactic, or it bailed out.
|
// There was no special inlining tactic, or it bailed out.
|
||||||
// Use a more generic tactic, like a simple call.
|
// Use a more generic tactic, like a simple call.
|
||||||
if (call_is_virtual) {
|
if (call_is_virtual) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user