OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" |
10 #include "src/compiler/instruction-selector-impl.h" | 10 #include "src/compiler/instruction-selector-impl.h" |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 // follows (n is the number of value inputs to the frame state): | 608 // follows (n is the number of value inputs to the frame state): |
609 // arg 1 : deoptimization id. | 609 // arg 1 : deoptimization id. |
610 // arg 2 - arg (n + 1) : value inputs to the frame state. | 610 // arg 2 - arg (n + 1) : value inputs to the frame state. |
611 size_t frame_state_entries = 0; | 611 size_t frame_state_entries = 0; |
612 USE(frame_state_entries); // frame_state_entries is only used for debug. | 612 USE(frame_state_entries); // frame_state_entries is only used for debug. |
613 if (buffer->frame_state_descriptor != nullptr) { | 613 if (buffer->frame_state_descriptor != nullptr) { |
614 Node* frame_state = | 614 Node* frame_state = |
615 call->InputAt(static_cast<int>(buffer->descriptor->InputCount())); | 615 call->InputAt(static_cast<int>(buffer->descriptor->InputCount())); |
616 | 616 |
617 // If it was a syntactic tail call we need to drop the current frame and | 617 // If it was a syntactic tail call we need to drop the current frame and |
618 // an arguments adaptor frame on top of it (if the latter is present). | 618 // all the frames on top of it that are either an arguments adaptor frame |
| 619 // or a tail caller frame. |
619 if (buffer->descriptor->SupportsTailCalls()) { | 620 if (buffer->descriptor->SupportsTailCalls()) { |
620 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0); | 621 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0); |
621 buffer->frame_state_descriptor = | 622 buffer->frame_state_descriptor = |
622 buffer->frame_state_descriptor->outer_state(); | 623 buffer->frame_state_descriptor->outer_state(); |
623 | 624 while (buffer->frame_state_descriptor != nullptr && |
624 if (buffer->frame_state_descriptor != nullptr && | 625 (buffer->frame_state_descriptor->type() == |
625 buffer->frame_state_descriptor->type() == | 626 FrameStateType::kArgumentsAdaptor || |
626 FrameStateType::kArgumentsAdaptor) { | 627 buffer->frame_state_descriptor->type() == |
| 628 FrameStateType::kTailCallerFunction)) { |
627 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0); | 629 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0); |
628 buffer->frame_state_descriptor = | 630 buffer->frame_state_descriptor = |
629 buffer->frame_state_descriptor->outer_state(); | 631 buffer->frame_state_descriptor->outer_state(); |
630 } | 632 } |
631 } | 633 } |
632 | 634 |
633 InstructionSequence::StateId state_id = | 635 InstructionSequence::StateId state_id = |
634 sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor); | 636 sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor); |
635 buffer->instruction_args.push_back(g.TempImmediate(state_id.ToInt())); | 637 buffer->instruction_args.push_back(g.TempImmediate(state_id.ToInt())); |
636 | 638 |
(...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1793 return new (instruction_zone()) FrameStateDescriptor( | 1795 return new (instruction_zone()) FrameStateDescriptor( |
1794 instruction_zone(), state_info.type(), state_info.bailout_id(), | 1796 instruction_zone(), state_info.type(), state_info.bailout_id(), |
1795 state_info.state_combine(), parameters, locals, stack, | 1797 state_info.state_combine(), parameters, locals, stack, |
1796 state_info.shared_info(), outer_state); | 1798 state_info.shared_info(), outer_state); |
1797 } | 1799 } |
1798 | 1800 |
1799 | 1801 |
1800 } // namespace compiler | 1802 } // namespace compiler |
1801 } // namespace internal | 1803 } // namespace internal |
1802 } // namespace v8 | 1804 } // namespace v8 |
OLD | NEW |