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 }