< prev index next >
src/hotspot/share/interpreter/interpreterRuntime.cpp
Print this page
@@ -1835,10 +1835,26 @@
// before trying to fetch the native entry point and klass mirror.
// We must set the signature handler last, so that multiple processors
// preparing the same method will be sure to see non-null entry & mirror.
IRT_END
+IRT_ENTRY(void, InterpreterRuntime::deoptimize_caller_frame_for_vt(JavaThread* thread, Method* callee))
+ // Called from within the owner thread, so no need for safepoint
+ if (!callee->is_known_returning_vt() && !callee->is_known_not_returning_vt()) {
+ callee->check_returning_vt(thread);
+ }
+ if (!callee->is_known_returning_vt()) {
+ // deoptimize the caller only if it was compiled code that's calling a method that returns
+ // a value type. In this case, the return type must have already been resolved.
+ return;
+ }
+ RegisterMap reg_map(thread);
+ frame last_frame = thread->last_frame();
+ frame caller_frame = last_frame.sender(®_map);
+ Deoptimization::deoptimize_frame(thread, caller_frame.id());
+IRT_END
+
#if defined(IA32) || defined(AMD64) || defined(ARM)
IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address))
if (src_address == dest_address) {
return;
}
< prev index next >