Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(505)

Unified Diff: src/arm/full-codegen-arm.cc

Issue 139653003: Throw a TypeError when calling "next" method of a newly created generator with a value (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/ia32/full-codegen-ia32.cc » ('j') | src/ia32/full-codegen-ia32.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm/full-codegen-arm.cc
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc
index b787f69c50cb3a79bda22b3cd27de0dcb8c5ff03..3dc11a5c72851bd20270668bb3cc589c800fbee4 100644
--- a/src/arm/full-codegen-arm.cc
+++ b/src/arm/full-codegen-arm.cc
@@ -2000,6 +2000,10 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
ASSERT(continuation.pos() > 0 && Smi::IsValid(continuation.pos()));
__ mov(r1, Operand(Smi::FromInt(continuation.pos())));
__ str(r1, FieldMemOperand(r0, JSGeneratorObject::kContinuationOffset));
+ if (expr->yield_kind() == Yield::INITIAL) {
+ __ str(r1,
+ FieldMemOperand(r0, JSGeneratorObject::kSuspendedStartOffset));
+ }
__ str(cp, FieldMemOperand(r0, JSGeneratorObject::kContextOffset));
__ mov(r1, cp);
__ RecordWriteField(r0, JSGeneratorObject::kContextOffset, r1, r2,
@@ -2126,13 +2130,18 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
__ pop(r1);
// Check generator state.
- Label wrong_state, closed_state, done;
+ Label wrong_state, closed_state, suspended_start_state, resume_state, done;
__ ldr(r3, FieldMemOperand(r1, JSGeneratorObject::kContinuationOffset));
STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting < 0);
STATIC_ASSERT(JSGeneratorObject::kGeneratorClosed == 0);
__ cmp(r3, Operand(Smi::FromInt(0)));
__ b(eq, &closed_state);
__ b(lt, &wrong_state);
+ __ ldr(r2, FieldMemOperand(r1, JSGeneratorObject::kSuspendedStartOffset));
+ __ cmp(r3, r2);
+ __ b(eq, &suspended_start_state);
+
+ __ bind(&resume_state);
// Load suspended function and context.
__ ldr(cp, FieldMemOperand(r1, JSGeneratorObject::kContextOffset));
@@ -2207,6 +2216,30 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
// Not reached: the runtime call returns elsewhere.
__ stop("not-reached");
+ // Throw the provided value.
+ Label throw_provided_value;
+ __ bind(&throw_provided_value);
+ if (resume_mode != JSGeneratorObject::NEXT) {
+ __ push(r0);
+ __ CallRuntime(Runtime::kThrow, 1);
+ __ jmp(&done);
+ }
+
+ // Reach here when calling initial resume to a generator.
+ __ bind(&suspended_start_state);
+ if (resume_mode == JSGeneratorObject::NEXT) {
+ // When value is provided and it is not undefined, throw error.
+ __ CompareRoot(r0, Heap::kUndefinedValueRootIndex);
+ __ b(eq, &resume_state);
+ __ CallRuntime(Runtime::kThrowGeneratorStartError, 1);
+ __ jmp(&done);
+ } else {
+ // Make generator's state to "closed".
+ __ mov(r2, Operand(Smi::FromInt(JSGeneratorObject::kGeneratorClosed)));
+ __ str(r2, FieldMemOperand(r1, JSGeneratorObject::kContinuationOffset));
+ __ jmp(&throw_provided_value);
+ }
+
// Reach here when generator is closed.
__ bind(&closed_state);
if (resume_mode == JSGeneratorObject::NEXT) {
@@ -2215,12 +2248,10 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
__ push(r2);
// Pop value from top-of-stack slot; box result into result register.
EmitCreateIteratorResult(true);
+ __ jmp(&done);
} else {
- // Throw the provided value.
- __ push(r0);
- __ CallRuntime(Runtime::kThrow, 1);
+ __ jmp(&throw_provided_value);
}
- __ jmp(&done);
// Throw error if we attempt to operate on a running generator.
__ bind(&wrong_state);
« no previous file with comments | « no previous file | src/ia32/full-codegen-ia32.cc » ('j') | src/ia32/full-codegen-ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698