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