-
Notifications
You must be signed in to change notification settings - Fork 64
Expand file tree
/
Copy pathbr_on_non_null.wast
More file actions
104 lines (90 loc) · 2.96 KB
/
br_on_non_null.wast
File metadata and controls
104 lines (90 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
(module
(type $t (func (result i32)))
(func $nn (param $r (ref $t)) (result i32)
(call_ref $t
(block $l (result (ref $t))
(br_on_non_null $l (local.get $r))
(return (i32.const -1))
)
)
)
(func $n (param $r (ref null $t)) (result i32)
(call_ref $t
(block $l (result (ref $t))
(br_on_non_null $l (local.get $r))
(return (i32.const -1))
)
)
)
(func $n2 (param $r (ref null $t)) (result i32)
(call_ref $t
(ref.as_non_null
(block $l (result (ref null $t))
(br_on_non_null $l (local.get $r))
(return (i32.const -2))
)
)
)
)
(elem func $f)
(func $f (result i32) (i32.const 7))
(func (export "nonnullable-f") (result i32) (call $nn (ref.func $f)))
(func (export "nullable-null") (result i32) (call $n (ref.null $t)))
(func (export "nullable-f") (result i32) (call $n (ref.func $f)))
(func (export "nullable2-null") (result i32) (call $n2 (ref.null $t)))
(func (export "nullable2-f") (result i32) (call $n2 (ref.func $f)))
(func (export "unreachable") (result i32)
(block $l (result (ref $t))
(br_on_non_null $l (unreachable))
(return (i32.const -1))
)
(call_ref $t)
)
)
(assert_trap (invoke "unreachable") "unreachable")
(assert_return (invoke "nonnullable-f") (i32.const 7))
(assert_return (invoke "nullable-null") (i32.const -1))
(assert_return (invoke "nullable-f") (i32.const 7))
(assert_return (invoke "nullable2-null") (i32.const -2))
(assert_return (invoke "nullable2-f") (i32.const 7))
(module
(type $t (func))
(func (param $r (ref null $t)) (drop (block (result (ref $t)) (br_on_non_null 0 (local.get $r)) (unreachable))))
(func (param $r (ref null func)) (drop (block (result (ref func)) (br_on_non_null 0 (local.get $r)) (unreachable))))
(func (param $r (ref null extern)) (drop (block (result (ref extern)) (br_on_non_null 0 (local.get $r)) (unreachable))))
)
(module
(type $t (func (param i32) (result i32)))
(elem func $f)
(func $f (param i32) (result i32) (i32.mul (local.get 0) (local.get 0)))
(func $a (param $n i32) (param $r (ref null $t)) (result i32)
(call_ref $t
(block $l (result i32 (ref $t))
(return (br_on_non_null $l (local.get $n) (local.get $r)))
)
)
)
(func (export "args-null") (param $n i32) (result i32)
(call $a (local.get $n) (ref.null $t))
)
(func (export "args-f") (param $n i32) (result i32)
(call $a (local.get $n) (ref.func $f))
)
)
(assert_return (invoke "args-null" (i32.const 3)) (i32.const 3))
(assert_return (invoke "args-f" (i32.const 3)) (i32.const 9))
;; https://github.com/WebAssembly/gc/issues/516
(assert_invalid
(module
(type $t (func))
(func $f (param (ref null $t)) (result funcref) (local.get 0))
(func (param funcref) (result funcref funcref)
(ref.null $t)
(local.get 0)
(br_on_non_null 0) ;; only leaves a funcref on the stack
(call $f)
(local.get 0)
)
)
"type mismatch"
)