limits.js (1985B)
1 // |jit-test| skip-if: getBuildConfiguration("wasi") 2 // 3 // Tests aimed at AbstractGeneratorObject::FixedSlotLimit. 4 5 "use strict"; 6 7 function test(n) { 8 const iterate = (start, f) => { 9 let value = start; 10 for (let i = n; i-- > 0; ) { 11 value = f(value, i); 12 } 13 return value; 14 }; 15 16 const generate = (start, f) => { 17 let s = iterate(start, f); 18 let gen = eval('(function* () {\n' + s + '})'); 19 return gen(); 20 }; 21 22 // Test 1: many vars in the function scope 23 { 24 let it = generate( 25 "yield 0;", 26 (s, i) => ` 27 var v${i} = ${i}; 28 ${s} 29 assertEq(v${i}, ${i}); 30 ` 31 ); 32 assertEq(it.next().done, false); 33 assertEq(it.next().done, true); 34 } 35 36 // Test 2: many let-bindings in nested lexical scopes 37 { 38 let it = generate( 39 "yield a => v174;", 40 (s, i) => { 41 let block = ` 42 let v${i} = ${i}; 43 ${s} 44 assertEq(v${i}, ${i}); 45 `; 46 if (i % 17 == 0) { 47 block = '{\n' + block + '}\n'; 48 } 49 return block; 50 } 51 ); 52 assertEq(it.next().done, false); 53 assertEq(it.next().done, true); 54 } 55 56 // Test 3: TDZ is preserved across yield 57 { 58 let it = generate( 59 'yield 0;\n' + 60 'try { v1; } catch (exc) { yield [1, exc]; }\n' + 61 `try { v${n - 1}; } catch (exc) { yield [2, exc]; }\n`, 62 (s, i) => { 63 let block = ` 64 ${s} 65 let v${i}; 66 `; 67 if (i % 256 == 0) { 68 block = '{\n' + block + '}\n'; 69 } 70 return block; 71 } 72 ); 73 let {value, done} = it.next(); 74 assertEq(value, 0); 75 ({value, done} = it.next()); 76 assertEq(value[0], 1); 77 assertEq(value[1].name, "ReferenceError"); 78 ({value, done} = it.next()); 79 assertEq(value[0], 2); 80 assertEq(value[1].name, "ReferenceError"); 81 ({value, done} = it.next()); 82 assertEq(done, true); 83 } 84 } 85 86 for (let exp = 8; exp < 12; exp++) { 87 const n = 2 ** exp; 88 test(n - 2); 89 test(n + 1); 90 }