tor-browser

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

disposal-during-non-local-jump-with-iterator-close.js (3068B)


      1 // |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management
      2 
      3 load(libdir + "asserts.js");
      4 
      5 {
      6  const values = [];
      7  const iterator = {
      8    [Symbol.iterator]: () => ({
      9      i: 0,
     10      return() {
     11        values.push("return");
     12        return { done: true };
     13      },
     14      next() {
     15        return {
     16          value: {
     17            val: this.i++,
     18            [Symbol.dispose]() {
     19              values.push(this.val);
     20            }
     21          },
     22          done: false
     23        }
     24      }
     25    })
     26  }
     27 
     28  function testReturnsHappenAfterDisposal() {
     29    for (using d of iterator) {
     30      if (d.val === 3) {
     31        break;
     32      }
     33    }
     34  }
     35 
     36  testReturnsHappenAfterDisposal();
     37  assertArrayEq(values, [0, 1, 2, 3, "return"]);
     38 }
     39 
     40 {
     41  const values = [];
     42  function* iterator() {
     43    let i = 0;
     44    try {
     45      while (true) {
     46        yield {
     47          val: i++,
     48          [Symbol.dispose]() {
     49            values.push(this.val);
     50          }
     51        };
     52      }
     53    } finally {
     54      values.push("return");
     55    }
     56  }
     57 
     58  function testReturnsHappenAfterDisposalWithGeneratorWithFinally() {
     59    for (using d of iterator()) {
     60      if (d.val === 3) {
     61        break;
     62      }
     63    }
     64  }
     65 
     66  testReturnsHappenAfterDisposalWithGeneratorWithFinally();
     67  assertArrayEq(values, [0, 1, 2, 3, "return"]);
     68 }
     69 
     70 {
     71  const values = [];
     72  function* iterator() {
     73    let i = 0;
     74    while (true) {
     75      yield {
     76        val: i++,
     77        [Symbol.dispose]() {
     78          values.push(this.val);
     79        }
     80      };
     81    }
     82  }
     83 
     84  function testReturnsHappenAfterDisposalWithGeneratorWithCustomReturn() {
     85    const iter = iterator();
     86    iter.return = function () {
     87      values.push("return");
     88      return { done: true };
     89    };
     90    for (using d of iter) {
     91      if (d.val === 3) {
     92        break;
     93      }
     94    }
     95  }
     96 
     97  testReturnsHappenAfterDisposalWithGeneratorWithCustomReturn();
     98  assertArrayEq(values, [0, 1, 2, 3, "return"]);
     99 }
    100 
    101 {
    102  const values = [];
    103  const iterator = {
    104    [Symbol.iterator]: () => ({
    105      i: 0,
    106      return() {
    107        values.push("return");
    108        return { done: true };
    109      },
    110      next() {
    111        return {
    112          value: {
    113            val: this.i++,
    114            [Symbol.dispose]() {
    115              values.push(this.val);
    116            }
    117          },
    118          done: false
    119        }
    120      }
    121    })
    122  }
    123 
    124  function testReturnsHappenAfterDisposalWithLabels() {
    125    outer: for (let action of ['continue', 'break']) {
    126      for (using d of iterator) {
    127        const toJump = d.val === 3;
    128        switch (action) {
    129          case 'continue':
    130            if (toJump) {
    131              {
    132                let a = 0, b = () => a;
    133                continue outer;
    134              }
    135            }
    136            break;
    137          case 'break':
    138            if (toJump) {
    139              {
    140                let a = 0, b = () => a;
    141                break outer;
    142              }
    143            }
    144            break;
    145        }
    146      }
    147    }
    148  }
    149 
    150  testReturnsHappenAfterDisposalWithLabels();
    151  assertArrayEq(values, [0,1,2,3,"return",0,1,2,3,"return"]);
    152 }