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 +}