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