| 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;
|
| }
|
|
|
|
|