| Index: src/arm/full-codegen-arm.cc
|
| diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc
|
| index 3f229eb878a9e1d62ddcc8a07a83126427345e9c..94b80e2c40f90c33a9270274e4259d293e5b8cab 100644
|
| --- a/src/arm/full-codegen-arm.cc
|
| +++ b/src/arm/full-codegen-arm.cc
|
| @@ -2021,6 +2021,19 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| EmitReturnSequence();
|
|
|
| __ bind(&resume);
|
| + Label init_value_check_done;
|
| + if (expr->yield_kind() == Yield::INITIAL) {
|
| + // When value is provided and it is not undefined, throw error.
|
| + __ CompareRoot(result_register(), Heap::kUndefinedValueRootIndex);
|
| + __ b(eq, &init_value_check_done);
|
| + // This error should be raised from the Generator.prototype.next side.
|
| + // So in this case, we return the hole value as a marker. The caller
|
| + // checks the result value and if it is the hole value, the caller
|
| + // throws error.
|
| + __ Push(isolate()->factory()->the_hole_value());
|
| + __ jmp(&suspend);
|
| + }
|
| + __ bind(&init_value_check_done);
|
| context()->Plug(result_register());
|
| break;
|
| }
|
| @@ -2241,7 +2254,17 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| __ push(r1);
|
| __ CallRuntime(Runtime::kThrowGeneratorStateError, 1);
|
|
|
| + // Throw error if we attempt to pass a value to an unborn generator.
|
| + Label wrong_start;
|
| + __ bind(&wrong_start);
|
| + __ CallRuntime(Runtime::kThrowGeneratorStartError, 0);
|
| +
|
| __ bind(&done);
|
| + // When a value is passed to an unborn generator, the result becomes the hole
|
| + // value. And we need to throw GeneratorStartError in the caller side.
|
| + // (Generator.prototype.next)
|
| + __ CompareRoot(result_register(), Heap::kTheHoleValueRootIndex);
|
| + __ b(eq, &wrong_start);
|
| context()->Plug(result_register());
|
| }
|
|
|
|
|