1;;! gc = true
2
3(module
4  (type $ty (struct (field (mut f32))
5                    (field (mut i8))
6                    (field (mut anyref))))
7
8  (global $g (mut (ref null $ty)) (ref.null $ty))
9
10  ;; Constructors.
11
12  (func $new (param f32 i32 anyref) (result (ref $ty))
13    (struct.new $ty (local.get 0) (local.get 1) (local.get 2))
14  )
15  (func (export "new") (param f32 i32 anyref)
16    (global.set $g (call $new (local.get 0) (local.get 1) (local.get 2)))
17  )
18
19  (func $new-default (result (ref $ty))
20    (struct.new_default $ty)
21  )
22  (func (export "new-default")
23    (global.set $g (call $new-default))
24  )
25
26  ;; Getters.
27
28  (func $get-f32 (param (ref null $ty)) (result f32)
29    (struct.get $ty 0 (local.get 0))
30  )
31  (func (export "get-f32") (result f32)
32    (call $get-f32 (global.get $g))
33  )
34
35  (func $get-s-i8 (param (ref null $ty)) (result i32)
36    (struct.get_s $ty 1 (local.get 0))
37  )
38  (func (export "get-s-i8") (result i32)
39    (call $get-s-i8 (global.get $g))
40  )
41
42  (func $get-u-i8 (param (ref null $ty)) (result i32)
43    (struct.get_u $ty 1 (local.get 0))
44  )
45  (func (export "get-u-i8") (result i32)
46    (call $get-u-i8 (global.get $g))
47  )
48
49  (func $get-anyref (param (ref null $ty)) (result anyref)
50    (struct.get $ty 2 (local.get 0))
51  )
52  (func (export "get-anyref") (result anyref)
53    (call $get-anyref (global.get $g))
54  )
55
56  ;; Setters.
57
58  (func $set-f32 (param (ref null $ty) f32)
59    (struct.set $ty 0 (local.get 0) (local.get 1))
60  )
61  (func (export "set-f32") (param f32)
62    (call $set-f32 (global.get $g) (local.get 0))
63  )
64
65  (func $set-i8 (param (ref null $ty) i32)
66    (struct.set $ty 1 (local.get 0) (local.get 1))
67  )
68  (func (export "set-i8") (param i32)
69    (call $set-i8 (global.get $g) (local.get 0))
70  )
71
72  (func $set-anyref (param (ref null $ty) anyref)
73    (struct.set $ty 2 (local.get 0) (local.get 1))
74  )
75  (func (export "set-anyref") (param anyref)
76    (call $set-anyref (global.get $g) (local.get 0))
77  )
78
79  (func (export "set-anyref-non-null")
80    (call $set-anyref (global.get $g) (struct.new_default $ty))
81  )
82)
83
84(assert_return (invoke "new" (f32.const 1) (i32.const -1) (ref.null any)))
85(assert_return (invoke "get-f32") (f32.const 1))
86(assert_return (invoke "get-s-i8") (i32.const -1))
87(assert_return (invoke "get-u-i8") (i32.const 255))
88(assert_return (invoke "get-anyref") (ref.null any))
89
90(assert_return (invoke "new-default"))
91(assert_return (invoke "get-f32") (f32.const 0))
92(assert_return (invoke "get-s-i8") (i32.const 0))
93(assert_return (invoke "get-u-i8") (i32.const 0))
94(assert_return (invoke "get-anyref") (ref.null any))
95
96(assert_return (invoke "set-f32" (f32.const 2)))
97(assert_return (invoke "get-f32") (f32.const 2))
98
99(assert_return (invoke "set-i8" (i32.const -1)))
100(assert_return (invoke "get-s-i8") (i32.const -1))
101(assert_return (invoke "get-u-i8") (i32.const 255))
102
103(assert_return (invoke "set-anyref-non-null"))
104(assert_return (invoke "get-anyref") (ref.struct))
105(assert_return (invoke "set-anyref" (ref.null any)))
106(assert_return (invoke "get-anyref") (ref.null any))
107
108;; Null dereference
109
110(module
111  (type $t (struct (field (mut i32) (mut i16))))
112
113  (func (export "struct.get-null") (param (ref null $t))
114    (drop (struct.get $t 0 (local.get 0)))
115  )
116
117  (func (export "struct.get_s-null") (param (ref null $t))
118    (drop (struct.get_s $t 1 (local.get 0)))
119  )
120
121  (func (export "struct.get_u-null") (param (ref null $t))
122    (drop (struct.get_u $t 1 (local.get 0)))
123  )
124
125  (func (export "struct.set-null") (param (ref null $t))
126    (struct.set $t 0 (local.get 0) (i32.const 0))
127  )
128)
129
130(assert_trap (invoke "struct.get-null" (ref.null none)) "null structure reference")
131(assert_trap (invoke "struct.get_s-null" (ref.null none)) "null structure reference")
132(assert_trap (invoke "struct.get_u-null" (ref.null none)) "null structure reference")
133(assert_trap (invoke "struct.set-null" (ref.null none)) "null structure reference")
134