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