OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 // Flags: --ignition-generators --harmony-do-expressions | 5 // Flags: --ignition-generators --harmony-do-expressions |
6 // Flags: --allow-natives-syntax --turbo --turbo-from-bytecode | |
Michael Starzinger
2016/05/10 10:53:05
As discussed offline: Let's drop the --turbo --tur
neis
2016/05/10 11:32:06
Done.
| |
7 | |
8 | |
9 function MaybeOptimizeOrDeoptimize(f) { | |
10 let x = Math.random(); // --random-seed makes this deterministic | |
11 if (x <= 0.33) { | |
12 %OptimizeFunctionOnNextCall(f); | |
13 } else if (x <= 0.66) { | |
14 %DeoptimizeFunction(f); | |
15 } | |
16 } | |
17 | |
18 function Next(generator, ...args) { | |
19 MaybeOptimizeOrDeoptimize(%GeneratorGetFunction(generator)); | |
20 return generator.next(...args); | |
21 } | |
22 | |
23 function Return(generator, ...args) { | |
24 MaybeOptimizeOrDeoptimize(%GeneratorGetFunction(generator)); | |
25 return generator.return(...args); | |
26 } | |
27 | |
28 function Throw(generator, ...args) { | |
29 MaybeOptimizeOrDeoptimize(%GeneratorGetFunction(generator)); | |
30 return generator.throw(...args); | |
31 } | |
6 | 32 |
7 | 33 |
8 { // yield in try-catch | 34 { // yield in try-catch |
9 | 35 |
10 let g = function*() { | 36 let g = function*() { |
11 try {yield 1} catch (error) {assertEquals("caught", error)} | 37 try {yield 1} catch (error) {assertEquals("caught", error)} |
12 }; | 38 }; |
13 | 39 |
14 assertThrowsEquals(() => g().throw("not caught"), "not caught"); | 40 assertThrowsEquals(() => Throw(g(), "not caught"), "not caught"); |
15 | 41 |
16 { | 42 { |
17 let x = g(); | 43 let x = g(); |
18 assertEquals({value: 1, done: false}, x.next()); | 44 assertEquals({value: 1, done: false}, Next(x)); |
19 assertEquals({value: undefined, done: true}, x.throw("caught")); | 45 assertEquals({value: undefined, done: true}, Throw(x, "caught")); |
20 } | 46 } |
21 | 47 |
22 { | 48 { |
23 let x = g(); | 49 let x = g(); |
24 assertEquals({value: 1, done: false}, x.next()); | 50 assertEquals({value: 1, done: false}, Next(x)); |
25 assertEquals({value: undefined, done: true}, x.next()); | 51 assertEquals({value: undefined, done: true}, Next(x)); |
26 assertThrowsEquals(() => x.throw("not caught"), "not caught"); | 52 assertThrowsEquals(() => Throw(x, "not caught"), "not caught"); |
27 } | 53 } |
28 } | 54 } |
29 | 55 |
30 | 56 |
31 { // return that doesn't close | 57 { // return that doesn't close |
32 let g = function*() { try {return 42} finally {yield 43} }; | 58 let g = function*() { try {return 42} finally {yield 43} }; |
33 | 59 |
34 { | 60 { |
35 let x = g(); | 61 let x = g(); |
36 assertEquals({value: 43, done: false}, x.next()); | 62 assertEquals({value: 43, done: false}, Next(x)); |
37 assertEquals({value: 42, done: true}, x.next()); | 63 assertEquals({value: 42, done: true}, Next(x)); |
38 } | 64 } |
39 } | 65 } |
40 | 66 |
41 | 67 |
42 { // return that doesn't close | 68 { // return that doesn't close |
43 let x; | 69 let x; |
44 let g = function*() { try {return 42} finally {x.throw(666)} }; | 70 let g = function*() { try {return 42} finally {Throw(x, 666)} }; |
45 | 71 |
46 { | 72 { |
47 x = g(); | 73 x = g(); |
48 assertThrows(() => x.next(), TypeError); // still executing | 74 assertThrows(() => Next(x), TypeError); // still executing |
49 } | 75 } |
50 } | 76 } |
51 | 77 |
52 | 78 |
53 { // yield in try-finally, finally clause performs return | 79 { // yield in try-finally, finally clause performs return |
54 | 80 |
55 let g = function*() { try {yield 42} finally {return 13} }; | 81 let g = function*() { try {yield 42} finally {return 13} }; |
56 | 82 |
57 { // "return" closes at suspendedStart | 83 { // "return" closes at suspendedStart |
58 let x = g(); | 84 let x = g(); |
59 assertEquals({value: 666, done: true}, x.return(666)); | 85 assertEquals({value: 666, done: true}, Return(x, 666)); |
60 assertEquals({value: undefined, done: true}, x.next(42)); | 86 assertEquals({value: undefined, done: true}, Next(x, 42)); |
61 assertThrowsEquals(() => x.throw(43), 43); | 87 assertThrowsEquals(() => Throw(x, 43), 43); |
62 assertEquals({value: 42, done: true}, x.return(42)); | 88 assertEquals({value: 42, done: true}, Return(x, 42)); |
63 } | 89 } |
64 | 90 |
65 { // "throw" closes at suspendedStart | 91 { // "throw" closes at suspendedStart |
66 let x = g(); | 92 let x = g(); |
67 assertThrowsEquals(() => x.throw(666), 666); | 93 assertThrowsEquals(() => Throw(x, 666), 666); |
68 assertEquals({value: undefined, done: true}, x.next(42)); | 94 assertEquals({value: undefined, done: true}, Next(x, 42)); |
69 assertEquals({value: 43, done: true}, x.return(43)); | 95 assertEquals({value: 43, done: true}, Return(x, 43)); |
70 assertThrowsEquals(() => x.throw(44), 44); | 96 assertThrowsEquals(() => Throw(x, 44), 44); |
71 } | 97 } |
72 | 98 |
73 { // "next" closes at suspendedYield | 99 { // "next" closes at suspendedYield |
74 let x = g(); | 100 let x = g(); |
75 assertEquals({value: 42, done: false}, x.next()); | 101 assertEquals({value: 42, done: false}, Next(x)); |
76 assertEquals({value: 13, done: true}, x.next(666)); | 102 assertEquals({value: 13, done: true}, Next(x, 666)); |
77 assertEquals({value: undefined, done: true}, x.next(666)); | 103 assertEquals({value: undefined, done: true}, Next(x, 666)); |
78 assertThrowsEquals(() => x.throw(666), 666); | 104 assertThrowsEquals(() => Throw(x, 666), 666); |
79 } | 105 } |
80 | 106 |
81 { // "return" closes at suspendedYield | 107 { // "return" closes at suspendedYield |
82 let x = g(); | 108 let x = g(); |
83 assertEquals({value: 42, done: false}, x.next()); | 109 assertEquals({value: 42, done: false}, Next(x)); |
84 assertEquals({value: 13, done: true}, x.return(666)); | 110 assertEquals({value: 13, done: true}, Return(x, 666)); |
85 assertEquals({value: undefined, done: true}, x.next(666)); | 111 assertEquals({value: undefined, done: true}, Next(x, 666)); |
86 assertEquals({value: 666, done: true}, x.return(666)); | 112 assertEquals({value: 666, done: true}, Return(x, 666)); |
87 } | 113 } |
88 | 114 |
89 { // "throw" closes at suspendedYield | 115 { // "throw" closes at suspendedYield |
90 let x = g(); | 116 let x = g(); |
91 assertEquals({value: 42, done: false}, x.next()); | 117 assertEquals({value: 42, done: false}, Next(x)); |
92 assertEquals({value: 13, done: true}, x.throw(666)); | 118 assertEquals({value: 13, done: true}, Throw(x, 666)); |
93 assertThrowsEquals(() => x.throw(666), 666); | 119 assertThrowsEquals(() => Throw(x, 666), 666); |
94 assertEquals({value: undefined, done: true}, x.next(666)); | 120 assertEquals({value: undefined, done: true}, Next(x, 666)); |
95 } | 121 } |
96 } | 122 } |
97 | 123 |
98 | 124 |
99 { // yield in try-finally, finally clause doesn't perform return | 125 { // yield in try-finally, finally clause doesn't perform return |
100 | 126 |
101 let g = function*() { try {yield 42} finally {13} }; | 127 let g = function*() { try {yield 42} finally {13} }; |
102 | 128 |
103 { // "return" closes at suspendedStart | 129 { // "return" closes at suspendedStart |
104 let x = g(); | 130 let x = g(); |
105 assertEquals({value: 666, done: true}, x.return(666)); | 131 assertEquals({value: 666, done: true}, Return(x, 666)); |
106 assertEquals({value: undefined, done: true}, x.next(42)); | 132 assertEquals({value: undefined, done: true}, Next(x, 42)); |
107 assertThrowsEquals(() => x.throw(43), 43); | 133 assertThrowsEquals(() => Throw(x, 43), 43); |
108 assertEquals({value: 42, done: true}, x.return(42)); | 134 assertEquals({value: 42, done: true}, Return(x, 42)); |
109 } | 135 } |
110 | 136 |
111 { // "throw" closes at suspendedStart | 137 { // "throw" closes at suspendedStart |
112 let x = g(); | 138 let x = g(); |
113 assertThrowsEquals(() => x.throw(666), 666); | 139 assertThrowsEquals(() => Throw(x, 666), 666); |
114 assertEquals({value: undefined, done: true}, x.next(42)); | 140 assertEquals({value: undefined, done: true}, Next(x, 42)); |
115 assertEquals({value: 43, done: true}, x.return(43)); | 141 assertEquals({value: 43, done: true}, Return(x, 43)); |
116 assertThrowsEquals(() => x.throw(44), 44); | 142 assertThrowsEquals(() => Throw(x, 44), 44); |
117 } | 143 } |
118 | 144 |
119 { // "next" closes at suspendedYield | 145 { // "next" closes at suspendedYield |
120 let x = g(); | 146 let x = g(); |
121 assertEquals({value: 42, done: false}, x.next()); | 147 assertEquals({value: 42, done: false}, Next(x)); |
122 assertEquals({value: undefined, done: true}, x.next(666)); | 148 assertEquals({value: undefined, done: true}, Next(x, 666)); |
123 assertEquals({value: undefined, done: true}, x.next(666)); | 149 assertEquals({value: undefined, done: true}, Next(x, 666)); |
124 assertThrowsEquals(() => x.throw(666), 666); | 150 assertThrowsEquals(() => Throw(x, 666), 666); |
125 assertEquals({value: 42, done: true}, x.return(42)); | 151 assertEquals({value: 42, done: true}, Return(x, 42)); |
126 } | 152 } |
127 | 153 |
128 { // "return" closes at suspendedYield | 154 { // "return" closes at suspendedYield |
129 let x = g(); | 155 let x = g(); |
130 assertEquals({value: 42, done: false}, x.next()); | 156 assertEquals({value: 42, done: false}, Next(x)); |
131 assertEquals({value: 666, done: true}, x.return(666)); | 157 assertEquals({value: 666, done: true}, Return(x, 666)); |
132 assertEquals({value: undefined, done: true}, x.next(666)); | 158 assertEquals({value: undefined, done: true}, Next(x, 666)); |
133 assertThrowsEquals(() => x.throw(44), 44); | 159 assertThrowsEquals(() => Throw(x, 44), 44); |
134 assertEquals({value: 42, done: true}, x.return(42)); | 160 assertEquals({value: 42, done: true}, Return(x, 42)); |
135 } | 161 } |
136 | 162 |
137 { // "throw" closes at suspendedYield | 163 { // "throw" closes at suspendedYield |
138 let x = g(); | 164 let x = g(); |
139 assertEquals({value: 42, done: false}, x.next()); | 165 assertEquals({value: 42, done: false}, Next(x)); |
140 assertThrowsEquals(() => x.throw(666), 666); | 166 assertThrowsEquals(() => Throw(x, 666), 666); |
141 assertEquals({value: undefined, done: true}, x.next(666)); | 167 assertEquals({value: undefined, done: true}, Next(x, 666)); |
142 assertThrowsEquals(() => x.throw(666), 666); | 168 assertThrowsEquals(() => Throw(x, 666), 666); |
143 assertEquals({value: 42, done: true}, x.return(42)); | 169 assertEquals({value: 42, done: true}, Return(x, 42)); |
144 } | 170 } |
145 } | 171 } |
146 | 172 |
147 | 173 |
148 { // yield in try-finally, finally clause yields and performs return | 174 { // yield in try-finally, finally clause yields and performs return |
149 | 175 |
150 let g = function*() { try {yield 42} finally {yield 43; return 13} }; | 176 let g = function*() { try {yield 42} finally {yield 43; return 13} }; |
151 | 177 |
152 { | 178 { |
153 let x = g(); | 179 let x = g(); |
154 assertEquals({value: 42, done: false}, x.next()); | 180 assertEquals({value: 42, done: false}, Next(x)); |
155 assertEquals({value: 43, done: false}, x.return(666)); | 181 assertEquals({value: 43, done: false}, Return(x, 666)); |
156 assertEquals({value: 13, done: true}, x.next()); | 182 assertEquals({value: 13, done: true}, Next(x)); |
157 assertEquals({value: 666, done: true}, x.return(666)); | 183 assertEquals({value: 666, done: true}, Return(x, 666)); |
158 } | 184 } |
159 | 185 |
160 { | 186 { |
161 let x = g(); | 187 let x = g(); |
162 assertEquals({value: 666, done: true}, x.return(666)); | 188 assertEquals({value: 666, done: true}, Return(x, 666)); |
163 assertEquals({value: undefined, done: true}, x.next()); | 189 assertEquals({value: undefined, done: true}, Next(x)); |
164 assertEquals({value: 666, done: true}, x.return(666)); | 190 assertEquals({value: 666, done: true}, Return(x, 666)); |
165 } | 191 } |
166 } | 192 } |
167 | 193 |
168 | 194 |
169 { // yield in try-finally, finally clause yields and doesn't perform return | 195 { // yield in try-finally, finally clause yields and doesn't perform return |
170 | 196 |
171 let g = function*() { try {yield 42} finally {yield 43; 13} }; | 197 let g = function*() { try {yield 42} finally {yield 43; 13} }; |
172 | 198 |
173 { | 199 { |
174 let x = g(); | 200 let x = g(); |
175 assertEquals({value: 42, done: false}, x.next()); | 201 assertEquals({value: 42, done: false}, Next(x)); |
176 assertEquals({value: 43, done: false}, x.return(666)); | 202 assertEquals({value: 43, done: false}, Return(x, 666)); |
177 assertEquals({value: 666, done: true}, x.next()); | 203 assertEquals({value: 666, done: true}, Next(x)); |
178 assertEquals({value: 5, done: true}, x.return(5)); | 204 assertEquals({value: 5, done: true}, Return(x, 5)); |
179 } | 205 } |
180 | 206 |
181 { | 207 { |
182 let x = g(); | 208 let x = g(); |
183 assertEquals({value: 666, done: true}, x.return(666)); | 209 assertEquals({value: 666, done: true}, Return(x, 666)); |
184 assertEquals({value: undefined, done: true}, x.next()); | 210 assertEquals({value: undefined, done: true}, Next(x)); |
185 assertEquals({value: 666, done: true}, x.return(666)); | 211 assertEquals({value: 666, done: true}, Return(x, 666)); |
186 } | 212 } |
187 } | 213 } |
188 | 214 |
189 | 215 |
190 { // yield*, finally clause performs return | 216 { // yield*, finally clause performs return |
191 | 217 |
192 let h = function*() { try {yield 42} finally {yield 43; return 13} }; | 218 let h = function*() { try {yield 42} finally {yield 43; return 13} }; |
193 let g = function*() { yield 1; yield yield* h(); }; | 219 let g = function*() { yield 1; yield yield* h(); }; |
194 | 220 |
195 { | 221 { |
196 let x = g(); | 222 let x = g(); |
197 assertEquals({value: 1, done: false}, x.next()); | 223 assertEquals({value: 1, done: false}, Next(x)); |
198 assertEquals({value: 42, done: false}, x.next()); | 224 assertEquals({value: 42, done: false}, Next(x)); |
199 assertEquals({value: 43, done: false}, x.next(666)); | 225 assertEquals({value: 43, done: false}, Next(x, 666)); |
200 assertEquals({value: 13, done: false}, x.next()); | 226 assertEquals({value: 13, done: false}, Next(x)); |
201 assertEquals({value: undefined, done: true}, x.next()); | 227 assertEquals({value: undefined, done: true}, Next(x)); |
202 } | 228 } |
203 | 229 |
204 { | 230 { |
205 let x = g(); | 231 let x = g(); |
206 assertEquals({value: 1, done: false}, x.next()); | 232 assertEquals({value: 1, done: false}, Next(x)); |
207 assertEquals({value: 42, done: false}, x.next()); | 233 assertEquals({value: 42, done: false}, Next(x)); |
208 assertEquals({value: 43, done: false}, x.return(666)); | 234 assertEquals({value: 43, done: false}, Return(x, 666)); |
209 assertEquals({value: 13, done: false}, x.next()); | 235 assertEquals({value: 13, done: false}, Next(x)); |
210 assertEquals({value: undefined, done: true}, x.next()); | 236 assertEquals({value: undefined, done: true}, Next(x)); |
211 } | 237 } |
212 | 238 |
213 { | 239 { |
214 let x = g(); | 240 let x = g(); |
215 assertEquals({value: 1, done: false}, x.next()); | 241 assertEquals({value: 1, done: false}, Next(x)); |
216 assertEquals({value: 42, done: false}, x.next()); | 242 assertEquals({value: 42, done: false}, Next(x)); |
217 assertEquals({value: 43, done: false}, x.throw(666)); | 243 assertEquals({value: 43, done: false}, Throw(x, 666)); |
218 assertEquals({value: 13, done: false}, x.next()); | 244 assertEquals({value: 13, done: false}, Next(x)); |
219 assertEquals({value: undefined, done: true}, x.next()); | 245 assertEquals({value: undefined, done: true}, Next(x)); |
220 } | 246 } |
221 } | 247 } |
222 | 248 |
223 | 249 |
224 { // yield*, finally clause does not perform return | 250 { // yield*, finally clause does not perform return |
225 | 251 |
226 let h = function*() { try {yield 42} finally {yield 43; 13} }; | 252 let h = function*() { try {yield 42} finally {yield 43; 13} }; |
227 let g = function*() { yield 1; yield yield* h(); }; | 253 let g = function*() { yield 1; yield yield* h(); }; |
228 | 254 |
229 { | 255 { |
230 let x = g(); | 256 let x = g(); |
231 assertEquals({value: 1, done: false}, x.next()); | 257 assertEquals({value: 1, done: false}, Next(x)); |
232 assertEquals({value: 42, done: false}, x.next()); | 258 assertEquals({value: 42, done: false}, Next(x)); |
233 assertEquals({value: 43, done: false}, x.next(666)); | 259 assertEquals({value: 43, done: false}, Next(x, 666)); |
234 assertEquals({value: undefined, done: false}, x.next()); | 260 assertEquals({value: undefined, done: false}, Next(x)); |
235 assertEquals({value: undefined, done: true}, x.next()); | 261 assertEquals({value: undefined, done: true}, Next(x)); |
236 } | 262 } |
237 | 263 |
238 { | 264 { |
239 let x = g(); | 265 let x = g(); |
240 assertEquals({value: 1, done: false}, x.next()); | 266 assertEquals({value: 1, done: false}, Next(x)); |
241 assertEquals({value: 42, done: false}, x.next()); | 267 assertEquals({value: 42, done: false}, Next(x)); |
242 assertEquals({value: 43, done: false}, x.return(44)); | 268 assertEquals({value: 43, done: false}, Return(x, 44)); |
243 assertEquals({value: 44, done: false}, x.next()); | 269 assertEquals({value: 44, done: false}, Next(x)); |
244 assertEquals({value: undefined, done: true}, x.next()); | 270 assertEquals({value: undefined, done: true}, Next(x)); |
245 } | 271 } |
246 | 272 |
247 { | 273 { |
248 let x = g(); | 274 let x = g(); |
249 assertEquals({value: 1, done: false}, x.next()); | 275 assertEquals({value: 1, done: false}, Next(x)); |
250 assertEquals({value: 42, done: false}, x.next()); | 276 assertEquals({value: 42, done: false}, Next(x)); |
251 assertEquals({value: 43, done: false}, x.throw(666)); | 277 assertEquals({value: 43, done: false}, Throw(x, 666)); |
252 assertThrowsEquals(() => x.next(), 666); | 278 assertThrowsEquals(() => Next(x), 666); |
253 } | 279 } |
254 } | 280 } |
255 | 281 |
256 | 282 |
257 { // yield*, .return argument is final result | 283 { // yield*, .return argument is final result |
258 | 284 |
259 function* inner() { | 285 function* inner() { |
260 yield 2; | 286 yield 2; |
261 } | 287 } |
262 | 288 |
263 function* g() { | 289 function* g() { |
264 yield 1; | 290 yield 1; |
265 return yield* inner(); | 291 return yield* inner(); |
266 } | 292 } |
267 | 293 |
268 { | 294 { |
269 let x = g(); | 295 let x = g(); |
270 assertEquals({value: 1, done: false}, x.next()); | 296 assertEquals({value: 1, done: false}, Next(x)); |
271 assertEquals({value: 2, done: false}, x.next()); | 297 assertEquals({value: 2, done: false}, Next(x)); |
272 assertEquals({value: 42, done: true}, x.return(42)); | 298 assertEquals({value: 42, done: true}, Return(x, 42)); |
273 } | 299 } |
274 } | 300 } |
275 | 301 |
276 | 302 |
277 // More or less random tests from here on. | 303 // More or less random tests from here on. |
278 | 304 |
279 | 305 |
280 { | 306 { |
281 function* foo() { } | 307 function* foo() { } |
282 let g = foo(); | 308 let g = foo(); |
283 assertEquals({value: undefined, done: true}, g.next()); | 309 assertEquals({value: undefined, done: true}, Next(g)); |
284 assertEquals({value: undefined, done: true}, g.next()); | 310 assertEquals({value: undefined, done: true}, Next(g)); |
285 } | 311 } |
286 | 312 |
287 { | 313 { |
288 function* foo() { return new.target } | 314 function* foo() { return new.target } |
289 let g = foo(); | 315 let g = foo(); |
290 assertEquals({value: undefined, done: true}, g.next()); | 316 assertEquals({value: undefined, done: true}, Next(g)); |
291 assertEquals({value: undefined, done: true}, g.next()); | 317 assertEquals({value: undefined, done: true}, Next(g)); |
292 } | 318 } |
293 | 319 |
294 { | 320 { |
295 function* foo() { throw 666; return 42} | 321 function* foo() { throw 666; return 42} |
296 let g = foo(); | 322 let g = foo(); |
297 assertThrowsEquals(() => g.next(), 666); | 323 assertThrowsEquals(() => Next(g), 666); |
298 assertEquals({value: undefined, done: true}, g.next()); | 324 assertEquals({value: undefined, done: true}, Next(g)); |
299 } | 325 } |
300 | 326 |
301 { | 327 { |
302 function* foo(a) { return a; } | 328 function* foo(a) { return a; } |
303 let g = foo(42); | 329 let g = foo(42); |
304 assertEquals({value: 42, done: true}, g.next()); | 330 assertEquals({value: 42, done: true}, Next(g)); |
305 assertEquals({value: undefined, done: true}, g.next()); | 331 assertEquals({value: undefined, done: true}, Next(g)); |
306 } | 332 } |
307 | 333 |
308 { | 334 { |
309 function* foo(a) { a.iwashere = true; return a; } | 335 function* foo(a) { a.iwashere = true; return a; } |
310 let x = {}; | 336 let x = {}; |
311 let g = foo(x); | 337 let g = foo(x); |
312 assertEquals({value: {iwashere: true}, done: true}, g.next()); | 338 assertEquals({value: {iwashere: true}, done: true}, Next(g)); |
313 assertEquals({value: undefined, done: true}, g.next()); | 339 assertEquals({value: undefined, done: true}, Next(g)); |
314 } | 340 } |
315 | 341 |
316 { | 342 { |
317 let a = 42; | 343 let a = 42; |
318 function* foo() { return a; } | 344 function* foo() { return a; } |
319 let g = foo(); | 345 let g = foo(); |
320 assertEquals({value: 42, done: true}, g.next()); | 346 assertEquals({value: 42, done: true}, Next(g)); |
321 assertEquals({value: undefined, done: true}, g.next()); | 347 assertEquals({value: undefined, done: true}, Next(g)); |
322 } | 348 } |
323 | 349 |
324 { | 350 { |
325 let a = 40; | 351 let a = 40; |
326 function* foo(b) { return a + b; } | 352 function* foo(b) { return a + b; } |
327 let g = foo(2); | 353 let g = foo(2); |
328 assertEquals({value: 42, done: true}, g.next()); | 354 assertEquals({value: 42, done: true}, Next(g)); |
329 assertEquals({value: undefined, done: true}, g.next()); | 355 assertEquals({value: undefined, done: true}, Next(g)); |
330 } | 356 } |
331 | 357 |
332 { | 358 { |
333 let a = 40; | 359 let a = 40; |
334 function* foo(b) { a--; b++; return a + b; } | 360 function* foo(b) { a--; b++; return a + b; } |
335 let g = foo(2); | 361 let g = foo(2); |
336 assertEquals({value: 42, done: true}, g.next()); | 362 assertEquals({value: 42, done: true}, Next(g)); |
337 assertEquals({value: undefined, done: true}, g.next()); | 363 assertEquals({value: undefined, done: true}, Next(g)); |
338 } | 364 } |
339 | 365 |
340 { | 366 { |
341 let g; | 367 let g; |
342 function* foo() { g.next() } | 368 function* foo() { Next(g) } |
343 g = foo(); | 369 g = foo(); |
344 assertThrows(() => g.next(), TypeError); | 370 assertThrows(() => Next(g), TypeError); |
345 assertEquals({value: undefined, done: true}, g.next()); | 371 assertEquals({value: undefined, done: true}, Next(g)); |
346 } | 372 } |
347 | 373 |
348 { | 374 { |
349 function* foo() { yield 2; yield 3; yield 4 } | 375 function* foo() { yield 2; yield 3; yield 4 } |
350 g = foo(); | 376 g = foo(); |
351 assertEquals({value: 2, done: false}, g.next()); | 377 assertEquals({value: 2, done: false}, Next(g)); |
352 assertEquals({value: 3, done: false}, g.next()); | 378 assertEquals({value: 3, done: false}, Next(g)); |
353 assertEquals({value: 4, done: false}, g.next()); | 379 assertEquals({value: 4, done: false}, Next(g)); |
354 assertEquals({value: undefined, done: true}, g.next()); | 380 assertEquals({value: undefined, done: true}, Next(g)); |
355 assertEquals({value: undefined, done: true}, g.next()); | 381 assertEquals({value: undefined, done: true}, Next(g)); |
356 } | 382 } |
357 | 383 |
384 | |
358 { | 385 { |
359 function* foo() { yield 2; if (true) { yield 3 }; yield 4 } | 386 function* foo() { yield 2; if (true) { yield 3 }; yield 4 } |
360 g = foo(); | 387 g = foo(); |
361 assertEquals({value: 2, done: false}, g.next()); | 388 assertEquals({value: 2, done: false}, Next(g)); |
362 assertEquals({value: 3, done: false}, g.next()); | 389 assertEquals({value: 3, done: false}, Next(g)); |
363 assertEquals({value: 4, done: false}, g.next()); | 390 assertEquals({value: 4, done: false}, Next(g)); |
364 assertEquals({value: undefined, done: true}, g.next()); | 391 assertEquals({value: undefined, done: true}, Next(g)); |
365 assertEquals({value: undefined, done: true}, g.next()); | 392 assertEquals({value: undefined, done: true}, Next(g)); |
366 } | 393 } |
367 | 394 |
368 { | 395 { |
369 function* foo() { yield 2; if (true) { yield 3; yield 4 } } | 396 function* foo() { yield 2; if (true) { yield 3; yield 4 } } |
370 g = foo(); | 397 g = foo(); |
371 assertEquals({value: 2, done: false}, g.next()); | 398 assertEquals({value: 2, done: false}, Next(g)); |
372 assertEquals({value: 3, done: false}, g.next()); | 399 assertEquals({value: 3, done: false}, Next(g)); |
373 assertEquals({value: 4, done: false}, g.next()); | 400 assertEquals({value: 4, done: false}, Next(g)); |
374 assertEquals({value: undefined, done: true}, g.next()); | 401 assertEquals({value: undefined, done: true}, Next(g)); |
375 assertEquals({value: undefined, done: true}, g.next()); | 402 assertEquals({value: undefined, done: true}, Next(g)); |
376 } | 403 } |
377 | 404 |
378 { | 405 { |
379 function* foo() { yield 2; if (false) { yield 3 }; yield 4 } | 406 function* foo() { yield 2; if (false) { yield 3 }; yield 4 } |
380 g = foo(); | 407 g = foo(); |
381 assertEquals({value: 2, done: false}, g.next()); | 408 assertEquals({value: 2, done: false}, Next(g)); |
382 assertEquals({value: 4, done: false}, g.next()); | 409 assertEquals({value: 4, done: false}, Next(g)); |
383 assertEquals({value: undefined, done: true}, g.next()); | 410 assertEquals({value: undefined, done: true}, Next(g)); |
384 assertEquals({value: undefined, done: true}, g.next()); | 411 assertEquals({value: undefined, done: true}, Next(g)); |
385 } | 412 } |
386 | 413 |
387 { | 414 { |
388 function* foo() { yield 2; while (true) { yield 3 }; yield 4 } | 415 function* foo() { yield 2; while (true) { yield 3 }; yield 4 } |
389 g = foo(); | 416 g = foo(); |
390 assertEquals({value: 2, done: false}, g.next()); | 417 assertEquals({value: 2, done: false}, Next(g)); |
391 assertEquals({value: 3, done: false}, g.next()); | 418 assertEquals({value: 3, done: false}, Next(g)); |
392 assertEquals({value: 3, done: false}, g.next()); | 419 assertEquals({value: 3, done: false}, Next(g)); |
393 assertEquals({value: 3, done: false}, g.next()); | 420 assertEquals({value: 3, done: false}, Next(g)); |
394 assertEquals({value: 3, done: false}, g.next()); | 421 assertEquals({value: 3, done: false}, Next(g)); |
395 } | 422 } |
396 | 423 |
397 { | 424 { |
398 function* foo() { yield 2; (yield 3) + 42; yield 4 } | 425 function* foo() { yield 2; (yield 3) + 42; yield 4 } |
399 g = foo(); | 426 g = foo(); |
400 assertEquals({value: 2, done: false}, g.next()); | 427 assertEquals({value: 2, done: false}, Next(g)); |
401 assertEquals({value: 3, done: false}, g.next()); | 428 assertEquals({value: 3, done: false}, Next(g)); |
402 assertEquals({value: 4, done: false}, g.next()); | 429 assertEquals({value: 4, done: false}, Next(g)); |
403 } | 430 } |
404 | 431 |
405 { | 432 { |
406 function* foo() { yield 2; (do {yield 3}) + 42; yield 4 } | 433 function* foo() { yield 2; (do {yield 3}) + 42; yield 4 } |
407 g = foo(); | 434 g = foo(); |
408 assertEquals({value: 2, done: false}, g.next()); | 435 assertEquals({value: 2, done: false}, Next(g)); |
409 assertEquals({value: 3, done: false}, g.next()); | 436 assertEquals({value: 3, done: false}, Next(g)); |
410 assertEquals({value: 4, done: false}, g.next()); | 437 assertEquals({value: 4, done: false}, Next(g)); |
411 } | 438 } |
412 | 439 |
413 { | 440 { |
414 function* foo() { yield 2; return (yield 3) + 42; yield 4 } | 441 function* foo() { yield 2; return (yield 3) + 42; yield 4 } |
415 g = foo(); | 442 g = foo(); |
416 assertEquals({value: 2, done: false}, g.next()); | 443 assertEquals({value: 2, done: false}, Next(g)); |
417 assertEquals({value: 3, done: false}, g.next()); | 444 assertEquals({value: 3, done: false}, Next(g)); |
418 assertEquals({value: 42, done: true}, g.next(0)); | 445 assertEquals({value: 42, done: true}, Next(g, 0)); |
419 assertEquals({value: undefined, done: true}, g.next()); | 446 assertEquals({value: undefined, done: true}, Next(g)); |
420 } | 447 } |
421 | 448 |
422 { | 449 { |
423 let x = 42; | 450 let x = 42; |
424 function* foo() { | 451 function* foo() { |
425 yield x; | 452 yield x; |
426 for (let x in {a: 1, b: 2}) { | 453 for (let x in {a: 1, b: 2}) { |
427 let i = 2; | 454 let i = 2; |
428 yield x; | 455 yield x; |
429 yield i; | 456 yield i; |
430 do { | 457 do { |
431 yield i; | 458 yield i; |
432 } while (i-- > 0); | 459 } while (i-- > 0); |
433 } | 460 } |
434 yield x; | 461 yield x; |
435 return 5; | 462 return 5; |
436 } | 463 } |
437 g = foo(); | 464 g = foo(); |
438 assertEquals({value: 42, done: false}, g.next()); | 465 assertEquals({value: 42, done: false}, Next(g)); |
439 assertEquals({value: 'a', done: false}, g.next()); | 466 assertEquals({value: 'a', done: false}, Next(g)); |
440 assertEquals({value: 2, done: false}, g.next()); | 467 assertEquals({value: 2, done: false}, Next(g)); |
441 assertEquals({value: 2, done: false}, g.next()); | 468 assertEquals({value: 2, done: false}, Next(g)); |
442 assertEquals({value: 1, done: false}, g.next()); | 469 assertEquals({value: 1, done: false}, Next(g)); |
443 assertEquals({value: 0, done: false}, g.next()); | 470 assertEquals({value: 0, done: false}, Next(g)); |
444 assertEquals({value: 'b', done: false}, g.next()); | 471 assertEquals({value: 'b', done: false}, Next(g)); |
445 assertEquals({value: 2, done: false}, g.next()); | 472 assertEquals({value: 2, done: false}, Next(g)); |
446 assertEquals({value: 2, done: false}, g.next()); | 473 assertEquals({value: 2, done: false}, Next(g)); |
447 assertEquals({value: 1, done: false}, g.next()); | 474 assertEquals({value: 1, done: false}, Next(g)); |
448 assertEquals({value: 0, done: false}, g.next()); | 475 assertEquals({value: 0, done: false}, Next(g)); |
449 assertEquals({value: 42, done: false}, g.next()); | 476 assertEquals({value: 42, done: false}, Next(g)); |
450 assertEquals({value: 5, done: true}, g.next()); | 477 assertEquals({value: 5, done: true}, Next(g)); |
451 } | 478 } |
452 | 479 |
453 { | 480 { |
454 let a = 3; | 481 let a = 3; |
455 function* foo() { | 482 function* foo() { |
456 let b = 4; | 483 let b = 4; |
457 yield 1; | 484 yield 1; |
458 { let c = 5; yield 2; yield a; yield b; yield c; } | 485 { let c = 5; yield 2; yield a; yield b; yield c; } |
459 } | 486 } |
460 g = foo(); | 487 g = foo(); |
461 assertEquals({value: 1, done: false}, g.next()); | 488 assertEquals({value: 1, done: false}, Next(g)); |
462 assertEquals({value: 2, done: false}, g.next()); | 489 assertEquals({value: 2, done: false}, Next(g)); |
463 assertEquals({value: 3, done: false}, g.next()); | 490 assertEquals({value: 3, done: false}, Next(g)); |
464 assertEquals({value: 4, done: false}, g.next()); | 491 assertEquals({value: 4, done: false}, Next(g)); |
465 assertEquals({value: 5, done: false}, g.next()); | 492 assertEquals({value: 5, done: false}, Next(g)); |
466 assertEquals({value: undefined, done: true}, g.next()); | 493 assertEquals({value: undefined, done: true}, Next(g)); |
467 } | 494 } |
468 | 495 |
469 { | 496 { |
470 function* foo() { | 497 function* foo() { |
471 yield 42; | 498 yield 42; |
472 yield 42; | 499 yield 42; |
473 yield 42; | 500 yield 42; |
474 yield 42; | 501 yield 42; |
475 yield 42; | 502 yield 42; |
476 yield 42; | 503 yield 42; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
564 yield 42; | 591 yield 42; |
565 yield 42; | 592 yield 42; |
566 yield 42; | 593 yield 42; |
567 yield 42; | 594 yield 42; |
568 yield 42; | 595 yield 42; |
569 yield 42; | 596 yield 42; |
570 yield 42; | 597 yield 42; |
571 } | 598 } |
572 g = foo(); | 599 g = foo(); |
573 for (let i = 0; i < 100; ++i) { | 600 for (let i = 0; i < 100; ++i) { |
574 assertEquals({value: 42, done: false}, g.next()); | 601 assertEquals({value: 42, done: false}, i%25 === 0 ? Next(g) : g.next()); |
575 } | 602 } |
576 assertEquals({value: undefined, done: true}, g.next()); | 603 assertEquals({value: undefined, done: true}, Next(g)); |
577 } | 604 } |
578 | 605 |
579 { | 606 { |
580 function* foo() { | 607 function* foo() { |
581 for (let i = 0; i < 3; ++i) { | 608 for (let i = 0; i < 3; ++i) { |
582 let j = 0 | 609 let j = 0 |
583 yield i; | 610 yield i; |
584 do { | 611 do { |
585 yield (i + 10); | 612 yield (i + 10); |
586 } while (++j < 2); | 613 } while (++j < 2); |
587 } | 614 } |
588 } | 615 } |
589 g = foo(); | 616 g = foo(); |
590 assertEquals({value: 0, done: false}, g.next()); | 617 assertEquals({value: 0, done: false}, Next(g)); |
591 assertEquals({value: 10, done: false}, g.next()); | 618 assertEquals({value: 10, done: false}, Next(g)); |
592 assertEquals({value: 10, done: false}, g.next()); | 619 assertEquals({value: 10, done: false}, Next(g)); |
593 assertEquals({value: 1, done: false}, g.next()); | 620 assertEquals({value: 1, done: false}, Next(g)); |
594 assertEquals({value: 11, done: false}, g.next()); | 621 assertEquals({value: 11, done: false}, Next(g)); |
595 assertEquals({value: 11, done: false}, g.next()); | 622 assertEquals({value: 11, done: false}, Next(g)); |
596 assertEquals({value: 2, done: false}, g.next()); | 623 assertEquals({value: 2, done: false}, Next(g)); |
597 assertEquals({value: 12, done: false}, g.next()); | 624 assertEquals({value: 12, done: false}, Next(g)); |
598 assertEquals({value: 12, done: false}, g.next()); | 625 assertEquals({value: 12, done: false}, Next(g)); |
599 assertEquals({value: undefined, done: true}, g.next()); | 626 assertEquals({value: undefined, done: true}, Next(g)); |
600 } | 627 } |
628 | |
629 { | |
630 let foo = function*() { | |
631 while (true) { | |
632 if (true || false) yield 42; | |
633 continue; | |
634 } | |
635 } | |
636 g = foo(); | |
637 assertEquals({value: 42, done: false}, Next(g)); | |
638 assertEquals({value: 42, done: false}, Next(g)); | |
639 assertEquals({value: 42, done: false}, Next(g)); | |
640 } | |
OLD | NEW |