js/src/tests/ecma_6/Generators/delegating-yield-3.js

changeset 0
6474c204b198
     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);

mercurial