Commit b8f9e955 authored by jyan's avatar jyan Committed by Commit bot

S390: [generators] Store the resume mode in the generator object.

port 2e329666

Original Commit Message:
    ... instead of doing stack magic.  This is a cleanup in preparation for the new
    generators implementation.

R=bmeurer@chromium.org, neis@chromium.org, joransiu@ca.ibm.com, michael_dawson@ca.ibm.com, mbrandy@us.ibm.com, bjaideep@ca.ibm.com
BUG=

Review URL: https://codereview.chromium.org/1882553003

Cr-Commit-Position: refs/heads/master@{#35417}
parent 3dab9ba7
......@@ -1758,11 +1758,10 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
__ b(&suspend);
__ bind(&continuation);
// When we arrive here, the stack top is the resume mode and
// result_register() holds the input value (the argument given to the
// respective resume operation).
// When we arrive here, r2 holds the generator object.
__ RecordGeneratorContinuation();
__ pop(r3);
__ LoadP(r3, FieldMemOperand(r2, JSGeneratorObject::kResumeModeOffset));
__ LoadP(r2, FieldMemOperand(r2, JSGeneratorObject::kInputOffset));
STATIC_ASSERT(JSGeneratorObject::kNext < JSGeneratorObject::kReturn);
STATIC_ASSERT(JSGeneratorObject::kThrow > JSGeneratorObject::kReturn);
__ CmpSmiLiteral(r3, Smi::FromInt(JSGeneratorObject::kReturn), r0);
......
......@@ -708,6 +708,9 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ RecordWriteField(r3, JSGeneratorObject::kInputOffset, r2, r5,
kLRHasNotBeenSaved, kDontSaveFPRegs);
// Store resume mode into generator object.
__ StoreP(r4, FieldMemOperand(r3, JSGeneratorObject::kResumeModeOffset));
// Load suspended function and context.
__ LoadP(cp, FieldMemOperand(r3, JSGeneratorObject::kContextOffset));
__ LoadP(r6, FieldMemOperand(r3, JSGeneratorObject::kFunctionOffset));
......@@ -791,17 +794,11 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ bind(&done_loop);
}
// Push resume mode (consumed in continuation).
__ Push(r4);
// Reset operand stack so we don't leak.
__ LoadRoot(ip, Heap::kEmptyFixedArrayRootIndex);
__ StoreP(ip, FieldMemOperand(r3, JSGeneratorObject::kOperandStackOffset),
r0);
// Restore value.
__ LoadP(r2, FieldMemOperand(r3, JSGeneratorObject::kInputOffset));
// Resume the generator function at the continuation.
__ LoadP(r5, FieldMemOperand(r6, JSFunction::kSharedFunctionInfoOffset));
__ LoadP(r5, FieldMemOperand(r5, SharedFunctionInfo::kCodeOffset));
......@@ -814,6 +811,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
__ LoadSmiLiteral(r4, Smi::FromInt(JSGeneratorObject::kGeneratorExecuting));
__ StoreP(r4, FieldMemOperand(r3, JSGeneratorObject::kContinuationOffset),
r0);
__ LoadRR(r2, r3); // Continuation expects generator object in r2.
__ Jump(r5);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment