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 40 function 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 49 function 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 58 function GeneratorFunctionPrototypeConstructor(x) { 59 if (%_IsConstructCall()) { 60 throw MakeTypeError('not_constructor', ['GeneratorFunctionPrototype']); 61 } 62 } 63 64 function 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 75 function 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 92 SetUpGenerators(); 93