OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/interpreter/bytecode-flags.h" | 10 #include "src/interpreter/bytecode-flags.h" |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
657 // If we are resuming, perform state dispatch. | 657 // If we are resuming, perform state dispatch. |
658 BytecodeLabel not_resuming; | 658 BytecodeLabel not_resuming; |
659 builder() | 659 builder() |
660 ->LoadLiteral(Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)) | 660 ->LoadLiteral(Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)) |
661 .CompareOperation(Token::Value::EQ, generator_state_) | 661 .CompareOperation(Token::Value::EQ, generator_state_) |
662 .JumpIfTrue(¬_resuming); | 662 .JumpIfTrue(¬_resuming); |
663 BuildIndexedJump(generator_state_, first_yield, | 663 BuildIndexedJump(generator_state_, first_yield, |
664 stmt->yield_count(), generator_resume_points_); | 664 stmt->yield_count(), generator_resume_points_); |
665 builder()->Bind(¬_resuming); | 665 builder()->Bind(¬_resuming); |
666 } | 666 } |
667 | |
668 // Insert an explicit {OsrPoll} right after the loop header, to trigger | |
669 // on-stack replacement when armed for the given loop nesting depth. | |
rmcilroy
2016/07/25 12:40:23
Should this be before the generator resume logic (
Michael Starzinger
2016/07/25 13:40:48
Done. Yes, I am not 100% sure about interaction wi
rmcilroy
2016/07/26 09:26:44
Acknowledged.
| |
670 if (FLAG_ignition_osr) { | |
671 // TODO(4764): Merge this with another bytecode (e.g. {Jump} back edge). | |
672 // TODO(4764): Investigate interaction with generators. | |
673 // TODO(4764): Track and pass correct loop depth. | |
674 DCHECK_EQ(0, stmt->yield_count()); | |
675 builder()->OsrPoll(0); | |
676 } | |
667 } | 677 } |
668 | 678 |
669 void BytecodeGenerator::VisitGeneratorPrologue() { | 679 void BytecodeGenerator::VisitGeneratorPrologue() { |
670 // The generator resume trampoline abuses the new.target register both to | 680 // The generator resume trampoline abuses the new.target register both to |
671 // indicate that this is a resume call and to pass in the generator object. | 681 // indicate that this is a resume call and to pass in the generator object. |
672 // In ordinary calls, new.target is always undefined because generator | 682 // In ordinary calls, new.target is always undefined because generator |
673 // functions are non-constructable. | 683 // functions are non-constructable. |
674 Register generator_object = Register::new_target(); | 684 Register generator_object = Register::new_target(); |
675 BytecodeLabel regular_call; | 685 BytecodeLabel regular_call; |
676 builder() | 686 builder() |
(...skipping 2502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3179 return execution_context()->scope()->language_mode(); | 3189 return execution_context()->scope()->language_mode(); |
3180 } | 3190 } |
3181 | 3191 |
3182 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3192 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
3183 return TypeFeedbackVector::GetIndex(slot); | 3193 return TypeFeedbackVector::GetIndex(slot); |
3184 } | 3194 } |
3185 | 3195 |
3186 } // namespace interpreter | 3196 } // namespace interpreter |
3187 } // namespace internal | 3197 } // namespace internal |
3188 } // namespace v8 | 3198 } // namespace v8 |
OLD | NEW |