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

Unified Diff: src/ia32/full-codegen-ia32.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 | « src/arm/full-codegen-arm.cc ('k') | src/messages.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ia32/full-codegen-ia32.cc
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc
index 14e3df61d10a867966d0f69c945263a4fb8f73bb..db2a137f5cf92ce40c4e47af9b153591a40b8bd8 100644
--- a/src/ia32/full-codegen-ia32.cc
+++ b/src/ia32/full-codegen-ia32.cc
@@ -1950,6 +1950,10 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
ASSERT(continuation.pos() > 0 && Smi::IsValid(continuation.pos()));
__ mov(FieldOperand(eax, JSGeneratorObject::kContinuationOffset),
Immediate(Smi::FromInt(continuation.pos())));
+ if (expr->yield_kind() == Yield::INITIAL) {
+ __ mov(FieldOperand(eax, JSGeneratorObject::kSuspendedStartOffset),
+ Immediate(Smi::FromInt(continuation.pos())));
+ }
__ mov(FieldOperand(eax, JSGeneratorObject::kContextOffset), esi);
__ mov(ecx, esi);
__ RecordWriteField(eax, JSGeneratorObject::kContextOffset, ecx, edx,
@@ -2082,13 +2086,17 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
__ pop(ebx);
// Check generator state.
- Label wrong_state, closed_state, done;
+ Label wrong_state, closed_state, suspended_start_state, resume_state, done;
STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting < 0);
STATIC_ASSERT(JSGeneratorObject::kGeneratorClosed == 0);
- __ cmp(FieldOperand(ebx, JSGeneratorObject::kContinuationOffset),
- Immediate(Smi::FromInt(0)));
+ __ mov(esi, FieldOperand(ebx, JSGeneratorObject::kContinuationOffset));
+ __ cmp(esi, Immediate(Smi::FromInt(0)));
__ j(equal, &closed_state);
__ j(less, &wrong_state);
+ __ cmp(esi, FieldOperand(ebx, JSGeneratorObject::kSuspendedStartOffset));
+ __ j(equal, &suspended_start_state);
+
+ __ bind(&resume_state);
// Load suspended function and context.
__ mov(esi, FieldOperand(ebx, JSGeneratorObject::kContextOffset));
@@ -2158,6 +2166,30 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
// Not reached: the runtime call returns elsewhere.
__ Abort(kGeneratorFailedToResume);
+ // Throw the provided value.
+ Label throw_provided_value;
+ __ bind(&throw_provided_value);
+ if (resume_mode != JSGeneratorObject::NEXT) {
+ __ push(eax);
+ __ 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(eax, Heap::kUndefinedValueRootIndex);
+ __ j(equal, &resume_state);
+ __ CallRuntime(Runtime::kThrowGeneratorStartError, 0);
+ __ jmp(&done);
+ } else {
+ // Make generator's state to "closed".
+ __ mov(FieldOperand(ebx, JSGeneratorObject::kContinuationOffset),
+ Immediate(Smi::FromInt(JSGeneratorObject::kGeneratorClosed)));
+ __ jmp(&throw_provided_value);
+ }
+
// Reach here when generator is closed.
__ bind(&closed_state);
if (resume_mode == JSGeneratorObject::NEXT) {
@@ -2165,12 +2197,10 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
__ push(Immediate(isolate()->factory()->undefined_value()));
// Pop value from top-of-stack slot; box result into result register.
EmitCreateIteratorResult(true);
+ __ jmp(&done);
} else {
- // Throw the provided value.
- __ push(eax);
- __ 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 | « src/arm/full-codegen-arm.cc ('k') | src/messages.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698