| Index: src/compiler/bytecode-graph-builder.cc
|
| diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc
|
| index 14c97c832f18c2e9aa329f44c3e7838c6f31bfd3..d5e3ffd5d05559d316caf92ea91acddb8df1f5cf 100644
|
| --- a/src/compiler/bytecode-graph-builder.cc
|
| +++ b/src/compiler/bytecode-graph-builder.cc
|
| @@ -2277,15 +2277,20 @@ void BytecodeGraphBuilder::VisitSuspendGenerator() {
|
| Node* state = environment()->LookupAccumulator();
|
| Node* generator = environment()->LookupRegister(
|
| bytecode_iterator().GetRegisterOperand(0));
|
| + interpreter::Register first_reg = bytecode_iterator().GetRegisterOperand(1);
|
| + // We assume we are storing a range starting from index 0.
|
| + CHECK_EQ(0, first_reg.index());
|
| + int register_count =
|
| + static_cast<int>(bytecode_iterator().GetRegisterCountOperand(2));
|
| SuspendFlags flags = interpreter::SuspendGeneratorBytecodeFlags::Decode(
|
| - bytecode_iterator().GetFlagOperand(1));
|
| + bytecode_iterator().GetFlagOperand(3));
|
| +
|
| // The offsets used by the bytecode iterator are relative to a different base
|
| // than what is used in the interpreter, hence the addition.
|
| Node* offset =
|
| jsgraph()->Constant(bytecode_iterator().current_offset() +
|
| (BytecodeArray::kHeaderSize - kHeapObjectTag));
|
|
|
| - int register_count = environment()->register_count();
|
| int value_input_count = 3 + register_count;
|
|
|
| Node** value_inputs = local_zone()->NewArray<Node*>(value_input_count);
|
| @@ -2301,21 +2306,31 @@ void BytecodeGraphBuilder::VisitSuspendGenerator() {
|
| value_input_count, value_inputs, false);
|
| }
|
|
|
| -void BytecodeGraphBuilder::VisitResumeGenerator() {
|
| +void BytecodeGraphBuilder::VisitRestoreGeneratorState() {
|
| Node* generator = environment()->LookupRegister(
|
| bytecode_iterator().GetRegisterOperand(0));
|
|
|
| + Node* state =
|
| + NewNode(javascript()->GeneratorRestoreContinuation(), generator);
|
| +
|
| + environment()->BindAccumulator(state, Environment::kAttachFrameState);
|
| +}
|
| +
|
| +void BytecodeGraphBuilder::VisitRestoreGeneratorRegisters() {
|
| + Node* generator =
|
| + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
|
| + interpreter::Register first_reg = bytecode_iterator().GetRegisterOperand(1);
|
| + // We assume we are restoring registers starting fromm index 0.
|
| + CHECK_EQ(0, first_reg.index());
|
| + int register_count =
|
| + static_cast<int>(bytecode_iterator().GetRegisterCountOperand(2));
|
| +
|
| // Bijection between registers and array indices must match that used in
|
| // InterpreterAssembler::ExportRegisterFile.
|
| - for (int i = 0; i < environment()->register_count(); ++i) {
|
| + for (int i = 0; i < register_count; ++i) {
|
| Node* value = NewNode(javascript()->GeneratorRestoreRegister(i), generator);
|
| environment()->BindRegister(interpreter::Register(i), value);
|
| }
|
| -
|
| - Node* state =
|
| - NewNode(javascript()->GeneratorRestoreContinuation(), generator);
|
| -
|
| - environment()->BindAccumulator(state);
|
| }
|
|
|
| void BytecodeGraphBuilder::VisitWide() {
|
|
|