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.js227
1 files changed, 227 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 0000000000..6feafcee1b
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/misc-control-flow.js
@@ -0,0 +1,227 @@
+wasmFailValidateText(`(module
+ (func (param i32) (result i32)
+ (loop (if (i32.const 0) (br 0)) (local.get 0)))
+ (export "" (func 0))
+)`, /(unused values not explicitly dropped by end of block)|(values remaining on stack at end of block)/);
+
+wasmFailValidateText(`(module
+ (func (param i32)
+ (loop (if (i32.const 0) (br 0)) (local.get 0)))
+ (export "" (func 0))
+)`, /(unused values not explicitly dropped by end of block)|(values remaining on stack at end of block)/);
+
+wasmFailValidateText(`(module
+ (func (param i32) (result i32)
+ (loop (if (i32.const 0) (br 0)) (drop (local.get 0))))
+ (export "" (func 0))
+)`, emptyStackError);
+
+assertEq(wasmEvalText(`(module
+ (func (param i32) (result i32)
+ (loop (if (i32.const 0) (br 0))) (local.get 0))
+ (export "" (func 0))
+)`).exports[""](42), 42);
+
+wasmEvalText(`(module (func $func$0
+ (block (if (i32.const 1) (loop (br_table 0 (br 0)))))
+ )
+)`);
+
+wasmEvalText(`(module (func
+ (block $out (loop $in (br_table $out $out $in (i32.const 0))))
+ )
+)`);
+
+wasmEvalText(`(module (func (result i32)
+ (select
+ (block (result i32)
+ (drop (block (result i32)
+ (br_table
+ 1
+ 0
+ (i32.const 1)
+ (i32.const 0)
+ )
+ ))
+ (i32.const 2)
+ )
+ (i32.const 3)
+ (i32.const 4)
+ )
+))
+`);
+
+wasmEvalText(`(module
+ (func (param i32) (param i32) (result 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 "" (func 1))
+)
+`).exports[""]();
+
+wasmEvalText(`
+(module
+ (import "check" "one" (func (param i32)))
+ (import "check" "two" (func (param i32) (param i32)))
+ (func (param i32) (call 0 (local.get 0)))
+ (func (param i32) (param i32) (call 1 (local.get 0) (local.get 1)))
+ (func
+ (call 1
+ (i32.const 43)
+ (block $b (result i32)
+ (if (i32.const 1)
+ (call 0
+ (block (result i32)
+ (call 0 (i32.const 42))
+ (br $b (i32.const 10)))))
+ (i32.const 44))))
+ (export "foo" (func 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 (result i32) (i32.const 1))
+ (loop (result i32) (i32.const 2))
+ (i32.const 3)
+ )
+ drop
+) (export "" (func 0)))`).exports[""](), undefined);
+
+wasmEvalText(`(module (func (result i32)
+ (return (i32.const 0))
+ (select
+ (loop (result i32) (i32.const 1))
+ (loop (result i32) (i32.const 2))
+ (i32.const 3)
+ )
+))`);
+
+wasmEvalText(`(module (func
+ (block $return
+ (block $beforeReturn
+ (block $out
+ (loop $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 (result f32)
+ (i32.const 0)
+ (f32.const 0)
+ (i32.const 0)
+ )
+ (if (result 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 (result i32)
+ (drop (block $middle (result i32)
+ (block $inner (result 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))
+ )
+ )
+)`, /(br_table targets must all have the same arity)|(br_table target labels have different types)/);
+
+wasmFailValidateText(`
+(module
+ (func (result i32)
+ (loop (result i32)
+ (i32.const 0)
+ (br_table 1 0 (i32.const 15))
+ )
+ )
+)`, /(br_table targets must all have the same arity)|(br_table target labels have different types)/);
+
+wasmValidateText(`
+(module
+ (func
+ (loop
+ (i32.const 0)
+ (br_table 1 0 (i32.const 15))
+ )
+ )
+)`);