summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/gc/limits.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/gc/limits.js')
-rw-r--r--js/src/jit-test/tests/wasm/gc/limits.js69
1 files changed, 69 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/gc/limits.js b/js/src/jit-test/tests/wasm/gc/limits.js
new file mode 100644
index 0000000000..e6f21b5d6b
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/gc/limits.js
@@ -0,0 +1,69 @@
+// |jit-test| skip-if: !wasmGcEnabled() || getBuildConfiguration("tsan")
+
+// This test has a timeout on TSAN configurations due to the large
+// allocations.
+
+// Limit of 1 million recursion groups
+wasmValidateText(`(module
+ ${`(rec (type (func)))`.repeat(1_000_000)}
+ )`);
+wasmFailValidateText(`(module
+ ${`(rec (type (func)))`.repeat(1_000_001)}
+ )`, /too many/);
+
+// Limit of 1 million types (across all recursion groups)
+wasmValidateText(`(module
+ (rec ${`(type (func))`.repeat(1_000_000)})
+ )`);
+wasmValidateText(`(module
+ (rec ${`(type (func))`.repeat(500_000)})
+ (rec ${`(type (func))`.repeat(500_000)})
+ )`);
+wasmFailValidateText(`(module
+ (rec ${`(type (func))`.repeat(1_000_001)})
+ )`, /too many/);
+wasmFailValidateText(`(module
+ (rec ${`(type (func))`.repeat(500_000)})
+ (rec ${`(type (func))`.repeat(500_001)})
+ )`, /too many/);
+
+// Limit of subtyping hierarchy 63 deep
+function testSubtypingModule(depth) {
+ let types = '(type (sub (func)))';
+ for (let i = 1; i <= depth; i++) {
+ types += `(type (sub ${i - 1} (func)))`;
+ }
+ return `(module
+ ${types}
+ )`;
+}
+wasmValidateText(testSubtypingModule(63));
+wasmFailValidateText(testSubtypingModule(64), /too deep/);
+
+// Limit of 10_000 struct fields
+wasmFailValidateText(`(module
+ (type (struct ${'(field i64)'.repeat(10_001)}))
+)`, /too many/);
+
+{
+ let {makeLargeStructDefault, makeLargeStruct} = wasmEvalText(`(module
+ (type $s (struct ${'(field i64)'.repeat(10_000)}))
+ (func (export "makeLargeStructDefault") (result anyref)
+ struct.new_default $s
+ )
+ (func (export "makeLargeStruct") (result anyref)
+ ${'i64.const 0 '.repeat(10_000)}
+ struct.new $s
+ )
+ )`).exports;
+ let largeStructDefault = makeLargeStructDefault();
+ let largeStruct = makeLargeStruct();
+}
+
+// array.new_fixed has limit of 10_000 operands
+wasmFailValidateText(`(module
+ (type $a (array i32))
+ (func
+ array.new_fixed $a 10001
+ )
+)`, /too many/);