8287233: Crash in Continuation.enterSpecial: stop: tried to execute native method as non-native
Reviewed-by: dholmes, pchilanomate
This commit is contained in:
parent
168b226b0f
commit
b2b4ee212f
@ -1086,12 +1086,11 @@ void LinkResolver::resolve_static_call(CallInfo& result,
|
||||
resolved_method = linktime_resolve_static_method(new_info, CHECK);
|
||||
}
|
||||
|
||||
if (resolved_method->is_continuation_enter_intrinsic()) {
|
||||
if (!resolved_method->has_compiled_code()) {
|
||||
methodHandle mh(THREAD, resolved_method);
|
||||
// Generate a compiled form of the enterSpecial intrinsic.
|
||||
AdapterHandlerLibrary::create_native_wrapper(mh);
|
||||
}
|
||||
if (resolved_method->is_continuation_enter_intrinsic()
|
||||
&& resolved_method->from_interpreted_entry() == NULL) { // does a load_acquire
|
||||
methodHandle mh(THREAD, resolved_method);
|
||||
// Generate a compiled form of the enterSpecial intrinsic.
|
||||
AdapterHandlerLibrary::create_native_wrapper(mh);
|
||||
}
|
||||
|
||||
// setup result
|
||||
|
@ -1236,6 +1236,12 @@ void Method::link_method(const methodHandle& h_method, TRAPS) {
|
||||
(void) make_adapters(h_method, CHECK);
|
||||
|
||||
// ONLY USE the h_method now as make_adapter may have blocked
|
||||
|
||||
if (h_method->is_continuation_enter_intrinsic()) {
|
||||
// the entry points to this method will be set in set_code, called when first resolving this method
|
||||
_from_interpreted_entry = NULL;
|
||||
_from_compiled_entry = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
address Method::make_adapters(const methodHandle& mh, TRAPS) {
|
||||
@ -1317,12 +1323,16 @@ void Method::set_code(const methodHandle& mh, CompiledMethod *code) {
|
||||
OrderAccess::storestore();
|
||||
mh->_from_compiled_entry = code->verified_entry_point();
|
||||
OrderAccess::storestore();
|
||||
// Instantly compiled code can execute.
|
||||
if (!mh->is_method_handle_intrinsic())
|
||||
mh->_from_interpreted_entry = mh->get_i2c_entry();
|
||||
|
||||
if (mh->is_continuation_enter_intrinsic()) {
|
||||
// this is the entry used when we're in interpreter-only mode; see InterpreterMacroAssembler::jump_from_interpreted
|
||||
assert(mh->_from_interpreted_entry == NULL, "initialized incorrectly"); // see link_method
|
||||
|
||||
// This is the entry used when we're in interpreter-only mode; see InterpreterMacroAssembler::jump_from_interpreted
|
||||
mh->_i2i_entry = mh->get_i2c_entry();
|
||||
// This must come last, as it is what's tested in LinkResolver::resolve_static_call
|
||||
Atomic::release_store(&mh->_from_interpreted_entry , mh->get_i2c_entry());
|
||||
} else if (!mh->is_method_handle_intrinsic()) {
|
||||
// Instantly compiled code can execute.
|
||||
mh->_from_interpreted_entry = mh->get_i2c_entry();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user