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