| OLD | NEW |
| (Empty) |
| 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 (function(global, utils) { | |
| 6 | |
| 7 "use strict"; | |
| 8 | |
| 9 %CheckIsBootstrapping(); | |
| 10 | |
| 11 // ------------------------------------------------------------------- | |
| 12 // Imports | |
| 13 | |
| 14 var GeneratorFunctionPrototype = utils.ImportNow("GeneratorFunctionPrototype"); | |
| 15 var GeneratorFunction = utils.ImportNow("GeneratorFunction"); | |
| 16 var GlobalFunction = global.Function; | |
| 17 var MakeTypeError; | |
| 18 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); | |
| 19 | |
| 20 utils.Import(function(from) { | |
| 21 MakeTypeError = from.MakeTypeError; | |
| 22 }); | |
| 23 | |
| 24 // ---------------------------------------------------------------------------- | |
| 25 | |
| 26 // Generator functions and objects are specified by ES6, sections 15.19.3 and | |
| 27 // 15.19.4. | |
| 28 | |
| 29 function GeneratorObjectNext(value) { | |
| 30 if (!IS_GENERATOR(this)) { | |
| 31 throw MakeTypeError(kIncompatibleMethodReceiver, | |
| 32 '[Generator].prototype.next', this); | |
| 33 } | |
| 34 | |
| 35 var continuation = %GeneratorGetContinuation(this); | |
| 36 if (continuation > 0) { | |
| 37 // Generator is suspended. | |
| 38 DEBUG_PREPARE_STEP_IN_IF_STEPPING(this); | |
| 39 return %_GeneratorNext(this, value); | |
| 40 } else if (continuation == 0) { | |
| 41 // Generator is already closed. | |
| 42 return %_CreateIterResultObject(UNDEFINED, true); | |
| 43 } else { | |
| 44 // Generator is running. | |
| 45 throw MakeTypeError(kGeneratorRunning); | |
| 46 } | |
| 47 } | |
| 48 | |
| 49 | |
| 50 function GeneratorObjectReturn(value) { | |
| 51 if (!IS_GENERATOR(this)) { | |
| 52 throw MakeTypeError(kIncompatibleMethodReceiver, | |
| 53 '[Generator].prototype.return', this); | |
| 54 } | |
| 55 | |
| 56 var continuation = %GeneratorGetContinuation(this); | |
| 57 if (continuation > 0) { | |
| 58 // Generator is suspended. | |
| 59 DEBUG_PREPARE_STEP_IN_IF_STEPPING(this); | |
| 60 return %_GeneratorReturn(this, value); | |
| 61 } else if (continuation == 0) { | |
| 62 // Generator is already closed. | |
| 63 return %_CreateIterResultObject(value, true); | |
| 64 } else { | |
| 65 // Generator is running. | |
| 66 throw MakeTypeError(kGeneratorRunning); | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 | |
| 71 function GeneratorObjectThrow(exn) { | |
| 72 if (!IS_GENERATOR(this)) { | |
| 73 throw MakeTypeError(kIncompatibleMethodReceiver, | |
| 74 '[Generator].prototype.throw', this); | |
| 75 } | |
| 76 | |
| 77 var continuation = %GeneratorGetContinuation(this); | |
| 78 if (continuation > 0) { | |
| 79 // Generator is suspended. | |
| 80 DEBUG_PREPARE_STEP_IN_IF_STEPPING(this); | |
| 81 return %_GeneratorThrow(this, exn); | |
| 82 } else if (continuation == 0) { | |
| 83 // Generator is already closed. | |
| 84 throw exn; | |
| 85 } else { | |
| 86 // Generator is running. | |
| 87 throw MakeTypeError(kGeneratorRunning); | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 // ---------------------------------------------------------------------------- | |
| 92 | |
| 93 // None of the three resume operations (Runtime_GeneratorNext, | |
| 94 // Runtime_GeneratorReturn, Runtime_GeneratorThrow) is supported by | |
| 95 // Crankshaft or TurboFan. Disable optimization of wrappers here. | |
| 96 %NeverOptimizeFunction(GeneratorObjectNext); | |
| 97 %NeverOptimizeFunction(GeneratorObjectReturn); | |
| 98 %NeverOptimizeFunction(GeneratorObjectThrow); | |
| 99 | |
| 100 // Set up non-enumerable functions on the generator prototype object. | |
| 101 var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype; | |
| 102 utils.InstallFunctions(GeneratorObjectPrototype, | |
| 103 DONT_ENUM, | |
| 104 ["next", GeneratorObjectNext, | |
| 105 "return", GeneratorObjectReturn, | |
| 106 "throw", GeneratorObjectThrow]); | |
| 107 | |
| 108 %AddNamedProperty(GeneratorObjectPrototype, "constructor", | |
| 109 GeneratorFunctionPrototype, DONT_ENUM | READ_ONLY); | |
| 110 %AddNamedProperty(GeneratorObjectPrototype, | |
| 111 toStringTagSymbol, "Generator", DONT_ENUM | READ_ONLY); | |
| 112 %InternalSetPrototype(GeneratorFunctionPrototype, GlobalFunction.prototype); | |
| 113 %AddNamedProperty(GeneratorFunctionPrototype, | |
| 114 toStringTagSymbol, "GeneratorFunction", DONT_ENUM | READ_ONLY); | |
| 115 %AddNamedProperty(GeneratorFunctionPrototype, "constructor", | |
| 116 GeneratorFunction, DONT_ENUM | READ_ONLY); | |
| 117 %InternalSetPrototype(GeneratorFunction, GlobalFunction); | |
| 118 | |
| 119 }) | |
| OLD | NEW |