 Chromium Code Reviews
 Chromium Code Reviews Issue 1867263002:
  [generators] Store the resume mode in the generator object.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1867263002:
  [generators] Store the resume mode in the generator object.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/x64/builtins-x64.cc | 
| diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc | 
| index d743d1c097225b1099e802f3bff1ec1f228b710f..a7cf8a47718709023098e437dc87051562d50a51 100644 | 
| --- a/src/x64/builtins-x64.cc | 
| +++ b/src/x64/builtins-x64.cc | 
| @@ -479,6 +479,11 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { | 
| __ RecordWriteField(rbx, JSGeneratorObject::kInputOffset, rax, rcx, | 
| kDontSaveFPRegs); | 
| + // Store resume mode into generator object. | 
| + __ movp(FieldOperand(rbx, JSGeneratorObject::kResumeModeOffset), rdx); | 
| + __ RecordWriteField(rbx, JSGeneratorObject::kResumeModeOffset, rdx, rcx, | 
| 
Benedikt Meurer
2016/04/08 10:20:14
You don't need a write barrier, the resume mode is
 | 
| + kDontSaveFPRegs); | 
| + | 
| // Load suspended function and context. | 
| __ movp(rsi, FieldOperand(rbx, JSGeneratorObject::kContextOffset)); | 
| __ movp(rdi, FieldOperand(rbx, JSGeneratorObject::kFunctionOffset)); | 
| @@ -559,16 +564,12 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { | 
| __ bind(&done_loop); | 
| } | 
| - // Push resume mode (consumed in continuation). | 
| - __ Push(rdx); | 
| - | 
| // Reset operand stack so we don't leak. | 
| __ LoadRoot(FieldOperand(rbx, JSGeneratorObject::kOperandStackOffset), | 
| Heap::kEmptyFixedArrayRootIndex); | 
| - // Restore context and value. | 
| + // Restore context. | 
| __ movp(rsi, FieldOperand(rbx, JSGeneratorObject::kContextOffset)); | 
| - __ movp(rax, FieldOperand(rbx, JSGeneratorObject::kInputOffset)); | 
| // Resume the generator function at the continuation. | 
| __ movp(rdx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 
| @@ -578,6 +579,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { | 
| __ leap(rdx, FieldOperand(rdx, rcx, times_1, Code::kHeaderSize)); | 
| __ Move(FieldOperand(rbx, JSGeneratorObject::kContinuationOffset), | 
| Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)); | 
| + __ movp(rax, rbx); // Continuation expects generator object in rax. | 
| __ jmp(rdx); | 
| } |