| Index: src/interpreter/bytecode-generator.cc
|
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
|
| index 1200cacd0707baeb4b9dbaf7ffbb079fc94479ad..6568b22643c637fca09186e91e3305fcf7de4378 100644
|
| --- a/src/interpreter/bytecode-generator.cc
|
| +++ b/src/interpreter/bytecode-generator.cc
|
| @@ -722,22 +722,25 @@ void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt,
|
| LoopBuilder* loop_builder) {
|
| // Recall that stmt->yield_count() is always zero inside ordinary
|
| // (i.e. non-generator) functions.
|
| + if (stmt->yield_count() == 0) {
|
| + loop_builder->LoopHeader();
|
| + } else {
|
| + // Collect all labels for generator resume points within the loop (if any)
|
| + // so that they can be bound to the loop header below. Also create fresh
|
| + // labels for these resume points, to be used inside the loop.
|
| + ZoneVector<BytecodeLabel> resume_points_in_loop(zone());
|
| + size_t first_yield = stmt->first_yield_id();
|
| + DCHECK_LE(first_yield + stmt->yield_count(),
|
| + generator_resume_points_.size());
|
| + for (size_t id = first_yield; id < first_yield + stmt->yield_count();
|
| + id++) {
|
| + auto& label = generator_resume_points_[id];
|
| + resume_points_in_loop.push_back(label);
|
| + generator_resume_points_[id] = BytecodeLabel();
|
| + }
|
| +
|
| + loop_builder->LoopHeader(&resume_points_in_loop);
|
|
|
| - // Collect all labels for generator resume points within the loop (if any) so
|
| - // that they can be bound to the loop header below. Also create fresh labels
|
| - // for these resume points, to be used inside the loop.
|
| - ZoneVector<BytecodeLabel> resume_points_in_loop(zone());
|
| - size_t first_yield = stmt->first_yield_id();
|
| - DCHECK_LE(first_yield + stmt->yield_count(), generator_resume_points_.size());
|
| - for (size_t id = first_yield; id < first_yield + stmt->yield_count(); id++) {
|
| - auto& label = generator_resume_points_[id];
|
| - resume_points_in_loop.push_back(label);
|
| - generator_resume_points_[id] = BytecodeLabel();
|
| - }
|
| -
|
| - loop_builder->LoopHeader(&resume_points_in_loop);
|
| -
|
| - if (stmt->yield_count() > 0) {
|
| // If we are not resuming, fall through to loop body.
|
| // If we are resuming, perform state dispatch.
|
| BytecodeLabel not_resuming;
|
|
|