diff options
Diffstat (limited to 'deps/v8/src/interpreter/control-flow-builders.cc')
-rw-r--r-- | deps/v8/src/interpreter/control-flow-builders.cc | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/deps/v8/src/interpreter/control-flow-builders.cc b/deps/v8/src/interpreter/control-flow-builders.cc index 81041e6a3d..e4281667c2 100644 --- a/deps/v8/src/interpreter/control-flow-builders.cc +++ b/deps/v8/src/interpreter/control-flow-builders.cc @@ -47,21 +47,40 @@ void BlockBuilder::EndBlock() { LoopBuilder::~LoopBuilder() { DCHECK(continue_labels_.empty() || continue_labels_.is_bound()); - DCHECK(header_labels_.empty() || header_labels_.is_bound()); + BindBreakTarget(); + // Restore the parent jump table. + if (generator_jump_table_location_ != nullptr) { + *generator_jump_table_location_ = parent_generator_jump_table_; + } } -void LoopBuilder::LoopHeader(ZoneVector<BytecodeLabel>* additional_labels) { +void LoopBuilder::LoopHeader() { // Jumps from before the loop header into the loop violate ordering // requirements of bytecode basic blocks. The only entry into a loop // must be the loop header. Surely breaks is okay? Not if nested // and misplaced between the headers. DCHECK(break_labels_.empty() && continue_labels_.empty()); builder()->Bind(&loop_header_); - if (additional_labels != nullptr) { - for (auto& label : *additional_labels) { - builder()->Bind(&label); - } +} + +void LoopBuilder::LoopHeaderInGenerator( + BytecodeJumpTable** generator_jump_table, int first_resume_id, + int resume_count) { + // Bind all the resume points that are inside the loop to be at the loop + // header. + for (int id = first_resume_id; id < first_resume_id + resume_count; ++id) { + builder()->Bind(*generator_jump_table, id); } + + // Create the loop header. + LoopHeader(); + + // Create a new jump table for after the loop header for only these + // resume points. + generator_jump_table_location_ = generator_jump_table; + parent_generator_jump_table_ = *generator_jump_table; + *generator_jump_table = + builder()->AllocateJumpTable(resume_count, first_resume_id); } void LoopBuilder::JumpToHeader(int loop_depth) { @@ -74,11 +93,6 @@ void LoopBuilder::JumpToHeader(int loop_depth) { builder()->JumpLoop(&loop_header_, level); } -void LoopBuilder::EndLoop() { - BindBreakTarget(); - header_labels_.BindToLabel(builder(), loop_header_); -} - void LoopBuilder::BindContinueTarget() { continue_labels_.Bind(builder()); } SwitchBuilder::~SwitchBuilder() { |