OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/crankshaft/arm64/lithium-arm64.h" | 5 #include "src/crankshaft/arm64/lithium-arm64.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/crankshaft/arm64/lithium-codegen-arm64.h" | 9 #include "src/crankshaft/arm64/lithium-codegen-arm64.h" |
10 #include "src/crankshaft/hydrogen-osr.h" | 10 #include "src/crankshaft/hydrogen-osr.h" |
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 instr = AssignEnvironment(instr); | 713 instr = AssignEnvironment(instr); |
714 } | 714 } |
715 chunk_->AddInstruction(instr, current_block_); | 715 chunk_->AddInstruction(instr, current_block_); |
716 | 716 |
717 if (instr->IsCall()) { | 717 if (instr->IsCall()) { |
718 HEnvironment* hydrogen_env = current_block_->last_environment(); | 718 HEnvironment* hydrogen_env = current_block_->last_environment(); |
719 HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; | 719 HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; |
720 DCHECK_NOT_NULL(hydrogen_env); | 720 DCHECK_NOT_NULL(hydrogen_env); |
721 if (instr->IsSyntacticTailCall()) { | 721 if (instr->IsSyntacticTailCall()) { |
722 // If it was a syntactic tail call we need to drop the current frame and | 722 // If it was a syntactic tail call we need to drop the current frame and |
723 // an arguments adaptor frame on top of it (if the latter is present). | 723 // all the frames on top of it that are either an arguments adaptor frame |
| 724 // or a tail caller frame. |
724 hydrogen_env = hydrogen_env->outer(); | 725 hydrogen_env = hydrogen_env->outer(); |
725 if (hydrogen_env != nullptr && | 726 while (hydrogen_env != nullptr && |
726 hydrogen_env->frame_type() == ARGUMENTS_ADAPTOR) { | 727 (hydrogen_env->frame_type() == ARGUMENTS_ADAPTOR || |
| 728 hydrogen_env->frame_type() == TAIL_CALLER_FUNCTION)) { |
727 hydrogen_env = hydrogen_env->outer(); | 729 hydrogen_env = hydrogen_env->outer(); |
728 } | 730 } |
729 if (hydrogen_env != nullptr) { | 731 if (hydrogen_env != nullptr) { |
730 // Push return value on top of outer environment. | 732 // Push return value on top of outer environment. |
731 hydrogen_env = hydrogen_env->Copy(); | 733 hydrogen_env = hydrogen_env->Copy(); |
732 hydrogen_env->Push(hydrogen_val); | 734 hydrogen_env->Push(hydrogen_val); |
733 } else { | 735 } else { |
734 // Although we don't need this lazy bailout for normal execution | 736 // Although we don't need this lazy bailout for normal execution |
735 // (because when we tail call from the outermost function we should pop | 737 // (because when we tail call from the outermost function we should pop |
736 // its frame) we still need it when debugger is on. | 738 // its frame) we still need it when debugger is on. |
(...skipping 1911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2648 | 2650 |
2649 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 2651 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
2650 LOperand* receiver = UseRegister(instr->receiver()); | 2652 LOperand* receiver = UseRegister(instr->receiver()); |
2651 LOperand* function = UseRegister(instr->function()); | 2653 LOperand* function = UseRegister(instr->function()); |
2652 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); | 2654 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); |
2653 return AssignEnvironment(DefineAsRegister(result)); | 2655 return AssignEnvironment(DefineAsRegister(result)); |
2654 } | 2656 } |
2655 | 2657 |
2656 } // namespace internal | 2658 } // namespace internal |
2657 } // namespace v8 | 2659 } // namespace v8 |
OLD | NEW |