4 (func (export "call") (result i32) (call $g))
5 (func $g (result i32) (i32.const 2))
10 (func $f (import "Mf" "call") (result i32))
11 (export "Mf.call" (func $f))
12 (func (export "call Mf.call") (result i32) (call $f))
13 (func (export "call") (result i32) (call $g))
14 (func $g (result i32) (i32.const 3))
17 (assert_return (invoke $Mf "call") (i32.const 2))
18 (assert_return (invoke $Nf "Mf.call") (i32.const 2))
19 (assert_return (invoke $Nf "call") (i32.const 3))
20 (assert_return (invoke $Nf "call Mf.call") (i32.const 2))
23 (import "spectest" "print_i32" (func $f (param i32)))
24 (export "print" (func $f))
26 (register "reexport_f")
28 (module (import "reexport_f" "print" (func (param i64))))
29 "incompatible import type"
32 (module (import "reexport_f" "print" (func (param i32) (result i32))))
33 "incompatible import type"
40 (global $glob (export "glob") i32 (i32.const 42))
41 (func (export "get") (result i32) (global.get $glob))
43 ;; export mutable globals
44 (global $mut_glob (export "mut_glob") (mut i32) (i32.const 142))
45 (func (export "get_mut") (result i32) (global.get $mut_glob))
46 (func (export "set_mut") (param i32) (global.set $mut_glob (local.get 0)))
51 (global $x (import "Mg" "glob") i32)
52 (global $mut_glob (import "Mg" "mut_glob") (mut i32))
53 (func $f (import "Mg" "get") (result i32))
54 (func $get_mut (import "Mg" "get_mut") (result i32))
55 (func $set_mut (import "Mg" "set_mut") (param i32))
57 (export "Mg.glob" (global $x))
58 (export "Mg.get" (func $f))
59 (global $glob (export "glob") i32 (i32.const 43))
60 (func (export "get") (result i32) (global.get $glob))
62 (export "Mg.mut_glob" (global $mut_glob))
63 (export "Mg.get_mut" (func $get_mut))
64 (export "Mg.set_mut" (func $set_mut))
67 (assert_return (get $Mg "glob") (i32.const 42))
68 (assert_return (get $Ng "Mg.glob") (i32.const 42))
69 (assert_return (get $Ng "glob") (i32.const 43))
70 (assert_return (invoke $Mg "get") (i32.const 42))
71 (assert_return (invoke $Ng "Mg.get") (i32.const 42))
72 (assert_return (invoke $Ng "get") (i32.const 43))
74 (assert_return (get $Mg "mut_glob") (i32.const 142))
75 (assert_return (get $Ng "Mg.mut_glob") (i32.const 142))
76 (assert_return (invoke $Mg "get_mut") (i32.const 142))
77 (assert_return (invoke $Ng "Mg.get_mut") (i32.const 142))
79 (assert_return (invoke $Mg "set_mut" (i32.const 241)))
80 (assert_return (get $Mg "mut_glob") (i32.const 241))
81 (assert_return (get $Ng "Mg.mut_glob") (i32.const 241))
82 (assert_return (invoke $Mg "get_mut") (i32.const 241))
83 (assert_return (invoke $Ng "Mg.get_mut") (i32.const 241))
87 (module (import "Mg" "mut_glob" (global i32)))
88 "incompatible import type"
91 (module (import "Mg" "glob" (global (mut i32))))
92 "incompatible import type"
98 (type (func (result i32)))
101 (table (export "tab") 10 funcref)
102 (elem (i32.const 2) $g $g $g $g)
103 (func $g (result i32) (i32.const 4))
104 (func (export "h") (result i32) (i32.const -4))
106 (func (export "call") (param i32) (result i32)
107 (call_indirect (type 0) (local.get 0))
114 (type (func (result i32)))
116 (func $f (import "Mt" "call") (param i32) (result i32))
117 (func $h (import "Mt" "h") (result i32))
119 (table funcref (elem $g $g $g $h $f))
120 (func $g (result i32) (i32.const 5))
122 (export "Mt.call" (func $f))
123 (func (export "call Mt.call") (param i32) (result i32)
124 (call $f (local.get 0))
126 (func (export "call") (param i32) (result i32)
127 (call_indirect (type 1) (local.get 0))
131 (assert_return (invoke $Mt "call" (i32.const 2)) (i32.const 4))
132 (assert_return (invoke $Nt "Mt.call" (i32.const 2)) (i32.const 4))
133 (assert_return (invoke $Nt "call" (i32.const 2)) (i32.const 5))
134 (assert_return (invoke $Nt "call Mt.call" (i32.const 2)) (i32.const 4))
136 (assert_trap (invoke $Mt "call" (i32.const 1)) "uninitialized")
137 (assert_trap (invoke $Nt "Mt.call" (i32.const 1)) "uninitialized")
138 (assert_return (invoke $Nt "call" (i32.const 1)) (i32.const 5))
139 (assert_trap (invoke $Nt "call Mt.call" (i32.const 1)) "uninitialized")
141 (assert_trap (invoke $Mt "call" (i32.const 0)) "uninitialized")
142 (assert_trap (invoke $Nt "Mt.call" (i32.const 0)) "uninitialized")
143 (assert_return (invoke $Nt "call" (i32.const 0)) (i32.const 5))
144 (assert_trap (invoke $Nt "call Mt.call" (i32.const 0)) "uninitialized")
146 (assert_trap (invoke $Mt "call" (i32.const 20)) "undefined")
147 (assert_trap (invoke $Nt "Mt.call" (i32.const 20)) "undefined")
148 (assert_trap (invoke $Nt "call" (i32.const 7)) "undefined")
149 (assert_trap (invoke $Nt "call Mt.call" (i32.const 20)) "undefined")
151 (assert_return (invoke $Nt "call" (i32.const 3)) (i32.const -4))
152 (assert_trap (invoke $Nt "call" (i32.const 4)) "indirect call")
155 (type (func (result i32)))
157 (func $h (import "Mt" "h") (result i32))
158 (table (import "Mt" "tab") 5 funcref)
159 (elem (i32.const 1) $i $h)
160 (func $i (result i32) (i32.const 6))
162 (func (export "call") (param i32) (result i32)
163 (call_indirect (type 0) (local.get 0))
167 (assert_return (invoke $Mt "call" (i32.const 3)) (i32.const 4))
168 (assert_return (invoke $Nt "Mt.call" (i32.const 3)) (i32.const 4))
169 (assert_return (invoke $Nt "call Mt.call" (i32.const 3)) (i32.const 4))
170 (assert_return (invoke $Ot "call" (i32.const 3)) (i32.const 4))
172 (assert_return (invoke $Mt "call" (i32.const 2)) (i32.const -4))
173 (assert_return (invoke $Nt "Mt.call" (i32.const 2)) (i32.const -4))
174 (assert_return (invoke $Nt "call" (i32.const 2)) (i32.const 5))
175 (assert_return (invoke $Nt "call Mt.call" (i32.const 2)) (i32.const -4))
176 (assert_return (invoke $Ot "call" (i32.const 2)) (i32.const -4))
178 (assert_return (invoke $Mt "call" (i32.const 1)) (i32.const 6))
179 (assert_return (invoke $Nt "Mt.call" (i32.const 1)) (i32.const 6))
180 (assert_return (invoke $Nt "call" (i32.const 1)) (i32.const 5))
181 (assert_return (invoke $Nt "call Mt.call" (i32.const 1)) (i32.const 6))
182 (assert_return (invoke $Ot "call" (i32.const 1)) (i32.const 6))
184 (assert_trap (invoke $Mt "call" (i32.const 0)) "uninitialized")
185 (assert_trap (invoke $Nt "Mt.call" (i32.const 0)) "uninitialized")
186 (assert_return (invoke $Nt "call" (i32.const 0)) (i32.const 5))
187 (assert_trap (invoke $Nt "call Mt.call" (i32.const 0)) "uninitialized")
188 (assert_trap (invoke $Ot "call" (i32.const 0)) "uninitialized")
190 (assert_trap (invoke $Ot "call" (i32.const 20)) "undefined")
193 (table (import "Mt" "tab") 0 funcref)
194 (elem (i32.const 9) $f)
198 (module $G1 (global (export "g") i32 (i32.const 5)))
201 (global (import "G1" "g") i32)
202 (global (export "g") i32 (global.get 0))
204 (assert_return (get $G2 "g") (i32.const 5))
208 (table (import "Mt" "tab") 0 funcref)
209 (elem (i32.const 10) $f)
217 (table (import "Mt" "tab") 10 funcref)
218 (memory (import "Mt" "mem") 1) ;; does not exist
219 (func $f (result i32) (i32.const 0))
220 (elem (i32.const 7) $f)
221 (elem (i32.const 9) $f)
225 (assert_trap (invoke $Mt "call" (i32.const 7)) "uninitialized")
227 ;; Unlike in the v1 spec, the elements stored before an out-of-bounds access
228 ;; persist after the instantiation failure.
231 (table (import "Mt" "tab") 10 funcref)
232 (func $f (result i32) (i32.const 0))
233 (elem (i32.const 7) $f)
234 (elem (i32.const 8) $f $f $f $f $f) ;; (partially) out of bounds
238 (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
239 (assert_trap (invoke $Mt "call" (i32.const 8)) "uninitialized")
243 (table (import "Mt" "tab") 10 funcref)
244 (func $f (result i32) (i32.const 0))
245 (elem (i32.const 7) $f)
247 (data (i32.const 0x10000) "d") ;; out of bounds
251 (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
257 (memory (export "mem") 1 5)
258 (data (i32.const 10) "\00\01\02\03\04\05\06\07\08\09")
260 (func (export "load") (param $a i32) (result i32)
261 (i32.load8_u (local.get 0))
267 (func $loadM (import "Mm" "load") (param i32) (result i32))
270 (data (i32.const 10) "\f0\f1\f2\f3\f4\f5")
272 (export "Mm.load" (func $loadM))
273 (func (export "load") (param $a i32) (result i32)
274 (i32.load8_u (local.get 0))
278 (assert_return (invoke $Mm "load" (i32.const 12)) (i32.const 2))
279 (assert_return (invoke $Nm "Mm.load" (i32.const 12)) (i32.const 2))
280 (assert_return (invoke $Nm "load" (i32.const 12)) (i32.const 0xf2))
283 (memory (import "Mm" "mem") 1)
284 (data (i32.const 5) "\a0\a1\a2\a3\a4\a5\a6\a7")
286 (func (export "load") (param $a i32) (result i32)
287 (i32.load8_u (local.get 0))
291 (assert_return (invoke $Mm "load" (i32.const 12)) (i32.const 0xa7))
292 (assert_return (invoke $Nm "Mm.load" (i32.const 12)) (i32.const 0xa7))
293 (assert_return (invoke $Nm "load" (i32.const 12)) (i32.const 0xf2))
294 (assert_return (invoke $Om "load" (i32.const 12)) (i32.const 0xa7))
297 (memory (import "Mm" "mem") 0)
298 (data (i32.const 0xffff) "a")
303 (memory (import "Mm" "mem") 0)
304 (data (i32.const 0x10000) "a")
310 (memory (import "Mm" "mem") 1 8)
312 (func (export "grow") (param $a i32) (result i32)
313 (memory.grow (local.get 0))
317 (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 1))
318 (assert_return (invoke $Pm "grow" (i32.const 2)) (i32.const 1))
319 (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 3))
320 (assert_return (invoke $Pm "grow" (i32.const 1)) (i32.const 3))
321 (assert_return (invoke $Pm "grow" (i32.const 1)) (i32.const 4))
322 (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
323 (assert_return (invoke $Pm "grow" (i32.const 1)) (i32.const -1))
324 (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
328 (func $host (import "spectest" "print"))
329 (memory (import "Mm" "mem") 1)
330 (table (import "Mm" "tab") 0 funcref) ;; does not exist
331 (data (i32.const 0) "abc")
335 (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 0))
337 ;; Unlike in v1 spec, bytes written before an out-of-bounds access persist
338 ;; after the instantiation failure.
341 ;; Note: the memory is 5 pages large by the time we get here.
342 (memory (import "Mm" "mem") 1)
343 (data (i32.const 0) "abc")
344 (data (i32.const 327670) "zzzzzzzzzzzzzzzzzz") ;; (partially) out of bounds
348 (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
349 (assert_return (invoke $Mm "load" (i32.const 327670)) (i32.const 0))
353 (memory (import "Mm" "mem") 1)
354 (data (i32.const 0) "abc")
357 (elem (i32.const 0) 0) ;; out of bounds
361 (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
363 ;; Store is modified if the start function traps.
365 (type $t (func (result i32)))
366 (memory (export "memory") 1)
367 (table (export "table") 1 funcref)
368 (func (export "get memory[0]") (type $t)
369 (i32.load8_u (i32.const 0))
371 (func (export "get table[0]") (type $t)
372 (call_indirect (type $t) (i32.const 0))
379 (import "Ms" "memory" (memory 1))
380 (import "Ms" "table" (table 1 funcref))
381 (data (i32.const 0) "hello")
382 (elem (i32.const 0) $f)
383 (func $f (result i32)
394 (assert_return (invoke $Ms "get memory[0]") (i32.const 104)) ;; 'h'
395 (assert_return (invoke $Ms "get table[0]") (i32.const 0xdead))