summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/regress/misc-control-flow.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/regress/misc-control-flow.js')
-rw-r--r--js/src/jit-test/tests/wasm/regress/misc-control-flow.js226
1 files changed, 226 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/regress/misc-control-flow.js b/js/src/jit-test/tests/wasm/regress/misc-control-flow.js
new file mode 100644
index 000000000..81d44f278
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/misc-control-flow.js
@@ -0,0 +1,226 @@
+load(libdir + "wasm.js");
+
+wasmFailValidateText(`(module
+ (func (result i32) (param i32)
+ (loop (if (i32.const 0) (br 0)) (get_local 0)))
+ (export "" 0)
+)`, /unused values not explicitly dropped by end of block/);
+
+wasmFailValidateText(`(module
+ (func (param i32)
+ (loop (if (i32.const 0) (br 0)) (get_local 0)))
+ (export "" 0)
+)`, /unused values not explicitly dropped by end of block/);
+
+wasmFailValidateText(`(module
+ (func (result i32) (param i32)
+ (loop (if (i32.const 0) (br 0)) (drop (get_local 0))))
+ (export "" 0)
+)`, mismatchError("void", "i32"));
+
+assertEq(wasmEvalText(`(module
+ (func (result i32) (param i32)
+ (loop (if (i32.const 0) (br 0))) (get_local 0))
+ (export "" 0)
+)`).exports[""](42), 42);
+
+wasmEvalText(`(module (func $func$0
+ (block (if (i32.const 1) (loop (br_table 0 (br 0)))))
+ )
+)`);
+
+wasmEvalText(`(module (func
+ (loop $out $in (br_table $out $out $in (i32.const 0)))
+ )
+)`);
+
+wasmEvalText(`(module (func (result i32)
+ (select
+ (block i32
+ (drop (block i32
+ (br_table
+ 1
+ 0
+ (i32.const 1)
+ (i32.const 0)
+ )
+ ))
+ (i32.const 2)
+ )
+ (i32.const 3)
+ (i32.const 4)
+ )
+))
+`);
+
+wasmEvalText(`(module
+ (func (result i32) (param i32) (param i32) (i32.const 0))
+ (func (result i32)
+ (call 0 (i32.const 1) (call 0 (i32.const 2) (i32.const 3)))
+ (call 0 (unreachable) (i32.const 4))
+ )
+)`);
+
+wasmEvalText(`
+(module
+
+ (func
+ (param i32) (param i32) (param i32) (param i32)
+ (result i32)
+ (i32.const 0)
+ )
+
+ (func (result i32)
+ (call 0
+ (i32.const 42)
+ (i32.const 53)
+ (call 0 (i32.const 100) (i32.const 13) (i32.const 37) (i32.const 128))
+ (return (i32.const 42))
+ )
+ )
+
+ (export "" 1)
+)
+`).exports[""]();
+
+wasmEvalText(`
+(module
+ (import "check" "one" (param i32))
+ (import "check" "two" (param i32) (param i32))
+ (func (param i32) (call 0 (get_local 0)))
+ (func (param i32) (param i32) (call 1 (get_local 0) (get_local 1)))
+ (func
+ (call 1
+ (i32.const 43)
+ (block $b i32
+ (if (i32.const 1)
+ (call 0
+ (block i32
+ (call 0 (i32.const 42))
+ (br $b (i32.const 10)))))
+ (i32.const 44))))
+ (export "foo" 4))
+`, {
+ check: {
+ one(x) {
+ assertEq(x, 42);
+ },
+ two(x, y) {
+ assertEq(x, 43);
+ assertEq(y, 10);
+ }
+ }
+}).exports.foo();
+
+assertEq(wasmEvalText(`(module (func
+ (return)
+ (select
+ (loop (i32.const 1))
+ (loop (i32.const 2))
+ (i32.const 3)
+ )
+) (export "" 0))`).exports[""](), undefined);
+
+wasmEvalText(`(module (func (result i32)
+ (return (i32.const 0))
+ (select
+ (loop (i32.const 1))
+ (loop (i32.const 2))
+ (i32.const 3)
+ )
+))`);
+
+wasmEvalText(`(module (func
+ (block $return
+ (block $beforeReturn
+ (loop $out $in
+ (block $otherTable
+ (br_table
+ $return
+ $return
+ $otherTable
+ $beforeReturn
+ (i32.const 0)
+ )
+ )
+ (block $backTop
+ (br_table
+ $backTop
+ $backTop
+ $beforeReturn
+ (i32.const 0)
+ )
+ )
+ (br $in)
+ )
+ )
+ )
+))`);
+
+wasmFailValidateText(
+`(module
+ (func $func$0
+ (select
+ (if f32
+ (i32.const 0)
+ (f32.const 0)
+ (i32.const 0)
+ )
+ (if f32
+ (i32.const 0)
+ (f32.const 0)
+ (i32.const 0)
+ )
+ (i32.const 0)
+ )
+ )
+)`, mismatchError("i32", "f32"));
+
+wasmEvalText(`
+(module
+ (func (result i32)
+ (i32.add
+ (block $outer i32
+ (drop (block $middle i32
+ (block $inner i32
+ (br_table $middle $outer $inner (i32.const 42) (i32.const 1))
+ )
+ (nop)
+ ))
+ (i32.const 0)
+ )
+ (i32.const 13)
+ )
+ )
+)
+`);
+
+wasmFailValidateText(`
+(module
+ (func (result i32)
+ (loop
+ (i32.const 0)
+ (br_table 1 0 (i32.const 15))
+ )
+ )
+)`, mismatchError("i32", "void"));
+
+wasmFailValidateText(`
+(module
+ (func (result i32)
+ (loop i32
+ (i32.const 0)
+ (br_table 1 0 (i32.const 15))
+ )
+ )
+)`, mismatchError("i32", "void"));
+
+wasmValidateText(`
+(module
+ (func
+ (loop
+ (i32.const 0)
+ (br_table 1 0 (i32.const 15))
+ )
+ )
+)`);