1651f4085SAlex Crichton;; simple nested component
2651f4085SAlex Crichton(component
3651f4085SAlex Crichton  (component)
4651f4085SAlex Crichton)
5651f4085SAlex Crichton
6651f4085SAlex Crichton;; simple nested component with a nested module
7651f4085SAlex Crichton(component
8651f4085SAlex Crichton  (component
9651f4085SAlex Crichton    (core module)
10651f4085SAlex Crichton  )
11651f4085SAlex Crichton)
12651f4085SAlex Crichton
13651f4085SAlex Crichton;; simple instantiation of a nested component
14651f4085SAlex Crichton(component
15651f4085SAlex Crichton  (component $c)
16651f4085SAlex Crichton  (instance (instantiate $c))
17651f4085SAlex Crichton  (instance (instantiate $c
18651f4085SAlex Crichton    (with "x" (component $c))
19651f4085SAlex Crichton  ))
20651f4085SAlex Crichton)
21651f4085SAlex Crichton
22651f4085SAlex Crichton;; instantiate a module during a nested component, and also instantiate it
23651f4085SAlex Crichton;; as an export of the nested component
24651f4085SAlex Crichton(component
25651f4085SAlex Crichton  (component $c
26651f4085SAlex Crichton    (core module $m)
27651f4085SAlex Crichton    (core instance (instantiate $m))
28651f4085SAlex Crichton    (export "m" (core module $m))
29651f4085SAlex Crichton  )
30651f4085SAlex Crichton  (instance $i (instantiate $c))
31651f4085SAlex Crichton  (core instance $i (instantiate (module $i "m")))
32651f4085SAlex Crichton)
33651f4085SAlex Crichton
34651f4085SAlex Crichton;; instantiate an inner exported module with two different modules and
35651f4085SAlex Crichton;; verify imports match
36651f4085SAlex Crichton(component
37651f4085SAlex Crichton  (component $c
38651f4085SAlex Crichton    (core module $m
39651f4085SAlex Crichton      (import "" "g" (global $g i32))
40651f4085SAlex Crichton      (import "" "f" (func $f (result i32)))
41651f4085SAlex Crichton
42651f4085SAlex Crichton      (func $start
43651f4085SAlex Crichton        call $f
44651f4085SAlex Crichton        global.get $g
45651f4085SAlex Crichton        i32.ne
46651f4085SAlex Crichton        if unreachable end)
47651f4085SAlex Crichton
48651f4085SAlex Crichton      (start $start)
49651f4085SAlex Crichton    )
50651f4085SAlex Crichton
51651f4085SAlex Crichton    (core module $m2
52651f4085SAlex Crichton      (global (export "g") i32 i32.const 1)
53651f4085SAlex Crichton      (func (export "f") (result i32) i32.const 1)
54651f4085SAlex Crichton    )
55651f4085SAlex Crichton    (core instance $i2 (instantiate $m2))
56651f4085SAlex Crichton    (core instance (instantiate $m (with "" (instance $i2))))
57651f4085SAlex Crichton
58651f4085SAlex Crichton    (export "m" (core module $m))
59651f4085SAlex Crichton  )
60651f4085SAlex Crichton  (instance $i (instantiate $c))
61651f4085SAlex Crichton  (core module $m2
62651f4085SAlex Crichton    (global (export "g") i32 i32.const 5)
63651f4085SAlex Crichton    (func (export "f") (result i32) i32.const 5)
64651f4085SAlex Crichton  )
65651f4085SAlex Crichton  (core instance $i2 (instantiate $m2))
66651f4085SAlex Crichton  (core instance (instantiate (module $i "m") (with "" (instance $i2))))
67651f4085SAlex Crichton)
68651f4085SAlex Crichton
69651f4085SAlex Crichton;; instantiate an inner component with a module import
70651f4085SAlex Crichton(component
71651f4085SAlex Crichton  (component $c
72651f4085SAlex Crichton    (import "m" (core module $m
73651f4085SAlex Crichton      (export "g" (global i32))
74651f4085SAlex Crichton    ))
75651f4085SAlex Crichton
76651f4085SAlex Crichton    (core instance $i (instantiate $m))
77651f4085SAlex Crichton
78651f4085SAlex Crichton    (core module $verify
79651f4085SAlex Crichton      (import "" "g" (global $g i32))
80651f4085SAlex Crichton
81651f4085SAlex Crichton      (func $start
82651f4085SAlex Crichton        global.get $g
83651f4085SAlex Crichton        i32.const 2
84651f4085SAlex Crichton        i32.ne
85651f4085SAlex Crichton        if unreachable end
86651f4085SAlex Crichton      )
87651f4085SAlex Crichton
88651f4085SAlex Crichton      (start $start)
89651f4085SAlex Crichton    )
90651f4085SAlex Crichton    (core instance (instantiate $verify (with "" (instance $i))))
91651f4085SAlex Crichton  )
92651f4085SAlex Crichton
93651f4085SAlex Crichton  (core module $m
94651f4085SAlex Crichton    (global (export "g") i32 (i32.const 2))
95651f4085SAlex Crichton  )
96651f4085SAlex Crichton  (instance (instantiate $c (with "m" (core module $m))))
97651f4085SAlex Crichton)
98651f4085SAlex Crichton
99651f4085SAlex Crichton;; instantiate an inner component with a module import that itself has imports
100651f4085SAlex Crichton(component
101651f4085SAlex Crichton  (component $c
102651f4085SAlex Crichton    (import "m" (core module $m
103651f4085SAlex Crichton      (import "" "g" (global i32))
104651f4085SAlex Crichton    ))
105651f4085SAlex Crichton    (core module $m2
106651f4085SAlex Crichton      (global (export "g") i32 i32.const 2100)
107651f4085SAlex Crichton    )
108651f4085SAlex Crichton    (core instance $m2 (instantiate $m2))
109651f4085SAlex Crichton    (core instance (instantiate $m (with "" (instance $m2))))
110651f4085SAlex Crichton  )
111651f4085SAlex Crichton
112651f4085SAlex Crichton  (core module $verify
113651f4085SAlex Crichton    (import "" "g" (global $g i32))
114651f4085SAlex Crichton
115651f4085SAlex Crichton    (func $start
116651f4085SAlex Crichton      global.get $g
117651f4085SAlex Crichton      i32.const 2100
118651f4085SAlex Crichton      i32.ne
119651f4085SAlex Crichton      if unreachable end
120651f4085SAlex Crichton    )
121651f4085SAlex Crichton
122651f4085SAlex Crichton    (start $start)
123651f4085SAlex Crichton  )
124651f4085SAlex Crichton  (instance (instantiate $c (with "m" (core module $verify))))
125651f4085SAlex Crichton)
126651f4085SAlex Crichton
127651f4085SAlex Crichton;; instantiate an inner component with an export from the outer component
128651f4085SAlex Crichton(component $c
129651f4085SAlex Crichton  (core module (export "m")
130651f4085SAlex Crichton    (import "" "g1" (global $g1 i32))
131651f4085SAlex Crichton    (import "" "g2" (global $g2 i32))
132651f4085SAlex Crichton
133651f4085SAlex Crichton    (func $start
134651f4085SAlex Crichton      global.get $g1
135651f4085SAlex Crichton      i32.const 10000
136651f4085SAlex Crichton      i32.ne
137651f4085SAlex Crichton      if unreachable end
138651f4085SAlex Crichton
139651f4085SAlex Crichton      global.get $g2
140651f4085SAlex Crichton      i32.const 20000
141651f4085SAlex Crichton      i32.ne
142651f4085SAlex Crichton      if unreachable end
143651f4085SAlex Crichton    )
144651f4085SAlex Crichton
145651f4085SAlex Crichton    (start $start)
146651f4085SAlex Crichton  )
147651f4085SAlex Crichton)
148651f4085SAlex Crichton
149651f4085SAlex Crichton(component
150651f4085SAlex Crichton  (import "c" (instance $i
151651f4085SAlex Crichton    (export "m" (core module
152651f4085SAlex Crichton      (import "" "g2" (global i32))
153651f4085SAlex Crichton      (import "" "g1" (global i32))
154651f4085SAlex Crichton    ))
155651f4085SAlex Crichton  ))
156651f4085SAlex Crichton
157651f4085SAlex Crichton  (component $c
158651f4085SAlex Crichton    (import "m" (core module $verify
159651f4085SAlex Crichton      (import "" "g2" (global i32))
160651f4085SAlex Crichton      (import "" "g1" (global i32))
161651f4085SAlex Crichton    ))
162651f4085SAlex Crichton
163651f4085SAlex Crichton    (core module $m
164651f4085SAlex Crichton      (global (export "g1") i32 i32.const 10000)
165651f4085SAlex Crichton      (global (export "g2") i32 i32.const 20000)
166651f4085SAlex Crichton    )
167651f4085SAlex Crichton    (core instance $m (instantiate $m))
168651f4085SAlex Crichton    (core instance (instantiate $verify (with "" (instance $m))))
169651f4085SAlex Crichton  )
170651f4085SAlex Crichton
171651f4085SAlex Crichton  (instance (instantiate $c (with "m" (core module $i "m"))))
172651f4085SAlex Crichton)
173651f4085SAlex Crichton
174651f4085SAlex Crichton;; instantiate a reexported module
175651f4085SAlex Crichton(component
176651f4085SAlex Crichton  (core module $m
177651f4085SAlex Crichton    (global (export "g") i32 i32.const 7)
178651f4085SAlex Crichton  )
179651f4085SAlex Crichton  (component $c
180651f4085SAlex Crichton    (import "i" (instance $i
181651f4085SAlex Crichton      (export "m" (core module
182651f4085SAlex Crichton        (import "" "" (func))
183651f4085SAlex Crichton        (export "g" (global i32))
184651f4085SAlex Crichton      ))
185651f4085SAlex Crichton    ))
186651f4085SAlex Crichton
187651f4085SAlex Crichton    (export "m" (core module $i "m"))
188651f4085SAlex Crichton  )
189651f4085SAlex Crichton
190651f4085SAlex Crichton  (instance $c (instantiate $c (with "i" (instance (export "m" (core module $m))))))
191651f4085SAlex Crichton  (core module $dummy
192651f4085SAlex Crichton    (func (export ""))
193651f4085SAlex Crichton  )
194651f4085SAlex Crichton  (core instance $dummy (instantiate $dummy))
195651f4085SAlex Crichton
196651f4085SAlex Crichton  (core instance $m (instantiate (module $c "m") (with "" (instance $dummy))))
197651f4085SAlex Crichton
198651f4085SAlex Crichton  (core module $verify
199651f4085SAlex Crichton    (import "" "g" (global i32))
200651f4085SAlex Crichton    (func $start
201651f4085SAlex Crichton      global.get 0
202651f4085SAlex Crichton      i32.const 7
203651f4085SAlex Crichton      i32.ne
204651f4085SAlex Crichton      if unreachable end
205651f4085SAlex Crichton    )
206651f4085SAlex Crichton
207651f4085SAlex Crichton    (start $start)
208651f4085SAlex Crichton  )
209651f4085SAlex Crichton  (core instance (instantiate $verify (with "" (instance $m))))
210651f4085SAlex Crichton)
211651f4085SAlex Crichton
212651f4085SAlex Crichton;; module must be found through a few layers of imports
213651f4085SAlex Crichton(component $c
214651f4085SAlex Crichton  (core module (export "m")
215651f4085SAlex Crichton    (global (export "g") i32 i32.const 101)
216651f4085SAlex Crichton  )
217651f4085SAlex Crichton)
218651f4085SAlex Crichton
219651f4085SAlex Crichton(component
220651f4085SAlex Crichton  (import "c" (instance $i
221651f4085SAlex Crichton    (export "m" (core module
222651f4085SAlex Crichton      (export "g" (global i32))
223651f4085SAlex Crichton    ))
224651f4085SAlex Crichton  ))
225651f4085SAlex Crichton  (component $c1
226651f4085SAlex Crichton    (import "c" (instance $i
227651f4085SAlex Crichton      (export "m" (core module
228651f4085SAlex Crichton        (export "g" (global i32))
229651f4085SAlex Crichton      ))
230651f4085SAlex Crichton    ))
231651f4085SAlex Crichton    (core module $verify
232651f4085SAlex Crichton      (import "" "g" (global i32))
233651f4085SAlex Crichton      (func $start
234651f4085SAlex Crichton        global.get 0
235651f4085SAlex Crichton        i32.const 101
236651f4085SAlex Crichton        i32.ne
237651f4085SAlex Crichton        if unreachable end
238651f4085SAlex Crichton      )
239651f4085SAlex Crichton
240651f4085SAlex Crichton      (start $start)
241651f4085SAlex Crichton    )
242651f4085SAlex Crichton    (core instance $m (instantiate (module $i "m")))
243651f4085SAlex Crichton    (core instance (instantiate $verify (with "" (instance $m))))
244651f4085SAlex Crichton  )
245651f4085SAlex Crichton  (instance (instantiate $c1 (with "c" (instance $i))))
246651f4085SAlex Crichton)
247651f4085SAlex Crichton
248651f4085SAlex Crichton;; instantiate outer alias to self
249651f4085SAlex Crichton(component $C
250651f4085SAlex Crichton  (core module $m)
251651f4085SAlex Crichton  (alias outer $C $m (core module $other_m))
252651f4085SAlex Crichton  (core instance (instantiate $other_m))
253651f4085SAlex Crichton)
254651f4085SAlex Crichton
255651f4085SAlex Crichton(component $C
256651f4085SAlex Crichton  (component $m)
257651f4085SAlex Crichton  (alias outer $C $m (component $other_m))
258651f4085SAlex Crichton  (instance (instantiate $other_m))
259651f4085SAlex Crichton)
260651f4085SAlex Crichton
261651f4085SAlex Crichton
262651f4085SAlex Crichton;; closing over an outer alias which is actually an argument to some
263651f4085SAlex Crichton;; instantiation
264651f4085SAlex Crichton(component
265651f4085SAlex Crichton  (component $c
266651f4085SAlex Crichton    (import "c" (core module $c
267651f4085SAlex Crichton      (export "a" (global i32))
268651f4085SAlex Crichton    ))
269651f4085SAlex Crichton
270*3c9fc3ecSAlex Crichton    (component (export "c2")
271651f4085SAlex Crichton      (export "m" (core module $c))
272651f4085SAlex Crichton    )
273651f4085SAlex Crichton  )
274651f4085SAlex Crichton
275651f4085SAlex Crichton  (core module $m1 (global (export "a") i32 i32.const 1))
276651f4085SAlex Crichton  (core module $m2 (global (export "a") i32 i32.const 2))
277651f4085SAlex Crichton
278651f4085SAlex Crichton  (instance $c1 (instantiate $c (with "c" (core module $m1))))
279651f4085SAlex Crichton  (instance $c2 (instantiate $c (with "c" (core module $m2))))
280651f4085SAlex Crichton
281*3c9fc3ecSAlex Crichton  (instance $m1_container (instantiate (component $c1 "c2")))
282*3c9fc3ecSAlex Crichton  (instance $m2_container (instantiate (component $c2 "c2")))
283651f4085SAlex Crichton
284651f4085SAlex Crichton  (core instance $core1 (instantiate (module $m1_container "m")))
285651f4085SAlex Crichton  (core instance $core2 (instantiate (module $m2_container "m")))
286651f4085SAlex Crichton
287651f4085SAlex Crichton  (core module $verify
288651f4085SAlex Crichton    (import "core1" "a" (global $a i32))
289651f4085SAlex Crichton    (import "core2" "a" (global $b i32))
290651f4085SAlex Crichton
291651f4085SAlex Crichton    (func $start
292651f4085SAlex Crichton      global.get $a
293651f4085SAlex Crichton      i32.const 1
294651f4085SAlex Crichton      i32.ne
295651f4085SAlex Crichton      if unreachable end
296651f4085SAlex Crichton
297651f4085SAlex Crichton      global.get $b
298651f4085SAlex Crichton      i32.const 2
299651f4085SAlex Crichton      i32.ne
300651f4085SAlex Crichton      if unreachable end
301651f4085SAlex Crichton    )
302651f4085SAlex Crichton
303651f4085SAlex Crichton    (start $start)
304651f4085SAlex Crichton  )
305651f4085SAlex Crichton  (core instance (instantiate $verify
306651f4085SAlex Crichton    (with "core1" (instance $core1))
307651f4085SAlex Crichton    (with "core2" (instance $core2))
308651f4085SAlex Crichton  ))
309651f4085SAlex Crichton)
310651f4085SAlex Crichton
311651f4085SAlex Crichton;; simple importing of a component
312651f4085SAlex Crichton(component
313651f4085SAlex Crichton  (component $C)
314651f4085SAlex Crichton  (component $other
315651f4085SAlex Crichton    (import "x" (component $c))
316651f4085SAlex Crichton    (instance (instantiate $c))
317651f4085SAlex Crichton  )
318651f4085SAlex Crichton  (instance (instantiate $other (with "x" (component $C))))
319651f4085SAlex Crichton)
320651f4085SAlex Crichton
321651f4085SAlex Crichton;; deep nesting
322651f4085SAlex Crichton(component $C
323651f4085SAlex Crichton  (core module $m
324651f4085SAlex Crichton    (global (export "g") i32 (i32.const 1))
325651f4085SAlex Crichton  )
326651f4085SAlex Crichton  (component $c
327651f4085SAlex Crichton    (core module (export "m")
328651f4085SAlex Crichton      (global (export "g") i32 (i32.const 2))
329651f4085SAlex Crichton    )
330651f4085SAlex Crichton  )
331651f4085SAlex Crichton
332651f4085SAlex Crichton  (component $c1
333b305f251SAlex Crichton    (component $c2 (export "a")
334b305f251SAlex Crichton      (component $c3 (export "a")
335651f4085SAlex Crichton        (alias outer $C $m (core module $my_module))
336651f4085SAlex Crichton        (alias outer $C $c (component $my_component))
337651f4085SAlex Crichton
338651f4085SAlex Crichton        (export "m" (core module $my_module))
339651f4085SAlex Crichton        (export "c" (component $my_component))
340651f4085SAlex Crichton      )
341651f4085SAlex Crichton    )
342651f4085SAlex Crichton  )
343651f4085SAlex Crichton
344651f4085SAlex Crichton  (instance $i1 (instantiate $c1))
345b305f251SAlex Crichton  (instance $i2 (instantiate (component $i1 "a")))
346b305f251SAlex Crichton  (instance $i3 (instantiate (component $i2 "a")))
347651f4085SAlex Crichton
348651f4085SAlex Crichton  (core instance $m1 (instantiate (module $i3 "m")))
349651f4085SAlex Crichton  (instance $c (instantiate (component $i3 "c")))
350651f4085SAlex Crichton  (core instance $m2 (instantiate (module $c "m")))
351651f4085SAlex Crichton
352651f4085SAlex Crichton  (core module $verify
353651f4085SAlex Crichton    (import "m1" "g" (global $m1 i32))
354651f4085SAlex Crichton    (import "m2" "g" (global $m2 i32))
355651f4085SAlex Crichton
356651f4085SAlex Crichton    (func $start
357651f4085SAlex Crichton      global.get $m1
358651f4085SAlex Crichton      i32.const 1
359651f4085SAlex Crichton      i32.ne
360651f4085SAlex Crichton      if unreachable end
361651f4085SAlex Crichton
362651f4085SAlex Crichton      global.get $m2
363651f4085SAlex Crichton      i32.const 2
364651f4085SAlex Crichton      i32.ne
365651f4085SAlex Crichton      if unreachable end
366651f4085SAlex Crichton    )
367651f4085SAlex Crichton    (start $start)
368651f4085SAlex Crichton  )
369651f4085SAlex Crichton  (core instance (instantiate $verify (with "m1" (instance $m1)) (with "m2" (instance $m2))))
370651f4085SAlex Crichton)
371651f4085SAlex Crichton
372651f4085SAlex Crichton;; Try threading through component instantiation arguments as various forms of
373651f4085SAlex Crichton;; instances.
374651f4085SAlex Crichton(component
375651f4085SAlex Crichton  (component $c
376651f4085SAlex Crichton    (core module $m (export "m"))
377651f4085SAlex Crichton    (component $c (export "c")
378651f4085SAlex Crichton      (core module (export "m"))
379651f4085SAlex Crichton    )
380651f4085SAlex Crichton    (instance $i (instantiate $c))
381651f4085SAlex Crichton    (instance $i2
382651f4085SAlex Crichton      (export "m" (core module $m))
383651f4085SAlex Crichton      (export "c" (component $c))
384651f4085SAlex Crichton      (export "i" (instance $i))
385651f4085SAlex Crichton    )
386651f4085SAlex Crichton    (export "i" (instance $i))
387651f4085SAlex Crichton    (export "i2" (instance $i2))
388651f4085SAlex Crichton  )
389651f4085SAlex Crichton  (instance $i (instantiate $c))
390651f4085SAlex Crichton
391651f4085SAlex Crichton  (component $another
392651f4085SAlex Crichton    (import "host" (instance
393651f4085SAlex Crichton      (export "m" (core module))
394651f4085SAlex Crichton      (export "c" (component))
395651f4085SAlex Crichton      (export "i" (instance))
396651f4085SAlex Crichton    ))
397651f4085SAlex Crichton  )
398651f4085SAlex Crichton  (instance (instantiate $another (with "host" (instance $i))))
399651f4085SAlex Crichton  (instance (instantiate $another (with "host" (instance $i "i2"))))
400651f4085SAlex Crichton
401651f4085SAlex Crichton  (instance $reexport
402651f4085SAlex Crichton    (export "c" (component $i "c"))
403651f4085SAlex Crichton    (export "m" (core module $i "m"))
404651f4085SAlex Crichton    (export "i" (instance $i "i"))
405651f4085SAlex Crichton  )
406651f4085SAlex Crichton  (instance (instantiate $another (with "host" (instance $reexport))))
407651f4085SAlex Crichton)
408651f4085SAlex Crichton
409651f4085SAlex Crichton;; thread host functions around
410651f4085SAlex Crichton(component
411651f4085SAlex Crichton  (import "host-return-two" (func $import (result u32)))
412651f4085SAlex Crichton
413651f4085SAlex Crichton  ;; thread the host function through an instance
414651f4085SAlex Crichton  (component $c
415b305f251SAlex Crichton    (import "a" (func $f (result u32)))
416651f4085SAlex Crichton    (export "f" (func $f))
417651f4085SAlex Crichton  )
418b305f251SAlex Crichton  (instance $c (instantiate $c (with "a" (func $import))))
419651f4085SAlex Crichton  (alias export $c "f" (func $import2))
420651f4085SAlex Crichton
421651f4085SAlex Crichton  ;; thread the host function into a nested component
422651f4085SAlex Crichton  (component $c2
423651f4085SAlex Crichton    (import "host" (instance $i (export "return-two" (func (result u32)))))
424651f4085SAlex Crichton
425651f4085SAlex Crichton    (core module $m
426651f4085SAlex Crichton      (import "host" "return-two" (func $host (result i32)))
427651f4085SAlex Crichton      (func $start
428651f4085SAlex Crichton        call $host
429651f4085SAlex Crichton        i32.const 2
430651f4085SAlex Crichton        i32.ne
431651f4085SAlex Crichton        if unreachable end
432651f4085SAlex Crichton      )
433651f4085SAlex Crichton      (start $start)
434651f4085SAlex Crichton    )
435651f4085SAlex Crichton
436651f4085SAlex Crichton    (core func $return_two
437651f4085SAlex Crichton      (canon lower (func $i "return-two"))
438651f4085SAlex Crichton    )
439651f4085SAlex Crichton    (core instance (instantiate $m
440651f4085SAlex Crichton      (with "host" (instance
441651f4085SAlex Crichton        (export "return-two" (func $return_two))
442651f4085SAlex Crichton      ))
443651f4085SAlex Crichton    ))
444651f4085SAlex Crichton  )
445651f4085SAlex Crichton
446651f4085SAlex Crichton  (instance (instantiate $c2
447651f4085SAlex Crichton    (with "host" (instance
448651f4085SAlex Crichton      (export "return-two" (func $import2))
449651f4085SAlex Crichton    ))
450651f4085SAlex Crichton  ))
451651f4085SAlex Crichton)
452