iterclose-invalidate-with-finally.js (854B)
1 var invalidate = false; 2 var finallyCount = 0; 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 } finally { 31 finallyCount++; 32 } 33 } 34 35 function test() { 36 with ({}) {} 37 for (var i = 0; i < 100; i++) { 38 closeIter(iterable); 39 } 40 invalidate = true; 41 try { 42 closeIter(iterable); 43 } catch {} 44 invalidate = 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(); 55 assertEq(finallyCount, 203);