1// Copyright 2013 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5"use strict"; 6 7// This file relies on the fact that the following declarations have been made 8// in runtime.js: 9// var $Function = global.Function; 10 11// ---------------------------------------------------------------------------- 12 13 14// Generator functions and objects are specified by ES6, sections 15.19.3 and 15// 15.19.4. 16 17function GeneratorObjectNext(value) { 18 if (!IS_GENERATOR(this)) { 19 throw MakeTypeError('incompatible_method_receiver', 20 ['[Generator].prototype.next', this]); 21 } 22 23 if (DEBUG_IS_ACTIVE) %DebugPrepareStepInIfStepping(this); 24 return %_GeneratorNext(this, value); 25} 26 27function GeneratorObjectThrow(exn) { 28 if (!IS_GENERATOR(this)) { 29 throw MakeTypeError('incompatible_method_receiver', 30 ['[Generator].prototype.throw', this]); 31 } 32 33 return %_GeneratorThrow(this, exn); 34} 35 36function GeneratorObjectIterator() { 37 return this; 38} 39 40function GeneratorFunctionPrototypeConstructor(x) { 41 if (%_IsConstructCall()) { 42 throw MakeTypeError('not_constructor', ['GeneratorFunctionPrototype']); 43 } 44} 45 46function GeneratorFunctionConstructor(arg1) { // length == 1 47 var source = NewFunctionString(arguments, 'function*'); 48 var global_proxy = %GlobalProxy(global); 49 // Compile the string in the constructor and not a helper so that errors 50 // appear to come from here. 51 var f = %_CallFunction(global_proxy, %CompileString(source, true)); 52 %FunctionMarkNameShouldPrintAsAnonymous(f); 53 return f; 54} 55 56 57function SetUpGenerators() { 58 %CheckIsBootstrapping(); 59 60 // Both Runtime_GeneratorNext and Runtime_GeneratorThrow are supported by 61 // neither Crankshaft nor TurboFan, disable optimization of wrappers here. 62 %NeverOptimizeFunction(GeneratorObjectNext); 63 %NeverOptimizeFunction(GeneratorObjectThrow); 64 65 // Set up non-enumerable functions on the generator prototype object. 66 var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype; 67 InstallFunctions(GeneratorObjectPrototype, 68 DONT_ENUM | DONT_DELETE | READ_ONLY, 69 ["next", GeneratorObjectNext, 70 "throw", GeneratorObjectThrow]); 71 72 %FunctionSetName(GeneratorObjectIterator, '[Symbol.iterator]'); 73 %AddNamedProperty(GeneratorObjectPrototype, symbolIterator, 74 GeneratorObjectIterator, DONT_ENUM | DONT_DELETE | READ_ONLY); 75 %AddNamedProperty(GeneratorObjectPrototype, "constructor", 76 GeneratorFunctionPrototype, DONT_ENUM | DONT_DELETE | READ_ONLY); 77 %InternalSetPrototype(GeneratorFunctionPrototype, $Function.prototype); 78 %SetCode(GeneratorFunctionPrototype, GeneratorFunctionPrototypeConstructor); 79 %AddNamedProperty(GeneratorFunctionPrototype, "constructor", 80 GeneratorFunction, DONT_ENUM | DONT_DELETE | READ_ONLY); 81 %InternalSetPrototype(GeneratorFunction, $Function); 82 %SetCode(GeneratorFunction, GeneratorFunctionConstructor); 83} 84 85SetUpGenerators(); 86