1;;! gc = true
2;;! multi_memory = true
3;;! bulk_memory = true
4
5;; Instantiation is generative
6
7(module definition $M
8  (global (export "glob") (mut i32) (i32.const 0))
9  (table (export "tab") 10 funcref (ref.null func))
10  (memory (export "mem") 1)
11)
12
13(module instance $I1 $M)
14(module instance $I2 $M)
15(register "I1" $I1)
16(register "I2" $I2)
17
18(module
19  (import "I1" "glob" (global $glob1 (mut i32)))
20  (import "I2" "glob" (global $glob2 (mut i32)))
21  (import "I1" "tab" (table $tab1 10 funcref))
22  (import "I2" "tab" (table $tab2 10 funcref))
23  (import "I1" "mem" (memory $mem1 1))
24  (import "I2" "mem" (memory $mem2 1))
25
26  (func $f)
27  (elem declare func $f)
28
29  (func (export "glob") (result i32)
30    (global.set $glob1 (i32.const 1))
31    (global.get $glob2)
32  )
33  (func (export "tab") (result funcref)
34    (table.set $tab1 (i32.const 0) (ref.func $f))
35    (table.get $tab2 (i32.const 0))
36  )
37  (func (export "mem") (result i32)
38    (i32.store $mem1 (i32.const 0) (i32.const 1))
39    (i32.load $mem2 (i32.const 0))
40  )
41)
42
43(assert_return (invoke "glob") (i32.const 0))
44(assert_return (invoke "tab") (ref.null))
45(assert_return (invoke "mem") (i32.const 0))
46
47
48;; Import is not generative
49
50(module
51  (import "I1" "glob" (global $glob1 (mut i32)))
52  (import "I1" "glob" (global $glob2 (mut i32)))
53  (import "I1" "tab" (table $tab1 10 funcref))
54  (import "I1" "tab" (table $tab2 10 funcref))
55  (import "I1" "mem" (memory $mem1 1))
56  (import "I1" "mem" (memory $mem2 1))
57
58  (func $f)
59  (elem declare func $f)
60
61  (func (export "glob") (result i32)
62    (global.set $glob1 (i32.const 1))
63    (global.get $glob2)
64  )
65  (func (export "tab") (result funcref)
66    (table.set $tab1 (i32.const 0) (ref.func $f))
67    (table.get $tab2 (i32.const 0))
68  )
69  (func (export "mem") (result i32)
70    (i32.store $mem1 (i32.const 0) (i32.const 1))
71    (i32.load $mem2 (i32.const 0))
72  )
73)
74
75(assert_return (invoke "glob") (i32.const 1))
76(assert_return (invoke "tab") (ref.func))
77(assert_return (invoke "mem") (i32.const 1))
78
79
80;; Export is not generative
81
82(module definition $N
83  (global $glob (mut i32) (i32.const 0))
84  (table $tab 10 funcref (ref.null func))
85  (memory $mem 1)
86
87  (export "glob1" (global $glob))
88  (export "glob2" (global $glob))
89  (export "tab1" (table $tab))
90  (export "tab2" (table $tab))
91  (export "mem1" (memory $mem))
92  (export "mem2" (memory $mem))
93)
94
95(module instance $I $N)
96(register "I" $I)
97
98(module
99  (import "I" "glob1" (global $glob1 (mut i32)))
100  (import "I" "glob2" (global $glob2 (mut i32)))
101  (import "I" "tab1" (table $tab1 10 funcref))
102  (import "I" "tab2" (table $tab2 10 funcref))
103  (import "I" "mem1" (memory $mem1 1))
104  (import "I" "mem2" (memory $mem2 1))
105
106  (func $f)
107  (elem declare func $f)
108
109  (func (export "glob") (result i32)
110    (global.set $glob1 (i32.const 1))
111    (global.get $glob2)
112  )
113  (func (export "tab") (result funcref)
114    (table.set $tab1 (i32.const 0) (ref.func $f))
115    (table.get $tab2 (i32.const 0))
116  )
117  (func (export "mem") (result i32)
118    (i32.store $mem1 (i32.const 0) (i32.const 1))
119    (i32.load $mem2 (i32.const 0))
120  )
121)
122
123(assert_return (invoke "glob") (i32.const 1))
124(assert_return (invoke "tab") (ref.func))
125(assert_return (invoke "mem") (i32.const 1))
126