Chromium Code Reviews| Index: src/interpreter/interpreter-generator.cc |
| diff --git a/src/interpreter/interpreter-generator.cc b/src/interpreter/interpreter-generator.cc |
| index 85a15b2389b9cff57452cd0957b7e6be093fdd1a..8db8adc568a5dc5aa960ebf6c06ce7bfaae36d4b 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> <input-register-list> <flags> |
|
rmcilroy
2017/06/01 10:44:44
nit - <input-register-list> -> <first input regist
Jarin
2017/06/01 12:48:22
Done.
|
| // |
| // 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,9 @@ IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) { |
| Node* context = GetContext(); |
| Node* state = GetAccumulator(); |
| - ExportRegisterFile(array); |
| + // Bytecode operand 2 is the number of registers to store to the generator. |
|
rmcilroy
2017/06/01 10:44:44
You don't ever check operand 1 - could you add a C
Jarin
2017/06/01 12:48:22
Done.
|
| + Node* register_count = ChangeUint32ToWord(BytecodeOperandCount(2)); |
| + ExportRegisterFile(array, register_count); |
| StoreObjectField(generator, JSGeneratorObject::kContextOffset, context); |
| StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, state); |
| @@ -3688,16 +3691,12 @@ IGNITION_HANDLER(SuspendGenerator, InterpreterAssembler) { |
| // ResumeGenerator <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. |
| +// Loads the generator's state and stores it in the accumulator, |
| +// before overwriting it with kGeneratorExecuting. |
| IGNITION_HANDLER(ResumeGenerator, 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 +3707,26 @@ IGNITION_HANDLER(ResumeGenerator, InterpreterAssembler) { |
| Dispatch(); |
| } |
| +// RestoreGeneratorRegisters <generator> <output-register-list> |
|
rmcilroy
2017/06/01 10:44:44
nit - <output-register-list> -> <first output regi
Jarin
2017/06/01 12:48:22
Done.
|
| +// |
| +// 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. |
|
rmcilroy
2017/06/01 10:44:44
Please add a CSA assert
Jarin
2017/06/01 12:48:22
Done.
|
| + // 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); |
| + SetAccumulator(generator); |
| + |
| + Dispatch(); |
| +} |
| + |
| } // namespace |
| Handle<Code> GenerateBytecodeHandler(Isolate* isolate, Bytecode bytecode, |