Index: src/full-codegen/arm/full-codegen-arm.cc |
diff --git a/src/full-codegen/arm/full-codegen-arm.cc b/src/full-codegen/arm/full-codegen-arm.cc |
index cac5e6e7c3c9057cb9c2be61cdfd28efbc10bb5e..3faab7bf19f3b3edc14e4ddbe6c7169310688923 100644 |
--- a/src/full-codegen/arm/full-codegen-arm.cc |
+++ b/src/full-codegen/arm/full-codegen-arm.cc |
@@ -1928,8 +1928,17 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
__ jmp(&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). |
__ RecordGeneratorContinuation(); |
- __ jmp(&resume); |
+ __ pop(r1); |
+ __ cmp(r1, Operand(Smi::FromInt(JSGeneratorObject::RETURN))); |
+ __ b(ne, &resume); |
+ __ push(result_register()); |
+ EmitCreateIteratorResult(true); |
+ EmitUnwindBeforeReturn(); |
+ EmitReturnSequence(); |
__ bind(&suspend); |
VisitForAccumulatorValue(expr->generator_object()); |
@@ -1957,9 +1966,6 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
case Yield::kFinal: { |
VisitForAccumulatorValue(expr->generator_object()); |
- __ mov(r1, Operand(Smi::FromInt(JSGeneratorObject::kGeneratorClosed))); |
- __ str(r1, FieldMemOperand(result_register(), |
- JSGeneratorObject::kContinuationOffset)); |
// Pop value from top-of-stack slot, box result into result register. |
EmitCreateIteratorResult(true); |
EmitUnwindBeforeReturn(); |
@@ -2003,6 +2009,10 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
__ jmp(&l_suspend); |
__ bind(&l_continuation); |
__ RecordGeneratorContinuation(); |
+ __ pop(r1); |
+ // TODO(neis): Ignoring the resume mode here is clearly wrong. Currently, |
+ // return is not supported for yield*. The planned desugaring of yield* |
+ // using do-expressions will naturally solve this. |
__ jmp(&l_resume); |
__ bind(&l_suspend); |
@@ -2148,6 +2158,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, |
__ add(r3, r3, r2); |
__ mov(r2, Operand(Smi::FromInt(JSGeneratorObject::kGeneratorExecuting))); |
__ str(r2, FieldMemOperand(r1, JSGeneratorObject::kContinuationOffset)); |
+ __ Push(Smi::FromInt(resume_mode)); // Consumed in continuation. |
__ Jump(r3); |
} |
__ bind(&slow_resume); |
@@ -2162,6 +2173,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, |
__ push(r2); |
__ b(&push_operand_holes); |
__ bind(&call_resume); |
+ __ Push(Smi::FromInt(resume_mode)); // Consumed in continuation. |
DCHECK(!result_register().is(r1)); |
__ Push(r1, result_register()); |
__ Push(Smi::FromInt(resume_mode)); |