Index: src/interpreter/control-flow-builders.cc |
diff --git a/src/interpreter/control-flow-builders.cc b/src/interpreter/control-flow-builders.cc |
index 1624712425392f6addf140473ede669b059f6760..56cd481f9cdd50c36e3cc2045a4aaa78ecf309e1 100644 |
--- a/src/interpreter/control-flow-builders.cc |
+++ b/src/interpreter/control-flow-builders.cc |
@@ -10,95 +10,53 @@ namespace interpreter { |
BreakableControlFlowBuilder::~BreakableControlFlowBuilder() { |
- DCHECK(break_sites_.empty()); |
+ DCHECK(break_labels_.empty() || break_labels_.is_bound()); |
} |
- |
-void BreakableControlFlowBuilder::SetBreakTarget(const BytecodeLabel& target) { |
- BindLabels(target, &break_sites_); |
-} |
- |
- |
-void BreakableControlFlowBuilder::EmitJump(ZoneVector<BytecodeLabel>* sites) { |
- sites->push_back(BytecodeLabel()); |
- builder()->Jump(&sites->back()); |
-} |
- |
- |
-void BreakableControlFlowBuilder::EmitJumpIfTrue( |
- ZoneVector<BytecodeLabel>* sites) { |
- sites->push_back(BytecodeLabel()); |
- builder()->JumpIfTrue(&sites->back()); |
+void BreakableControlFlowBuilder::BindBreakTarget() { |
+ break_labels_.Bind(builder()); |
} |
- |
-void BreakableControlFlowBuilder::EmitJumpIfFalse( |
- ZoneVector<BytecodeLabel>* sites) { |
- sites->push_back(BytecodeLabel()); |
- builder()->JumpIfFalse(&sites->back()); |
-} |
- |
- |
-void BreakableControlFlowBuilder::EmitJumpIfUndefined( |
- ZoneVector<BytecodeLabel>* sites) { |
- sites->push_back(BytecodeLabel()); |
- builder()->JumpIfUndefined(&sites->back()); |
-} |
- |
- |
-void BreakableControlFlowBuilder::EmitJumpIfNull( |
- ZoneVector<BytecodeLabel>* sites) { |
- sites->push_back(BytecodeLabel()); |
- builder()->JumpIfNull(&sites->back()); |
+void BreakableControlFlowBuilder::EmitJump(BytecodeLabels* sites) { |
+ builder()->Jump(sites->New()); |
} |
- |
-void BreakableControlFlowBuilder::EmitJump(ZoneVector<BytecodeLabel>* sites, |
- int index) { |
- builder()->Jump(&sites->at(index)); |
+void BreakableControlFlowBuilder::EmitJumpIfTrue(BytecodeLabels* sites) { |
+ builder()->JumpIfTrue(sites->New()); |
} |
- |
-void BreakableControlFlowBuilder::EmitJumpIfTrue( |
- ZoneVector<BytecodeLabel>* sites, int index) { |
- builder()->JumpIfTrue(&sites->at(index)); |
+void BreakableControlFlowBuilder::EmitJumpIfFalse(BytecodeLabels* sites) { |
+ builder()->JumpIfFalse(sites->New()); |
} |
- |
-void BreakableControlFlowBuilder::EmitJumpIfFalse( |
- ZoneVector<BytecodeLabel>* sites, int index) { |
- builder()->JumpIfFalse(&sites->at(index)); |
+void BreakableControlFlowBuilder::EmitJumpIfUndefined(BytecodeLabels* sites) { |
+ builder()->JumpIfUndefined(sites->New()); |
} |
- |
-void BreakableControlFlowBuilder::BindLabels(const BytecodeLabel& target, |
- ZoneVector<BytecodeLabel>* sites) { |
- for (size_t i = 0; i < sites->size(); i++) { |
- BytecodeLabel& site = sites->at(i); |
- builder()->Bind(target, &site); |
- } |
- sites->clear(); |
+void BreakableControlFlowBuilder::EmitJumpIfNull(BytecodeLabels* sites) { |
+ builder()->JumpIfNull(sites->New()); |
} |
void BlockBuilder::EndBlock() { |
builder()->Bind(&block_end_); |
- SetBreakTarget(block_end_); |
+ BindBreakTarget(); |
} |
- |
-LoopBuilder::~LoopBuilder() { DCHECK(continue_sites_.empty()); } |
- |
+LoopBuilder::~LoopBuilder() { |
+ DCHECK(continue_labels_.empty() || continue_labels_.is_bound()); |
+ DCHECK(header_labels_.empty() || header_labels_.is_bound()); |
+} |
void LoopBuilder::LoopHeader(ZoneVector<BytecodeLabel>* additional_labels) { |
// 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_sites_.empty() && continue_sites_.empty()); |
+ DCHECK(break_labels_.empty() && continue_labels_.empty()); |
builder()->Bind(&loop_header_); |
for (auto& label : *additional_labels) { |
- builder()->Bind(loop_header_, &label); |
+ builder()->Bind(&label); |
} |
} |
@@ -117,16 +75,11 @@ void LoopBuilder::JumpToHeaderIfTrue() { |
} |
void LoopBuilder::EndLoop() { |
- builder()->Bind(&loop_end_); |
- SetBreakTarget(loop_end_); |
-} |
- |
-void LoopBuilder::SetContinueTarget() { |
- BytecodeLabel target; |
- builder()->Bind(&target); |
- BindLabels(target, &continue_sites_); |
+ BindBreakTarget(); |
+ header_labels_.BindToLabel(builder(), loop_header_); |
} |
+void LoopBuilder::BindContinueTarget() { continue_labels_.Bind(builder()); } |
SwitchBuilder::~SwitchBuilder() { |
#ifdef DEBUG |
@@ -165,8 +118,7 @@ void TryFinallyBuilder::BeginTry(Register context) { |
void TryFinallyBuilder::LeaveTry() { |
- finalization_sites_.push_back(BytecodeLabel()); |
- builder()->Jump(&finalization_sites_.back()); |
+ builder()->Jump(finalization_sites_.New()); |
} |
@@ -180,14 +132,7 @@ void TryFinallyBuilder::BeginHandler() { |
builder()->MarkHandler(handler_id_, catch_prediction_); |
} |
- |
-void TryFinallyBuilder::BeginFinally() { |
- for (size_t i = 0; i < finalization_sites_.size(); i++) { |
- BytecodeLabel& site = finalization_sites_.at(i); |
- builder()->Bind(&site); |
- } |
-} |
- |
+void TryFinallyBuilder::BeginFinally() { finalization_sites_.Bind(builder()); } |
void TryFinallyBuilder::EndFinally() { |
// Nothing to be done here. |