tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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);