tor-browser

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

yield-in-finally.js (2574B)


      1 // return value in try block should not be overridden by yield in finally block.
      2 
      3 load(libdir + "asserts.js");
      4 
      5 // simple
      6 function* g1() {
      7  try {
      8    return 42;
      9  } finally {
     10    yield 43;
     11  }
     12 }
     13 var o = g1();
     14 var v = o.next();
     15 assertEq(v.done, false);
     16 assertEq(v.value, 43);
     17 v = o.next();
     18 assertEq(v.done, true);
     19 assertEq(v.value, 42);
     20 v = o.next();
     21 assertEq(v.done, true);
     22 assertEq(v.value, undefined);
     23 
     24 // without return value
     25 function* g2() {
     26  try {
     27    return;
     28  } finally {
     29    yield 43;
     30  }
     31 }
     32 o = g2();
     33 v = o.next();
     34 assertEq(v.done, false);
     35 assertEq(v.value, 43);
     36 v = o.next();
     37 assertEq(v.done, true);
     38 assertEq(v.value, undefined);
     39 v = o.next();
     40 assertEq(v.done, true);
     41 assertEq(v.value, undefined);
     42 
     43 // nested try-finally
     44 function* g3() {
     45  try {
     46    try {
     47      return 42;
     48    } finally {
     49      try {
     50        return 43;
     51      } finally {
     52        yield 44;
     53      }
     54    }
     55  } finally {
     56    yield 45;
     57  }
     58 }
     59 o = g3();
     60 v = o.next();
     61 assertEq(v.done, false);
     62 assertEq(v.value, 44);
     63 v = o.next();
     64 assertEq(v.done, false);
     65 assertEq(v.value, 45);
     66 v = o.next();
     67 assertEq(v.done, true);
     68 assertEq(v.value, 43);
     69 v = o.next();
     70 assertEq(v.done, true);
     71 assertEq(v.value, undefined);
     72 
     73 // yield*
     74 function* g4() {
     75  try {
     76    return 42;
     77  } finally {
     78    try {
     79      return 43;
     80    } finally {
     81      yield* g5();
     82    }
     83  }
     84 }
     85 function* g5() {
     86  yield 44;
     87  return 45;
     88 }
     89 o = g4();
     90 v = o.next();
     91 assertEq(v.done, false);
     92 assertEq(v.value, 44);
     93 v = o.next();
     94 assertEq(v.done, true);
     95 assertEq(v.value, 43);
     96 v = o.next();
     97 assertEq(v.done, true);
     98 assertEq(v.value, undefined);
     99 
    100 // return in block scope
    101 function* g6() {
    102  let a = 10;
    103  {
    104    let a = 20;
    105    try {
    106      let a = 30;
    107      {
    108        let a = 40;
    109        return 42;
    110      }
    111    } finally {
    112      yield 43;
    113    }
    114  }
    115 }
    116 o = g6();
    117 v = o.next();
    118 assertEq(v.done, false);
    119 assertEq(v.value, 43);
    120 v = o.next();
    121 assertEq(v.done, true);
    122 assertEq(v.value, 42);
    123 v = o.next();
    124 assertEq(v.done, true);
    125 assertEq(v.value, undefined);
    126 
    127 // no finally
    128 function* g7() {
    129  try {
    130    return 42;
    131  } catch (e) {
    132    yield 1;
    133  }
    134 }
    135 o = g7();
    136 v = o.next();
    137 assertEq(v.done, true);
    138 assertEq(v.value, 42);
    139 v = o.next();
    140 assertEq(v.done, true);
    141 assertEq(v.value, undefined);
    142 
    143 // in "with" statement
    144 eval(`
    145 function* g9() {
    146  with ({ ".genrval": { value: 44, done: false } }) {
    147    try {
    148      return 42;
    149    } finally {
    150      yield 43;
    151    }
    152  }
    153 }
    154 o = g9();
    155 v = o.next();
    156 assertEq(v.done, false);
    157 assertEq(v.value, 43);
    158 v = o.next();
    159 assertEq(v.done, true);
    160 assertEq(v.value, 42);
    161 v = o.next();
    162 assertEq(v.done, true);
    163 assertEq(v.value, undefined);
    164 `);