js/src/jit-test/tests/for-of/next-shenanigans.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/for-of/next-shenanigans.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,41 @@
     1.4 +// Test for-of with iter.next and monkeypatching.
     1.5 +
     1.6 +function* g(n) { for (var i=0; i<n; i++) yield i; }
     1.7 +var GeneratorObjectPrototype = Object.getPrototypeOf(g).prototype;
     1.8 +var GeneratorObjectPrototype_next = GeneratorObjectPrototype.next;
     1.9 +
    1.10 +// Monkeypatch next on an iterator.
    1.11 +var inner = g(20);
    1.12 +var n = 0;
    1.13 +for (let x of inner) {
    1.14 +    if (n == 0) {
    1.15 +        assertEq(x, n++);
    1.16 +    } else if (n == 1) {
    1.17 +        assertEq(x, n++);
    1.18 +        inner.next = function() { return { value: 42, done: false }; };
    1.19 +    } else if (n == 2) {
    1.20 +        assertEq(x, 42);
    1.21 +        inner.next = function() { return { value: 100, done: true }; };
    1.22 +    } else
    1.23 +        throw 'not reached';
    1.24 +}
    1.25 +
    1.26 +// Monkeypatch next on the prototype.
    1.27 +var inner = g(20);
    1.28 +var n = 0;
    1.29 +for (let x of inner) {
    1.30 +    if (n == 0) {
    1.31 +        assertEq(x, n++);
    1.32 +    } else if (n == 1) {
    1.33 +        assertEq(x, n++);
    1.34 +        GeneratorObjectPrototype.next =
    1.35 +            function() { return { value: 42, done: false }; };
    1.36 +    } else if (n == 2) {
    1.37 +        n++;
    1.38 +        assertEq(x, 42);
    1.39 +        GeneratorObjectPrototype.next = GeneratorObjectPrototype_next;
    1.40 +    } else if (n <= 20) {
    1.41 +        assertEq(x, n++ - 1);
    1.42 +    } else
    1.43 +        throw 'not reached';
    1.44 +}

mercurial