1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_6/Generators/delegating-yield-3.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,40 @@ 1.4 +// Test yield* with iter.next and monkeypatching. 1.5 + 1.6 +function* g(n) { for (var i=0; i<n; i++) yield i; } 1.7 +function* delegate(iter) { return yield* iter; } 1.8 +var GeneratorObjectPrototype = Object.getPrototypeOf(g).prototype; 1.9 +var GeneratorObjectPrototype_next = GeneratorObjectPrototype.next; 1.10 + 1.11 +// Monkeypatch next on an iterator. 1.12 +var inner = g(20); 1.13 +var outer = delegate(inner); 1.14 +assertIteratorNext(outer, 0); 1.15 +assertIteratorNext(outer, 1); 1.16 +inner.next = function() { return 0; }; 1.17 +// 42 yielded directly without re-boxing. 1.18 +assertEq(0, outer.next()); 1.19 +// Outer generator not terminated. 1.20 +assertEq(0, outer.next()); 1.21 +// Restore. 1.22 +inner.next = GeneratorObjectPrototype_next; 1.23 +assertIteratorNext(outer, 2); 1.24 +// Repatch. 1.25 +inner.next = function() { return { value: 42, done: true }; }; 1.26 +assertIteratorDone(outer, 42); 1.27 + 1.28 +// Monkeypunch next on the prototype. 1.29 +var inner = g(20); 1.30 +var outer = delegate(inner); 1.31 +assertIteratorNext(outer, 0); 1.32 +assertIteratorNext(outer, 1); 1.33 +GeneratorObjectPrototype.next = function() { return 0; }; 1.34 +// 42 yielded directly without re-boxing. 1.35 +assertEq(0, GeneratorObjectPrototype_next.call(outer)); 1.36 +// Outer generator not terminated. 1.37 +assertEq(0, GeneratorObjectPrototype_next.call(outer)); 1.38 +// Restore. 1.39 +GeneratorObjectPrototype.next = GeneratorObjectPrototype_next; 1.40 +assertIteratorNext(outer, 2); 1.41 + 1.42 +if (typeof reportCompare == "function") 1.43 + reportCompare(true, true);