Index: src/x64/lithium-x64.cc |
=================================================================== |
--- src/x64/lithium-x64.cc (revision 6473) |
+++ src/x64/lithium-x64.cc (working copy) |
@@ -651,6 +651,22 @@ |
} |
+LInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment( |
+ LInstruction* instr, int ast_id) { |
+ ASSERT(instructions_pending_deoptimization_environment_ == NULL); |
+ ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); |
+ instructions_pending_deoptimization_environment_ = instr; |
+ pending_deoptimization_ast_id_ = ast_id; |
+ return instr; |
+} |
+ |
+ |
+void LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() { |
+ instructions_pending_deoptimization_environment_ = NULL; |
+ pending_deoptimization_ast_id_ = AstNode::kNoNumber; |
+} |
+ |
+ |
LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, |
HInstruction* hinstr, |
CanDeoptimize can_deoptimize) { |
@@ -660,8 +676,8 @@ |
if (hinstr->HasSideEffects()) { |
ASSERT(hinstr->next()->IsSimulate()); |
HSimulate* sim = HSimulate::cast(hinstr->next()); |
- ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); |
- pending_deoptimization_ast_id_ = sim->ast_id(); |
+ instr = SetInstructionPendingDeoptimizationEnvironment( |
+ instr, sim->ast_id()); |
} |
// If instruction does not have side-effects lazy deoptimization |
@@ -1625,11 +1641,12 @@ |
// If there is an instruction pending deoptimization environment create a |
// lazy bailout instruction to capture the environment. |
- if (pending_deoptimization_ast_id_ != AstNode::kNoNumber) { |
- ASSERT(pending_deoptimization_ast_id_ == instr->ast_id()); |
+ if (pending_deoptimization_ast_id_ == instr->ast_id()) { |
LLazyBailout* lazy_bailout = new LLazyBailout; |
LInstruction* result = AssignEnvironment(lazy_bailout); |
- pending_deoptimization_ast_id_ = AstNode::kNoNumber; |
+ instructions_pending_deoptimization_environment_-> |
+ set_deoptimization_environment(result->environment()); |
+ ClearInstructionPendingDeoptimizationEnvironment(); |
return result; |
} |