summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/ref-types/tables-stress.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/ref-types/tables-stress.js')
-rw-r--r--js/src/jit-test/tests/wasm/ref-types/tables-stress.js46
1 files changed, 46 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/ref-types/tables-stress.js b/js/src/jit-test/tests/wasm/ref-types/tables-stress.js
new file mode 100644
index 0000000000..2e13e76ba0
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/ref-types/tables-stress.js
@@ -0,0 +1,46 @@
+for ( let prefix of ['', '(table $prefix 0 32 funcref)']) {
+ let mod = new WebAssembly.Module(wasmTextToBinary(
+ `(module
+ (import "m" "item" (func $item (result externref)))
+ ${prefix}
+ (table $tbl 0 externref)
+ (func (export "run") (param $numiters i32)
+ (local $i i32)
+ (local $j i32)
+ (local $last i32)
+ (local $iters i32)
+ (local $tmp externref)
+ (local.set $last (table.grow $tbl (ref.null extern) (i32.const 1)))
+ (table.set $tbl (local.get $last) (call $item))
+ (loop $iter_continue
+ (local.set $i (i32.const 0))
+ (local.set $j (local.get $last))
+ (block $l_break
+ (loop $l_continue
+ (br_if $l_break (i32.ge_s (local.get $j) (local.get $i)))
+ (local.set $tmp (table.get $tbl (local.get $i)))
+ (if (i32.eqz (i32.rem_s (local.get $i) (i32.const 3)))
+ (local.set $tmp (call $item)))
+ (table.set $tbl (local.get $i) (table.get $tbl (local.get $j)))
+ (table.set $tbl (local.get $j) (local.get $tmp))
+ (local.set $i (i32.add (local.get $i) (i32.const 1)))
+ (local.set $j (i32.sub (local.get $j) (i32.const 1)))
+ (br $l_continue))
+ (local.set $iters (i32.add (local.get $iters) (i32.const 1)))
+ (br_if $iter_continue (i32.lt_s (local.get $iters) (local.get $numiters)))))))`));
+
+ for (let [mode,freq] of [[14,100], // Compact every 100 allocations
+ [2,12], // Collect every 12 allocations
+ [7,100], // Minor gc every 100 allocations
+ [15,100]]) // Verify heap integrity
+ {
+ if (this.gczeal)
+ this.gczeal(mode,freq);
+ let k = 0;
+ let ins = new WebAssembly.Instance(mod, {m:{item:() => { return { x: k++ } }}}).exports;
+ for ( let i=0; i < 1000; i++ )
+ ins.run(1000);
+ }
+}
+
+