Index: src/interpreter/control-flow-builders.h |
diff --git a/src/interpreter/control-flow-builders.h b/src/interpreter/control-flow-builders.h |
index e4d376b9b21e90bdd1121589bcc28d6cc8de4924..3c87e86bd20701d55aaeb4f747d77bbb1340ffcb 100644 |
--- a/src/interpreter/control-flow-builders.h |
+++ b/src/interpreter/control-flow-builders.h |
@@ -82,16 +82,22 @@ class BlockBuilder final : public BreakableControlFlowBuilder { |
// their loop. |
class LoopBuilder final : public BreakableControlFlowBuilder { |
public: |
- explicit LoopBuilder(BytecodeArrayBuilder* builder) |
+ explicit LoopBuilder(BytecodeArrayBuilder* builder, int yield_count) |
: BreakableControlFlowBuilder(builder), |
+ yield_count(yield_count), |
continue_sites_(builder->zone()) {} |
~LoopBuilder(); |
void LoopHeader(); |
void Condition() { builder()->Bind(&condition_); } |
void Next() { builder()->Bind(&next_); } |
- void JumpToHeader() { builder()->Jump(&loop_header_); } |
- void JumpToHeaderIfTrue() { builder()->JumpIfTrue(&loop_header_); } |
+ void JumpToHeader(); |
+ void JumpToHeaderIfTrue() { |
+ BytecodeLabel no_jump; |
+ builder()->JumpIfFalse(&no_jump); |
+ JumpToHeader(); |
+ builder()->Bind(&no_jump); |
+ } |
void EndLoop(); |
// This method is called when visiting continue statements in the AST. |
@@ -102,6 +108,9 @@ class LoopBuilder final : public BreakableControlFlowBuilder { |
void ContinueIfUndefined() { EmitJumpIfUndefined(&continue_sites_); } |
void ContinueIfNull() { EmitJumpIfNull(&continue_sites_); } |
+ // Number of yields inside the loop. |
+ const int yield_count; |
+ |
private: |
void SetContinueTarget(const BytecodeLabel& continue_target); |