Chromium Code Reviews| Index: src/interpreter/bytecode-generator.cc |
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
| index af7b9158e2e3d77e013c47f1db75366229e37acb..b0bfb7ee05abc79d356c510d8e2ed42a392e1cac 100644 |
| --- a/src/interpreter/bytecode-generator.cc |
| +++ b/src/interpreter/bytecode-generator.cc |
| @@ -570,7 +570,6 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) |
| register_allocator_(nullptr), |
| generator_resume_points_(info->literal()->yield_count(), info->zone()), |
| generator_state_(), |
| - generator_yields_seen_(0), |
| try_catch_nesting_level_(0), |
| try_finally_nesting_level_(0) { |
| InitializeAstVisitor(isolate()); |
| @@ -667,8 +666,8 @@ void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt, |
| // 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()); |
| - for (size_t id = generator_yields_seen_; |
| - id < generator_yields_seen_ + stmt->yield_count(); id++) { |
| + size_t first = stmt->first_yield_id(); |
|
Jarin
2016/04/28 16:31:18
I am mildly surprised this works is not first_yiel
neis
2016/04/29 07:52:24
signed to unsigned is always "fine" as far as I kn
|
| + for (size_t id = first; id < first + stmt->yield_count(); id++) { |
| DCHECK(0 <= id && id < generator_resume_points_.size()); |
| auto& label = generator_resume_points_[id]; |
| resume_points_in_loop.push_back(label); |
| @@ -685,8 +684,8 @@ void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt, |
| ->LoadLiteral(Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)) |
| .CompareOperation(Token::Value::EQ, generator_state_) |
| .JumpIfTrue(¬_resuming); |
| - BuildIndexedJump(generator_state_, generator_yields_seen_, |
| - stmt->yield_count(), generator_resume_points_); |
| + BuildIndexedJump( |
| + generator_state_, first, stmt->yield_count(), generator_resume_points_); |
| builder()->Bind(¬_resuming); |
| } |
| } |
| @@ -2266,8 +2265,6 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| } |
| void BytecodeGenerator::VisitYield(Yield* expr) { |
| - size_t id = generator_yields_seen_++; |
| - |
| builder()->SetExpressionPosition(expr); |
| Register value = VisitForRegisterValue(expr->expression()); |
| @@ -2275,12 +2272,12 @@ void BytecodeGenerator::VisitYield(Yield* expr) { |
| // Save context, registers, and state. Then return. |
| builder() |
| - ->LoadLiteral(Smi::FromInt(static_cast<int>(id))) |
| + ->LoadLiteral(Smi::FromInt(expr->id())) |
| .SuspendGenerator(generator) |
| .LoadAccumulatorWithRegister(value) |
| .Return(); // Hard return (ignore any finally blocks). |
| - builder()->Bind(&(generator_resume_points_[id])); |
| + builder()->Bind(&(generator_resume_points_[expr->id()])); |
| // Upon resume, we continue here. |
| { |