Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(580)

Side by Side Diff: test/mjsunit/harmony/generators.js

Issue 1957393004: Allow Turbofan optimization of Ignition generators (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/runtime/runtime-generator.cc ('K') | « src/types.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« src/runtime/runtime-generator.cc ('K') | « src/types.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698