iterclose-invalidate.js (829B)
1 var returnInvalid = false; 2 3 const iterable = { 4 [Symbol.iterator]() { 5 return { 6 i: 0, 7 next() { 8 return { value: this.i++, done: false } 9 }, 10 return() { 11 if (returnInvalid) { 12 // Invalidate Ion scripts. 13 gc(closeIter, 'shrinking'); 14 return undefined; 15 } 16 return { value: "return", done: true }; 17 } 18 }; 19 } 20 } 21 22 function closeIter(o) { 23 for (var x of o) { 24 if (x == 2) { 25 break; 26 } 27 } 28 } 29 30 function test() { 31 with ({}) {} 32 for (var i = 0; i < 100; i++) { 33 closeIter(iterable); 34 } 35 returnInvalid = true; 36 var caught = false; 37 try { 38 closeIter(iterable); 39 } catch { 40 caught = true; 41 } 42 assertEq(caught, true); 43 returnInvalid = false; 44 } 45 46 with ({}) {} 47 48 test(); 49 50 // Force an IC in Ion. 51 closeIter([1,2,3,4,5]); 52 53 test();