summaryrefslogtreecommitdiff
path: root/deps/v8/src/interpreter/control-flow-builders.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/interpreter/control-flow-builders.cc')
-rw-r--r--deps/v8/src/interpreter/control-flow-builders.cc36
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() {