< 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(&reg_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 >