Index: src/x64/builtins-x64.cc |
=================================================================== |
--- src/x64/builtins-x64.cc (revision 6418) |
+++ src/x64/builtins-x64.cc (working copy) |
@@ -561,7 +561,34 @@ |
static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, |
Deoptimizer::BailoutType type) { |
- __ int3(); |
+ // Enter an internal frame. |
+ __ EnterInternalFrame(); |
+ |
+ // Pass the function and deoptimization type to the runtime system. |
Kevin Millikin (Chromium)
2011/01/24 13:52:21
This comment isn't correct. We grab the function
Rico
2011/01/25 07:48:16
Done.
|
+ __ Push(Smi::FromInt(static_cast<int>(type))); |
+ |
+ __ CallRuntime(Runtime::kNotifyDeoptimized, 1); |
+ // Tear down temporary frame. |
+ __ LeaveInternalFrame(); |
+ |
+ // Get the full codegen state from the stack and untag it. |
+ __ movq(rcx, Operand(rsp, 1 * kPointerSize)); |
+ __ SmiToInteger32(rcx, rcx); |
Lasse Reichstein
2011/01/24 13:24:21
You can use
SmiToInteger32(rcx, Operand(rsp, 1 *
Rico
2011/01/24 13:40:14
Done.
|
+ |
+ // Switch on the state. |
+ NearLabel not_no_registers, not_tos_eax; |
Lasse Reichstein
2011/01/24 13:24:21
eax->rax
Rico
2011/01/24 13:40:14
Done.
|
+ __ cmpq(rcx, Immediate(FullCodeGenerator::NO_REGISTERS)); |
+ __ j(not_equal, ¬_no_registers); |
+ __ ret(1 * kPointerSize); // Remove state. |
+ |
+ __ bind(¬_no_registers); |
+ __ movq(rax, Operand(rsp, 2 * kPointerSize)); |
+ __ cmpq(rcx, Immediate(FullCodeGenerator::TOS_REG)); |
+ __ j(not_equal, ¬_tos_eax); |
+ __ ret(2 * kPointerSize); // Remove state, eax. |
+ |
+ __ bind(¬_tos_eax); |
+ __ Abort("no cases left"); |
} |
void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) { |