| Index: src/interpreter/interpreter-generator.cc
|
| diff --git a/src/interpreter/interpreter-generator.cc b/src/interpreter/interpreter-generator.cc
|
| index 85a15b2389b9cff57452cd0957b7e6be093fdd1a..51441a07d4ecf0f59276f494ebb3417b912c573c 100644
|
| --- a/src/interpreter/interpreter-generator.cc
|
| +++ b/src/interpreter/interpreter-generator.cc
|
| @@ -3612,14 +3612,15 @@ IGNITION_HANDLER(Illegal, InterpreterAssembler) { Abort(kInvalidBytecode); }
|
| // No operation.
|
| IGNITION_HANDLER(Nop, InterpreterAssembler) { Dispatch(); }
|
|
|
| -// SuspendGenerator <generator>
|
| +// SuspendGenerator <generator> <first input register> <register count> <flags>
|
| //
|
| // Exports the register file and stores it into the generator. Also stores the
|
| // current context, the state given in the accumulator, and the current bytecode
|
| // offset (for debugging purposes) into the generator.
|
| IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) {
|
| Node* generator_reg = BytecodeOperandReg(0);
|
| - Node* flags = BytecodeOperandFlag(1);
|
| + Node* flags = BytecodeOperandFlag(3);
|
| +
|
| Node* generator = LoadRegister(generator_reg);
|
|
|
| Label if_stepping(this, Label::kDeferred), ok(this);
|
| @@ -3637,7 +3638,13 @@ IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) {
|
| Node* context = GetContext();
|
| Node* state = GetAccumulator();
|
|
|
| - ExportRegisterFile(array);
|
| + // Bytecode operand 1 should be always 0 (we are always store registers
|
| + // from the beginning).
|
| + CSA_ASSERT(this, WordEqual(BytecodeOperandReg(1),
|
| + IntPtrConstant(Register(0).ToOperand())));
|
| + // Bytecode operand 2 is the number of registers to store to the generator.
|
| + Node* register_count = ChangeUint32ToWord(BytecodeOperandCount(2));
|
| + ExportRegisterFile(array, register_count);
|
| StoreObjectField(generator, JSGeneratorObject::kContextOffset, context);
|
| StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, state);
|
|
|
| @@ -3686,18 +3693,14 @@ IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) {
|
| }
|
| }
|
|
|
| -// ResumeGenerator <generator>
|
| +// RestoreGeneratorState <generator>
|
| //
|
| -// Imports the register file stored in the generator. Also loads the
|
| -// generator's state and stores it in the accumulator, before overwriting it
|
| -// with kGeneratorExecuting.
|
| -IGNITION_HANDLER(ResumeGenerator, InterpreterAssembler) {
|
| +// Loads the generator's state and stores it in the accumulator,
|
| +// before overwriting it with kGeneratorExecuting.
|
| +IGNITION_HANDLER(RestoreGeneratorState, InterpreterAssembler) {
|
| Node* generator_reg = BytecodeOperandReg(0);
|
| Node* generator = LoadRegister(generator_reg);
|
|
|
| - ImportRegisterFile(
|
| - LoadObjectField(generator, JSGeneratorObject::kRegisterFileOffset));
|
| -
|
| Node* old_state =
|
| LoadObjectField(generator, JSGeneratorObject::kContinuationOffset);
|
| Node* new_state = Int32Constant(JSGeneratorObject::kGeneratorExecuting);
|
| @@ -3708,6 +3711,28 @@ IGNITION_HANDLER(ResumeGenerator, InterpreterAssembler) {
|
| Dispatch();
|
| }
|
|
|
| +// RestoreGeneratorRegisters <generator> <first output register> <register
|
| +// count>
|
| +//
|
| +// Imports the register file stored in the generator.
|
| +IGNITION_HANDLER(RestoreGeneratorRegisters, InterpreterAssembler) {
|
| + Node* generator_reg = BytecodeOperandReg(0);
|
| + // Bytecode operand 1 is the start register. It should always be 0, so let's
|
| + // ignore it.
|
| + CSA_ASSERT(this, WordEqual(BytecodeOperandReg(1),
|
| + IntPtrConstant(Register(0).ToOperand())));
|
| + // Bytecode operand 2 is the number of registers to store to the generator.
|
| + Node* register_count = ChangeUint32ToWord(BytecodeOperandCount(2));
|
| +
|
| + Node* generator = LoadRegister(generator_reg);
|
| +
|
| + ImportRegisterFile(
|
| + LoadObjectField(generator, JSGeneratorObject::kRegisterFileOffset),
|
| + register_count);
|
| +
|
| + Dispatch();
|
| +}
|
| +
|
| } // namespace
|
|
|
| Handle<Code> GenerateBytecodeHandler(Isolate* isolate, Bytecode bytecode,
|
|
|