Chromium Code Reviews| Index: src/interpreter/interpreter.cc |
| diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
| index d24750aaf24dd5591115a30e6f2e54b742da12f4..d48fccf6ca8b4054090fd5de3a79054da2fc8990 100644 |
| --- a/src/interpreter/interpreter.cc |
| +++ b/src/interpreter/interpreter.cc |
| @@ -1685,6 +1685,48 @@ void Interpreter::DoIllegal(InterpreterAssembler* assembler) { |
| __ Abort(kInvalidBytecode); |
| } |
| +// SuspendGenerator <generator> |
| +// |
| +// Exports the register file and stores it into the generator. Also stores the |
| +// current context and the given state. |
|
rmcilroy
2016/04/21 10:21:32
nit - s/the given state/the state given in the acc
neis
2016/04/21 11:30:15
Done.
|
| +void Interpreter::DoSuspendGenerator(InterpreterAssembler* assembler) { |
| + Node* generator_reg = __ BytecodeOperandReg(0); |
| + Node* generator = __ LoadRegister(generator_reg); |
| + |
| + Node* array = __ ExportRegisterFile(); |
| + Node* context = __ GetContext(); |
| + Node* state = __ GetAccumulator(); |
| + |
| + __ StoreObjectField(generator, JSGeneratorObject::kOperandStackOffset, array); |
| + __ StoreObjectField(generator, JSGeneratorObject::kContextOffset, context); |
| + __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, state); |
| + |
| + __ Dispatch(); |
| +} |
| + |
| +// ResumeGenerator <generator> |
| +// |
| +// Imports the register file stored in the generator. Also loads the |
| +// generator's state, before overwriting it with kGeneratorExecuting. |
|
rmcilroy
2016/04/21 10:21:32
nit - Also loads the generator's state and stores
neis
2016/04/21 11:30:15
Done.
|
| +void Interpreter::DoResumeGenerator(InterpreterAssembler* assembler) { |
| + Node* generator_reg = __ BytecodeOperandReg(0); |
| + Node* generator = __ LoadRegister(generator_reg); |
| + |
| + __ ImportRegisterFile( |
| + __ LoadObjectField(generator, JSGeneratorObject::kOperandStackOffset)); |
| + __ StoreObjectField(generator, JSGeneratorObject::kOperandStackOffset, |
| + __ HeapConstant(isolate_->factory()->empty_fixed_array())); |
| + |
| + Node* old_state = |
| + __ LoadObjectField(generator, JSGeneratorObject::kContinuationOffset); |
| + Node* new_state = __ Int32Constant(JSGeneratorObject::kGeneratorExecuting); |
| + __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| + __ SmiTag(new_state)); |
| + __ SetAccumulator(old_state); |
| + |
| + __ Dispatch(); |
| +} |
| + |
| } // namespace interpreter |
| } // namespace internal |
| } // namespace v8 |