OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 function Sentinel() {} | 66 function Sentinel() {} |
67 assertThrows(function () { iter.throw(new Sentinel); }, Sentinel); | 67 assertThrows(function () { iter.throw(new Sentinel); }, Sentinel); |
68 assertThrows(function () { iter.next(); }, Error); | 68 assertThrows(function () { iter.next(); }, Error); |
69 } | 69 } |
70 } | 70 } |
71 | 71 |
72 testNext(g); | 72 testNext(g); |
73 testSend(g); | 73 testSend(g); |
74 testThrow(g); | 74 testThrow(g); |
75 | 75 |
| 76 testNext(function*() { return yield* g(); }); |
| 77 testSend(function*() { return yield* g(); }); |
| 78 testThrow(function*() { return yield* g(); }); |
| 79 |
76 if (g instanceof GeneratorFunction) { | 80 if (g instanceof GeneratorFunction) { |
77 testNext(function() { return new g(); }); | 81 testNext(function() { return new g(); }); |
78 testSend(function() { return new g(); }); | 82 testSend(function() { return new g(); }); |
79 testThrow(function() { return new g(); }); | 83 testThrow(function() { return new g(); }); |
80 } | 84 } |
81 } | 85 } |
82 | 86 |
83 TestGenerator(function* g1() { }, | 87 TestGenerator(function* g1() { }, |
84 [undefined], | 88 [undefined], |
85 "foo", | 89 "foo", |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 throw (yield (1 + (yield 2) + 3)) | 304 throw (yield (1 + (yield 2) + 3)) |
301 } catch (e) { | 305 } catch (e) { |
302 if (typeof e == 'object') throw e; | 306 if (typeof e == 'object') throw e; |
303 return e + (yield (4 + (yield 5) + 6)); | 307 return e + (yield (4 + (yield 5) + 6)); |
304 } | 308 } |
305 }, | 309 }, |
306 [2, NaN, 5, NaN, NaN], | 310 [2, NaN, 5, NaN, NaN], |
307 "foo", | 311 "foo", |
308 [2, "1foo3", 5, "4foo6", "foofoo"]); | 312 [2, "1foo3", 5, "4foo6", "foofoo"]); |
309 | 313 |
310 function TestTryCatch() { | 314 function TestTryCatch(instantiate) { |
311 function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; } | 315 function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; } |
312 function Sentinel() {} | 316 function Sentinel() {} |
313 var iter; | |
314 | 317 |
315 iter = g(); | 318 function Test1(iter) { |
316 assertIteratorResult(1, false, iter.next()); | 319 assertIteratorResult(1, false, iter.next()); |
317 assertIteratorResult(2, false, iter.next()); | 320 assertIteratorResult(2, false, iter.next()); |
318 assertIteratorResult(3, false, iter.next()); | 321 assertIteratorResult(3, false, iter.next()); |
319 assertIteratorResult(undefined, true, iter.next()); | 322 assertIteratorResult(undefined, true, iter.next()); |
320 assertThrows(function() { iter.next(); }, Error); | 323 assertThrows(function() { iter.next(); }, Error); |
| 324 } |
| 325 Test1(instantiate(g)); |
321 | 326 |
322 iter = g(); | 327 function Test2(iter) { |
323 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 328 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
324 assertThrows(function() { iter.next(); }, Error); | 329 assertThrows(function() { iter.next(); }, Error); |
| 330 } |
| 331 Test2(instantiate(g)); |
325 | 332 |
326 iter = g(); | 333 function Test3(iter) { |
327 assertIteratorResult(1, false, iter.next()); | 334 assertIteratorResult(1, false, iter.next()); |
328 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 335 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
329 assertThrows(function() { iter.next(); }, Error); | 336 assertThrows(function() { iter.next(); }, Error); |
| 337 } |
| 338 Test3(instantiate(g)); |
330 | 339 |
331 iter = g(); | 340 function Test4(iter) { |
332 assertIteratorResult(1, false, iter.next()); | 341 assertIteratorResult(1, false, iter.next()); |
333 assertIteratorResult(2, false, iter.next()); | 342 assertIteratorResult(2, false, iter.next()); |
334 var exn = new Sentinel; | 343 var exn = new Sentinel; |
335 assertIteratorResult(exn, false, iter.throw(exn)); | 344 assertIteratorResult(exn, false, iter.throw(exn)); |
336 assertIteratorResult(3, false, iter.next()); | 345 assertIteratorResult(3, false, iter.next()); |
337 assertIteratorResult(undefined, true, iter.next()); | 346 assertIteratorResult(undefined, true, iter.next()); |
338 assertThrows(function() { iter.next(); }, Error); | 347 assertThrows(function() { iter.next(); }, Error); |
| 348 } |
| 349 Test4(instantiate(g)); |
339 | 350 |
340 iter = g(); | 351 function Test5(iter) { |
341 assertIteratorResult(1, false, iter.next()); | 352 assertIteratorResult(1, false, iter.next()); |
342 assertIteratorResult(2, false, iter.next()); | 353 assertIteratorResult(2, false, iter.next()); |
343 var exn = new Sentinel; | 354 var exn = new Sentinel; |
344 assertIteratorResult(exn, false, iter.throw(exn)); | 355 assertIteratorResult(exn, false, iter.throw(exn)); |
345 assertIteratorResult(3, false, iter.next()); | 356 assertIteratorResult(3, false, iter.next()); |
346 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 357 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
347 assertThrows(function() { iter.next(); }, Error); | 358 assertThrows(function() { iter.next(); }, Error); |
348 | 359 |
349 iter = g(); | 360 } |
350 assertIteratorResult(1, false, iter.next()); | 361 Test5(instantiate(g)); |
351 assertIteratorResult(2, false, iter.next()); | |
352 var exn = new Sentinel; | |
353 assertIteratorResult(exn, false, iter.throw(exn)); | |
354 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | |
355 assertThrows(function() { iter.next(); }, Error); | |
356 | 362 |
357 iter = g(); | 363 function Test6(iter) { |
358 assertIteratorResult(1, false, iter.next()); | 364 assertIteratorResult(1, false, iter.next()); |
359 assertIteratorResult(2, false, iter.next()); | 365 assertIteratorResult(2, false, iter.next()); |
360 assertIteratorResult(3, false, iter.next()); | 366 var exn = new Sentinel; |
361 assertIteratorResult(undefined, true, iter.next()); | 367 assertIteratorResult(exn, false, iter.throw(exn)); |
362 assertThrows(function() { iter.next(); }, Error); | 368 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
| 369 assertThrows(function() { iter.next(); }, Error); |
| 370 } |
| 371 Test6(instantiate(g)); |
| 372 |
| 373 function Test7(iter) { |
| 374 assertIteratorResult(1, false, iter.next()); |
| 375 assertIteratorResult(2, false, iter.next()); |
| 376 assertIteratorResult(3, false, iter.next()); |
| 377 assertIteratorResult(undefined, true, iter.next()); |
| 378 assertThrows(function() { iter.next(); }, Error); |
| 379 } |
| 380 Test7(instantiate(g)); |
363 } | 381 } |
364 TestTryCatch(); | 382 TestTryCatch(function (g) { return g(); }); |
| 383 TestTryCatch(function* (g) { return yield* g(); }); |
365 | 384 |
366 function TestTryFinally() { | 385 function TestTryFinally(instantiate) { |
367 function* g() { yield 1; try { yield 2; } finally { yield 3; } yield 4; } | 386 function* g() { yield 1; try { yield 2; } finally { yield 3; } yield 4; } |
368 function Sentinel() {} | 387 function Sentinel() {} |
369 function Sentinel2() {} | 388 function Sentinel2() {} |
370 var iter; | |
371 | 389 |
372 iter = g(); | 390 function Test1(iter) { |
373 assertIteratorResult(1, false, iter.next()); | 391 assertIteratorResult(1, false, iter.next()); |
374 assertIteratorResult(2, false, iter.next()); | 392 assertIteratorResult(2, false, iter.next()); |
375 assertIteratorResult(3, false, iter.next()); | 393 assertIteratorResult(3, false, iter.next()); |
376 assertIteratorResult(4, false, iter.next()); | 394 assertIteratorResult(4, false, iter.next()); |
377 assertIteratorResult(undefined, true, iter.next()); | 395 assertIteratorResult(undefined, true, iter.next()); |
378 assertThrows(function() { iter.next(); }, Error); | 396 assertThrows(function() { iter.next(); }, Error); |
| 397 } |
| 398 Test1(instantiate(g)); |
379 | 399 |
380 iter = g(); | 400 function Test2(iter) { |
381 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 401 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
382 assertThrows(function() { iter.next(); }, Error); | 402 assertThrows(function() { iter.next(); }, Error); |
| 403 } |
| 404 Test2(instantiate(g)); |
383 | 405 |
384 iter = g(); | 406 function Test3(iter) { |
385 assertIteratorResult(1, false, iter.next()); | 407 assertIteratorResult(1, false, iter.next()); |
386 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 408 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
387 assertThrows(function() { iter.next(); }, Error); | 409 assertThrows(function() { iter.next(); }, Error); |
| 410 } |
| 411 Test3(instantiate(g)); |
388 | 412 |
389 iter = g(); | 413 function Test4(iter) { |
390 assertIteratorResult(1, false, iter.next()); | 414 assertIteratorResult(1, false, iter.next()); |
391 assertIteratorResult(2, false, iter.next()); | 415 assertIteratorResult(2, false, iter.next()); |
392 assertIteratorResult(3, false, iter.throw(new Sentinel)); | 416 assertIteratorResult(3, false, iter.throw(new Sentinel)); |
393 assertThrows(function() { iter.next(); }, Sentinel); | 417 assertThrows(function() { iter.next(); }, Sentinel); |
394 assertThrows(function() { iter.next(); }, Error); | 418 assertThrows(function() { iter.next(); }, Error); |
395 | 419 |
396 iter = g(); | 420 } |
397 assertIteratorResult(1, false, iter.next()); | 421 Test4(instantiate(g)); |
398 assertIteratorResult(2, false, iter.next()); | |
399 assertIteratorResult(3, false, iter.throw(new Sentinel)); | |
400 assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2); | |
401 assertThrows(function() { iter.next(); }, Error); | |
402 | 422 |
403 iter = g(); | 423 function Test5(iter) { |
404 assertIteratorResult(1, false, iter.next()); | 424 assertIteratorResult(1, false, iter.next()); |
405 assertIteratorResult(2, false, iter.next()); | 425 assertIteratorResult(2, false, iter.next()); |
406 assertIteratorResult(3, false, iter.next()); | 426 assertIteratorResult(3, false, iter.throw(new Sentinel)); |
407 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 427 assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2); |
408 assertThrows(function() { iter.next(); }, Error); | 428 assertThrows(function() { iter.next(); }, Error); |
| 429 } |
| 430 Test5(instantiate(g)); |
409 | 431 |
410 iter = g(); | 432 function Test6(iter) { |
411 assertIteratorResult(1, false, iter.next()); | 433 assertIteratorResult(1, false, iter.next()); |
412 assertIteratorResult(2, false, iter.next()); | 434 assertIteratorResult(2, false, iter.next()); |
413 assertIteratorResult(3, false, iter.next()); | 435 assertIteratorResult(3, false, iter.next()); |
414 assertIteratorResult(4, false, iter.next()); | 436 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
415 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 437 assertThrows(function() { iter.next(); }, Error); |
416 assertThrows(function() { iter.next(); }, Error); | 438 } |
| 439 Test6(instantiate(g)); |
417 | 440 |
418 iter = g(); | 441 function Test7(iter) { |
419 assertIteratorResult(1, false, iter.next()); | 442 assertIteratorResult(1, false, iter.next()); |
420 assertIteratorResult(2, false, iter.next()); | 443 assertIteratorResult(2, false, iter.next()); |
421 assertIteratorResult(3, false, iter.next()); | 444 assertIteratorResult(3, false, iter.next()); |
422 assertIteratorResult(4, false, iter.next()); | 445 assertIteratorResult(4, false, iter.next()); |
423 assertIteratorResult(undefined, true, iter.next()); | 446 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
424 assertThrows(function() { iter.next(); }, Error); | 447 assertThrows(function() { iter.next(); }, Error); |
| 448 } |
| 449 Test7(instantiate(g)); |
| 450 |
| 451 function Test8(iter) { |
| 452 assertIteratorResult(1, false, iter.next()); |
| 453 assertIteratorResult(2, false, iter.next()); |
| 454 assertIteratorResult(3, false, iter.next()); |
| 455 assertIteratorResult(4, false, iter.next()); |
| 456 assertIteratorResult(undefined, true, iter.next()); |
| 457 assertThrows(function() { iter.next(); }, Error); |
| 458 |
| 459 } |
| 460 Test8(instantiate(g)); |
425 } | 461 } |
426 TestTryFinally(); | 462 TestTryFinally(function (g) { return g(); }); |
| 463 TestTryFinally(function* (g) { return yield* g(); }); |
427 | 464 |
428 function TestNestedTry() { | 465 function TestNestedTry(instantiate) { |
429 function* g() { | 466 function* g() { |
430 try { | 467 try { |
431 yield 1; | 468 yield 1; |
432 try { yield 2; } catch (e) { yield e; } | 469 try { yield 2; } catch (e) { yield e; } |
433 yield 3; | 470 yield 3; |
434 } finally { | 471 } finally { |
435 yield 4; | 472 yield 4; |
436 } | 473 } |
437 yield 5; | 474 yield 5; |
438 } | 475 } |
439 function Sentinel() {} | 476 function Sentinel() {} |
440 function Sentinel2() {} | 477 function Sentinel2() {} |
441 var iter; | |
442 | 478 |
443 iter = g(); | 479 function Test1(iter) { |
444 assertIteratorResult(1, false, iter.next()); | 480 assertIteratorResult(1, false, iter.next()); |
445 assertIteratorResult(2, false, iter.next()); | 481 assertIteratorResult(2, false, iter.next()); |
446 assertIteratorResult(3, false, iter.next()); | 482 assertIteratorResult(3, false, iter.next()); |
447 assertIteratorResult(4, false, iter.next()); | 483 assertIteratorResult(4, false, iter.next()); |
448 assertIteratorResult(5, false, iter.next()); | 484 assertIteratorResult(5, false, iter.next()); |
449 assertIteratorResult(undefined, true, iter.next()); | 485 assertIteratorResult(undefined, true, iter.next()); |
450 assertThrows(function() { iter.next(); }, Error); | 486 assertThrows(function() { iter.next(); }, Error); |
| 487 } |
| 488 Test1(instantiate(g)); |
451 | 489 |
452 iter = g(); | 490 function Test2(iter) { |
453 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); | 491 assertThrows(function() { iter.throw(new Sentinel); }, Sentinel); |
454 assertThrows(function() { iter.next(); }, Error); | 492 assertThrows(function() { iter.next(); }, Error); |
| 493 } |
| 494 Test2(instantiate(g)); |
455 | 495 |
456 iter = g(); | 496 function Test3(iter) { |
457 assertIteratorResult(1, false, iter.next()); | 497 assertIteratorResult(1, false, iter.next()); |
458 assertIteratorResult(4, false, iter.throw(new Sentinel)); | 498 assertIteratorResult(4, false, iter.throw(new Sentinel)); |
459 assertThrows(function() { iter.next(); }, Sentinel); | 499 assertThrows(function() { iter.next(); }, Sentinel); |
460 assertThrows(function() { iter.next(); }, Error); | 500 assertThrows(function() { iter.next(); }, Error); |
| 501 } |
| 502 Test3(instantiate(g)); |
461 | 503 |
462 iter = g(); | 504 function Test4(iter) { |
463 assertIteratorResult(1, false, iter.next()); | 505 assertIteratorResult(1, false, iter.next()); |
464 assertIteratorResult(4, false, iter.throw(new Sentinel)); | 506 assertIteratorResult(4, false, iter.throw(new Sentinel)); |
465 assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2); | 507 assertThrows(function() { iter.throw(new Sentinel2); }, Sentinel2); |
466 assertThrows(function() { iter.next(); }, Error); | 508 assertThrows(function() { iter.next(); }, Error); |
| 509 } |
| 510 Test4(instantiate(g)); |
467 | 511 |
468 iter = g(); | 512 function Test5(iter) { |
469 assertIteratorResult(1, false, iter.next()); | 513 assertIteratorResult(1, false, iter.next()); |
470 assertIteratorResult(2, false, iter.next()); | 514 assertIteratorResult(2, false, iter.next()); |
471 var exn = new Sentinel; | 515 var exn = new Sentinel; |
472 assertIteratorResult(exn, false, iter.throw(exn)); | 516 assertIteratorResult(exn, false, iter.throw(exn)); |
473 assertIteratorResult(3, false, iter.next()); | 517 assertIteratorResult(3, false, iter.next()); |
474 assertIteratorResult(4, false, iter.next()); | 518 assertIteratorResult(4, false, iter.next()); |
475 assertIteratorResult(5, false, iter.next()); | 519 assertIteratorResult(5, false, iter.next()); |
476 assertIteratorResult(undefined, true, iter.next()); | 520 assertIteratorResult(undefined, true, iter.next()); |
477 assertThrows(function() { iter.next(); }, Error); | 521 assertThrows(function() { iter.next(); }, Error); |
478 | 522 |
479 iter = g(); | 523 } |
480 assertIteratorResult(1, false, iter.next()); | 524 Test5(instantiate(g)); |
481 assertIteratorResult(2, false, iter.next()); | |
482 var exn = new Sentinel; | |
483 assertIteratorResult(exn, false, iter.throw(exn)); | |
484 assertIteratorResult(4, false, iter.throw(new Sentinel2)); | |
485 assertThrows(function() { iter.next(); }, Sentinel2); | |
486 assertThrows(function() { iter.next(); }, Error); | |
487 | 525 |
488 iter = g(); | 526 function Test6(iter) { |
489 assertIteratorResult(1, false, iter.next()); | 527 assertIteratorResult(1, false, iter.next()); |
490 assertIteratorResult(2, false, iter.next()); | 528 assertIteratorResult(2, false, iter.next()); |
491 var exn = new Sentinel; | 529 var exn = new Sentinel; |
492 assertIteratorResult(exn, false, iter.throw(exn)); | 530 assertIteratorResult(exn, false, iter.throw(exn)); |
493 assertIteratorResult(3, false, iter.next()); | 531 assertIteratorResult(4, false, iter.throw(new Sentinel2)); |
494 assertIteratorResult(4, false, iter.throw(new Sentinel2)); | 532 assertThrows(function() { iter.next(); }, Sentinel2); |
495 assertThrows(function() { iter.next(); }, Sentinel2); | 533 assertThrows(function() { iter.next(); }, Error); |
496 assertThrows(function() { iter.next(); }, Error); | 534 } |
| 535 Test6(instantiate(g)); |
| 536 |
| 537 function Test7(iter) { |
| 538 assertIteratorResult(1, false, iter.next()); |
| 539 assertIteratorResult(2, false, iter.next()); |
| 540 var exn = new Sentinel; |
| 541 assertIteratorResult(exn, false, iter.throw(exn)); |
| 542 assertIteratorResult(3, false, iter.next()); |
| 543 assertIteratorResult(4, false, iter.throw(new Sentinel2)); |
| 544 assertThrows(function() { iter.next(); }, Sentinel2); |
| 545 assertThrows(function() { iter.next(); }, Error); |
| 546 |
| 547 } |
| 548 Test7(instantiate(g)); |
497 | 549 |
498 // That's probably enough. | 550 // That's probably enough. |
499 } | 551 } |
500 TestNestedTry(); | 552 TestNestedTry(function (g) { return g(); }); |
| 553 TestNestedTry(function* (g) { return yield* g(); }); |
501 | 554 |
502 function TestRecursion() { | 555 function TestRecursion() { |
503 function TestNextRecursion() { | 556 function TestNextRecursion() { |
504 function* g() { yield iter.next(); } | 557 function* g() { yield iter.next(); } |
505 var iter = g(); | 558 var iter = g(); |
506 return iter.next(); | 559 return iter.next(); |
507 } | 560 } |
508 function TestSendRecursion() { | 561 function TestSendRecursion() { |
509 function* g() { yield iter.send(42); } | 562 function* g() { yield iter.send(42); } |
510 var iter = g(); | 563 var iter = g(); |
511 return iter.next(); | 564 return iter.next(); |
512 } | 565 } |
513 function TestThrowRecursion() { | 566 function TestThrowRecursion() { |
514 function* g() { yield iter.throw(1); } | 567 function* g() { yield iter.throw(1); } |
515 var iter = g(); | 568 var iter = g(); |
516 return iter.next(); | 569 return iter.next(); |
517 } | 570 } |
518 assertThrows(TestNextRecursion, Error); | 571 assertThrows(TestNextRecursion, Error); |
519 assertThrows(TestSendRecursion, Error); | 572 assertThrows(TestSendRecursion, Error); |
520 assertThrows(TestThrowRecursion, Error); | 573 assertThrows(TestThrowRecursion, Error); |
521 } | 574 } |
522 TestRecursion(); | 575 TestRecursion(); |
OLD | NEW |