1// Copyright 2013 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28"use strict"; 29 30// This file relies on the fact that the following declarations have been made 31// in runtime.js: 32// var $Function = global.Function; 33 34// ---------------------------------------------------------------------------- 35 36 37// Generator functions and objects are specified by ES6, sections 15.19.3 and 38// 15.19.4. 39 40function GeneratorObjectNext(value) { 41 if (!IS_GENERATOR(this)) { 42 throw MakeTypeError('incompatible_method_receiver', 43 ['[Generator].prototype.next', this]); 44 } 45 46 return %_GeneratorNext(this, value); 47} 48 49function GeneratorObjectThrow(exn) { 50 if (!IS_GENERATOR(this)) { 51 throw MakeTypeError('incompatible_method_receiver', 52 ['[Generator].prototype.throw', this]); 53 } 54 55 return %_GeneratorThrow(this, exn); 56} 57 58function GeneratorFunctionPrototypeConstructor(x) { 59 if (%_IsConstructCall()) { 60 throw MakeTypeError('not_constructor', ['GeneratorFunctionPrototype']); 61 } 62} 63 64function GeneratorFunctionConstructor(arg1) { // length == 1 65 var source = NewFunctionString(arguments, 'function*'); 66 var global_receiver = %GlobalReceiver(global); 67 // Compile the string in the constructor and not a helper so that errors 68 // appear to come from here. 69 var f = %_CallFunction(global_receiver, %CompileString(source, true)); 70 %FunctionMarkNameShouldPrintAsAnonymous(f); 71 return f; 72} 73 74 75function SetUpGenerators() { 76 %CheckIsBootstrapping(); 77 var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype; 78 InstallFunctions(GeneratorObjectPrototype, 79 DONT_ENUM | DONT_DELETE | READ_ONLY, 80 ["next", GeneratorObjectNext, 81 "throw", GeneratorObjectThrow]); 82 %SetProperty(GeneratorObjectPrototype, "constructor", 83 GeneratorFunctionPrototype, DONT_ENUM | DONT_DELETE | READ_ONLY); 84 %SetPrototype(GeneratorFunctionPrototype, $Function.prototype); 85 %SetCode(GeneratorFunctionPrototype, GeneratorFunctionPrototypeConstructor); 86 %SetProperty(GeneratorFunctionPrototype, "constructor", 87 GeneratorFunction, DONT_ENUM | DONT_DELETE | READ_ONLY); 88 %SetPrototype(GeneratorFunction, $Function); 89 %SetCode(GeneratorFunction, GeneratorFunctionConstructor); 90} 91 92SetUpGenerators(); 93