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

Side by Side Diff: test/mjsunit/es6/generators-iteration.js

Issue 1643903003: [generators] Desugar yield*. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Refer to ResumeMode Created 4 years, 10 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
« no previous file with comments | « src/parsing/rewriter.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 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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 390
391 // Access to this with formal arguments. 391 // Access to this with formal arguments.
392 TestGenerator( 392 TestGenerator(
393 function () { 393 function () {
394 return ({ x: 42, g: function* (a) { yield this.x } }).g(0); 394 return ({ x: 42, g: function* (a) { yield this.x } }).g(0);
395 }, 395 },
396 [42, undefined], 396 [42, undefined],
397 "foo", 397 "foo",
398 [42, undefined]); 398 [42, undefined]);
399 399
400 // Test that yield* re-yields received results without re-boxing. 400 // Test that yield* validates iterator results.
401 function TestDelegatingYield() { 401 function TestDelegatingYield(junk) {
402 function results(results) { 402 var iterator = {next: () => junk};
403 var i = 0; 403 var iterable = {[Symbol.iterator]: () => iterator};
404 function next() { 404 function* g() { return yield* iterable };
405 return results[i++]; 405 assertThrows(() => g().next(), TypeError);
406 }
407 var iter = { next: next };
408 var ret = {};
409 ret[Symbol.iterator] = function() { return iter; };
410 return ret;
411 }
412 function* yield_results(expected) {
413 return yield* results(expected);
414 }
415 function collect_results(iterable) {
416 var iter = iterable[Symbol.iterator]();
417 var ret = [];
418 var result;
419 do {
420 result = iter.next();
421 ret.push(result);
422 } while (!result.done);
423 return ret;
424 }
425 // We have to put a full result for the end, because the return will re-box.
426 var expected = [{value: 1}, 13, "foo", {value: 34, done: true}];
427
428 // Sanity check.
429 assertEquals(expected, collect_results(results(expected)));
430 assertEquals(expected, collect_results(yield_results(expected)));
431 } 406 }
432 TestDelegatingYield(); 407 TestDelegatingYield();
408 TestDelegatingYield(null);
409 TestDelegatingYield(42);
410 TestDelegatingYield(true);
433 411
434 function TestTryCatch(instantiate) { 412 function TestTryCatch(instantiate) {
435 function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; } 413 function* g() { yield 1; try { yield 2; } catch (e) { yield e; } yield 3; }
436 function Sentinel() {} 414 function Sentinel() {}
437 415
438 function Test1(iter) { 416 function Test1(iter) {
439 assertIteratorResult(1, false, iter.next()); 417 assertIteratorResult(1, false, iter.next());
440 assertIteratorResult(2, false, iter.next()); 418 assertIteratorResult(2, false, iter.next());
441 assertIteratorResult(3, false, iter.next()); 419 assertIteratorResult(3, false, iter.next());
442 assertIteratorIsClosed(iter); 420 assertIteratorIsClosed(iter);
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 function TestThrowRecursion() { 652 function TestThrowRecursion() {
675 function* g() { yield iter.throw(1); } 653 function* g() { yield iter.throw(1); }
676 var iter = g(); 654 var iter = g();
677 return iter.next(); 655 return iter.next();
678 } 656 }
679 assertThrows(TestNextRecursion, Error); 657 assertThrows(TestNextRecursion, Error);
680 assertThrows(TestSendRecursion, Error); 658 assertThrows(TestSendRecursion, Error);
681 assertThrows(TestThrowRecursion, Error); 659 assertThrows(TestThrowRecursion, Error);
682 } 660 }
683 TestRecursion(); 661 TestRecursion();
662
663
664 // Test yield* on non-iterable objects.
665 function* g(junk) { return yield* junk }
666 var non_iterables = [
667 42,
668 {[Symbol.iterator]: 42},
669 {[Symbol.iterator]: () => 42},
670 {[Symbol.iterator]: () => ({next: 42})},
671 ];
672 for (let junk of non_iterables) {
673 assertThrows(() => g(junk).next(), TypeError);
674 }
OLDNEW
« no previous file with comments | « src/parsing/rewriter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698