summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/generators/limits.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/jit-test/tests/generators/limits.js
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/generators/limits.js')
-rw-r--r--js/src/jit-test/tests/generators/limits.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/generators/limits.js b/js/src/jit-test/tests/generators/limits.js
new file mode 100644
index 0000000000..304ae6896a
--- /dev/null
+++ b/js/src/jit-test/tests/generators/limits.js
@@ -0,0 +1,90 @@
+// |jit-test| skip-if: getBuildConfiguration()['wasi']
+//
+// Tests aimed at AbstractGeneratorObject::FixedSlotLimit.
+
+"use strict";
+
+function test(n) {
+ const iterate = (start, f) => {
+ let value = start;
+ for (let i = n; i-- > 0; ) {
+ value = f(value, i);
+ }
+ return value;
+ };
+
+ const generate = (start, f) => {
+ let s = iterate(start, f);
+ let gen = eval('(function* () {\n' + s + '})');
+ return gen();
+ };
+
+ // Test 1: many vars in the function scope
+ {
+ let it = generate(
+ "yield 0;",
+ (s, i) => `
+ var v${i} = ${i};
+ ${s}
+ assertEq(v${i}, ${i});
+ `
+ );
+ assertEq(it.next().done, false);
+ assertEq(it.next().done, true);
+ }
+
+ // Test 2: many let-bindings in nested lexical scopes
+ {
+ let it = generate(
+ "yield a => v174;",
+ (s, i) => {
+ let block = `
+ let v${i} = ${i};
+ ${s}
+ assertEq(v${i}, ${i});
+ `;
+ if (i % 17 == 0) {
+ block = '{\n' + block + '}\n';
+ }
+ return block;
+ }
+ );
+ assertEq(it.next().done, false);
+ assertEq(it.next().done, true);
+ }
+
+ // Test 3: TDZ is preserved across yield
+ {
+ let it = generate(
+ 'yield 0;\n' +
+ 'try { v1; } catch (exc) { yield [1, exc]; }\n' +
+ `try { v${n - 1}; } catch (exc) { yield [2, exc]; }\n`,
+ (s, i) => {
+ let block = `
+ ${s}
+ let v${i};
+ `;
+ if (i % 256 == 0) {
+ block = '{\n' + block + '}\n';
+ }
+ return block;
+ }
+ );
+ let {value, done} = it.next();
+ assertEq(value, 0);
+ ({value, done} = it.next());
+ assertEq(value[0], 1);
+ assertEq(value[1].name, "ReferenceError");
+ ({value, done} = it.next());
+ assertEq(value[0], 2);
+ assertEq(value[1].name, "ReferenceError");
+ ({value, done} = it.next());
+ assertEq(done, true);
+ }
+}
+
+for (let exp = 8; exp < 12; exp++) {
+ const n = 2 ** exp;
+ test(n - 2);
+ test(n + 1);
+}