async-disposal-during-throw-async-generator.js (1869B)
1 // |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management 2 3 load(libdir + "asserts.js"); 4 5 class CustomError extends Error {} 6 7 { 8 const values = []; 9 async function* gen() { 10 yield 1; 11 await using a = { 12 [Symbol.asyncDispose]() { 13 values.push("a"); 14 } 15 } 16 yield 2; 17 await using b = { 18 [Symbol.asyncDispose]() { 19 values.push("b"); 20 } 21 } 22 throw new CustomError(); 23 yield 3; 24 } 25 let caught = false; 26 async function testDisposalDuringThrowInGenerator() { 27 let x = gen(); 28 values.push((await x.next()).value); 29 values.push((await x.next()).value); 30 try { 31 await x.next(); 32 } catch (e) { 33 assertEq(e instanceof CustomError, true); 34 caught = true; 35 } 36 } 37 testDisposalDuringThrowInGenerator(); 38 drainJobQueue(); 39 assertEq(caught, true); 40 assertArrayEq(values, [1, 2, "b", "a"]); 41 } 42 43 { 44 const values = []; 45 async function* gen() { 46 yield 1; 47 await using a = { 48 [Symbol.asyncDispose]() { 49 values.push("a"); 50 } 51 } 52 yield 2; 53 await using b = { 54 [Symbol.asyncDispose]() { 55 values.push("b"); 56 } 57 } 58 yield 3; 59 } 60 let caught = false; 61 async function testDisposalDuringForcedThrowInGenerator() { 62 let x = gen(); 63 values.push((await x.next()).value); 64 values.push((await x.next()).value); 65 try { 66 // the generator was resumed right at the point where 67 // we have yield 2, and the throw statement is inserted right over 68 // there preventing the evaluation of `await using b`. 69 await x.throw(new CustomError()); 70 } catch (e) { 71 assertEq(e instanceof CustomError, true); 72 caught = true; 73 } 74 } 75 testDisposalDuringForcedThrowInGenerator(); 76 drainJobQueue(); 77 assertEq(caught, true); 78 assertArrayEq(values, [1, 2, "a"]); 79 }