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