Chromium Code Reviews| Index: src/full-codegen/x64/full-codegen-x64.cc |
| diff --git a/src/full-codegen/x64/full-codegen-x64.cc b/src/full-codegen/x64/full-codegen-x64.cc |
| index 615eb67ba6459542be354eda2ecab900a787d471..a98f28fe55be5a5902c007cb03c6bed61010265e 100644 |
| --- a/src/full-codegen/x64/full-codegen-x64.cc |
| +++ b/src/full-codegen/x64/full-codegen-x64.cc |
| @@ -1871,8 +1871,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(rbx); |
| + __ SmiCompare(rbx, Smi::FromInt(JSGeneratorObject::RETURN)); |
| + __ j(not_equal, &resume); |
| + __ Push(result_register()); |
| + EmitCreateIteratorResult(true); |
| + EmitUnwindBeforeReturn(); |
| + EmitReturnSequence(); |
| __ bind(&suspend); |
| VisitForAccumulatorValue(expr->generator_object()); |
| @@ -1949,7 +1958,13 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
| __ jmp(&l_suspend); |
| __ bind(&l_continuation); |
| __ RecordGeneratorContinuation(); |
| - __ jmp(&l_resume); |
| + __ Pop(rbx); |
| + __ SmiCompare(rbx, Smi::FromInt(JSGeneratorObject::RETURN)); |
| + __ j(not_equal, &l_resume); |
| + __ Push(result_register()); |
| + EmitCreateIteratorResult(true); |
| + EmitUnwindBeforeReturn(); |
| + EmitReturnSequence(); |
|
Dan Ehrenberg
2016/01/20 23:48:21
Looks like you're supporting yield* here; what's t
|
| __ bind(&l_suspend); |
| const int generator_object_depth = kPointerSize + try_block_size; |
| @@ -2024,8 +2039,8 @@ void FullCodeGenerator::VisitYield(Yield* expr) { |
| } |
| -void FullCodeGenerator::EmitGeneratorResume(Expression *generator, |
| - Expression *value, |
| +void FullCodeGenerator::EmitGeneratorResume( |
| + Expression* generator, Expression* value, |
| JSGeneratorObject::ResumeMode resume_mode) { |
| // The value stays in rax, and is ultimately read by the resumed generator, as |
| // if CallRuntime(Runtime::kSuspendJSGeneratorObject) returned it. Or it |
| @@ -2083,6 +2098,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, |
| __ addp(rdx, rcx); |
| __ Move(FieldOperand(rbx, JSGeneratorObject::kContinuationOffset), |
| Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)); |
| + __ Push(Smi::FromInt(resume_mode)); // Consumed in continuation. |
|
Benedikt Meurer
2016/01/21 05:09:02
I'd vote for dedicated continuations instead of th
|
| __ jmp(rdx); |
| __ bind(&slow_resume); |
| } |
| @@ -2096,6 +2112,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, |
| __ Push(rcx); |
| __ jmp(&push_operand_holes); |
| __ bind(&call_resume); |
| + __ Push(Smi::FromInt(resume_mode)); // Consumed in continuation. |
| __ Push(rbx); |
| __ Push(result_register()); |
| __ Push(Smi::FromInt(resume_mode)); |