You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

451 lines
10 KiB

;; simple nested component
(component
(component)
)
;; simple nested component with a nested module
(component
(component
(core module)
)
)
;; simple instantiation of a nested component
(component
(component $c)
(instance (instantiate $c))
(instance (instantiate $c
(with "x" (component $c))
))
)
;; instantiate a module during a nested component, and also instantiate it
;; as an export of the nested component
(component
(component $c
(core module $m)
(core instance (instantiate $m))
(export "m" (core module $m))
)
(instance $i (instantiate $c))
(core instance $i (instantiate (module $i "m")))
)
;; instantiate an inner exported module with two different modules and
;; verify imports match
(component
(component $c
(core module $m
(import "" "g" (global $g i32))
(import "" "f" (func $f (result i32)))
(func $start
call $f
global.get $g
i32.ne
if unreachable end)
(start $start)
)
(core module $m2
(global (export "g") i32 i32.const 1)
(func (export "f") (result i32) i32.const 1)
)
(core instance $i2 (instantiate $m2))
(core instance (instantiate $m (with "" (instance $i2))))
(export "m" (core module $m))
)
(instance $i (instantiate $c))
(core module $m2
(global (export "g") i32 i32.const 5)
(func (export "f") (result i32) i32.const 5)
)
(core instance $i2 (instantiate $m2))
(core instance (instantiate (module $i "m") (with "" (instance $i2))))
)
;; instantiate an inner component with a module import
(component
(component $c
(import "m" (core module $m
(export "g" (global i32))
))
(core instance $i (instantiate $m))
(core module $verify
(import "" "g" (global $g i32))
(func $start
global.get $g
i32.const 2
i32.ne
if unreachable end
)
(start $start)
)
(core instance (instantiate $verify (with "" (instance $i))))
)
(core module $m
(global (export "g") i32 (i32.const 2))
)
(instance (instantiate $c (with "m" (core module $m))))
)
;; instantiate an inner component with a module import that itself has imports
(component
(component $c
(import "m" (core module $m
(import "" "g" (global i32))
))
(core module $m2
(global (export "g") i32 i32.const 2100)
)
(core instance $m2 (instantiate $m2))
(core instance (instantiate $m (with "" (instance $m2))))
)
(core module $verify
(import "" "g" (global $g i32))
(func $start
global.get $g
i32.const 2100
i32.ne
if unreachable end
)
(start $start)
)
(instance (instantiate $c (with "m" (core module $verify))))
)
;; instantiate an inner component with an export from the outer component
(component $c
(core module (export "m")
(import "" "g1" (global $g1 i32))
(import "" "g2" (global $g2 i32))
(func $start
global.get $g1
i32.const 10000
i32.ne
if unreachable end
global.get $g2
i32.const 20000
i32.ne
if unreachable end
)
(start $start)
)
)
(component
(import "c" (instance $i
(export "m" (core module
(import "" "g2" (global i32))
(import "" "g1" (global i32))
))
))
(component $c
(import "m" (core module $verify
(import "" "g2" (global i32))
(import "" "g1" (global i32))
))
(core module $m
(global (export "g1") i32 i32.const 10000)
(global (export "g2") i32 i32.const 20000)
)
(core instance $m (instantiate $m))
(core instance (instantiate $verify (with "" (instance $m))))
)
(instance (instantiate $c (with "m" (core module $i "m"))))
)
;; instantiate a reexported module
(component
(core module $m
(global (export "g") i32 i32.const 7)
)
(component $c
(import "i" (instance $i
(export "m" (core module
(import "" "" (func))
(export "g" (global i32))
))
))
(export "m" (core module $i "m"))
)
(instance $c (instantiate $c (with "i" (instance (export "m" (core module $m))))))
(core module $dummy
(func (export ""))
)
(core instance $dummy (instantiate $dummy))
(core instance $m (instantiate (module $c "m") (with "" (instance $dummy))))
(core module $verify
(import "" "g" (global i32))
(func $start
global.get 0
i32.const 7
i32.ne
if unreachable end
)
(start $start)
)
(core instance (instantiate $verify (with "" (instance $m))))
)
;; module must be found through a few layers of imports
(component $c
(core module (export "m")
(global (export "g") i32 i32.const 101)
)
)
(component
(import "c" (instance $i
(export "m" (core module
(export "g" (global i32))
))
))
(component $c1
(import "c" (instance $i
(export "m" (core module
(export "g" (global i32))
))
))
(core module $verify
(import "" "g" (global i32))
(func $start
global.get 0
i32.const 101
i32.ne
if unreachable end
)
(start $start)
)
(core instance $m (instantiate (module $i "m")))
(core instance (instantiate $verify (with "" (instance $m))))
)
(instance (instantiate $c1 (with "c" (instance $i))))
)
;; instantiate outer alias to self
(component $C
(core module $m)
(alias outer $C $m (core module $other_m))
(core instance (instantiate $other_m))
)
(component $C
(component $m)
(alias outer $C $m (component $other_m))
(instance (instantiate $other_m))
)
;; closing over an outer alias which is actually an argument to some
;; instantiation
(component
(component $c
(import "c" (core module $c
(export "a" (global i32))
))
(component (export "c2")
(export "m" (core module $c))
)
)
(core module $m1 (global (export "a") i32 i32.const 1))
(core module $m2 (global (export "a") i32 i32.const 2))
(instance $c1 (instantiate $c (with "c" (core module $m1))))
(instance $c2 (instantiate $c (with "c" (core module $m2))))
(instance $m1_container (instantiate (component $c1 "c2")))
(instance $m2_container (instantiate (component $c2 "c2")))
(core instance $core1 (instantiate (module $m1_container "m")))
(core instance $core2 (instantiate (module $m2_container "m")))
(core module $verify
(import "core1" "a" (global $a i32))
(import "core2" "a" (global $b i32))
(func $start
global.get $a
i32.const 1
i32.ne
if unreachable end
global.get $b
i32.const 2
i32.ne
if unreachable end
)
(start $start)
)
(core instance (instantiate $verify
(with "core1" (instance $core1))
(with "core2" (instance $core2))
))
)
;; simple importing of a component
(component
(component $C)
(component $other
(import "x" (component $c))
(instance (instantiate $c))
)
(instance (instantiate $other (with "x" (component $C))))
)
;; deep nesting
(component $C
(core module $m
(global (export "g") i32 (i32.const 1))
)
(component $c
(core module (export "m")
(global (export "g") i32 (i32.const 2))
)
)
(component $c1
(component $c2 (export "a")
(component $c3 (export "a")
(alias outer $C $m (core module $my_module))
(alias outer $C $c (component $my_component))
(export "m" (core module $my_module))
(export "c" (component $my_component))
)
)
)
(instance $i1 (instantiate $c1))
(instance $i2 (instantiate (component $i1 "a")))
(instance $i3 (instantiate (component $i2 "a")))
(core instance $m1 (instantiate (module $i3 "m")))
(instance $c (instantiate (component $i3 "c")))
(core instance $m2 (instantiate (module $c "m")))
(core module $verify
(import "m1" "g" (global $m1 i32))
(import "m2" "g" (global $m2 i32))
(func $start
global.get $m1
i32.const 1
i32.ne
if unreachable end
global.get $m2
i32.const 2
i32.ne
if unreachable end
)
(start $start)
)
(core instance (instantiate $verify (with "m1" (instance $m1)) (with "m2" (instance $m2))))
)
;; Try threading through component instantiation arguments as various forms of
;; instances.
(component
(component $c
(core module $m (export "m"))
(component $c (export "c")
(core module (export "m"))
)
(instance $i (instantiate $c))
(instance $i2
(export "m" (core module $m))
(export "c" (component $c))
(export "i" (instance $i))
)
(export "i" (instance $i))
(export "i2" (instance $i2))
)
(instance $i (instantiate $c))
(component $another
(import "host" (instance
(export "m" (core module))
(export "c" (component))
(export "i" (instance))
))
)
(instance (instantiate $another (with "host" (instance $i))))
(instance (instantiate $another (with "host" (instance $i "i2"))))
(instance $reexport
(export "c" (component $i "c"))
(export "m" (core module $i "m"))
(export "i" (instance $i "i"))
)
(instance (instantiate $another (with "host" (instance $reexport))))
)
;; thread host functions around
(component
(import "host-return-two" (func $import (result u32)))
;; thread the host function through an instance
(component $c
(import "a" (func $f (result u32)))
(export "f" (func $f))
)
(instance $c (instantiate $c (with "a" (func $import))))
(alias export $c "f" (func $import2))
;; thread the host function into a nested component
(component $c2
(import "host" (instance $i (export "return-two" (func (result u32)))))
(core module $m
(import "host" "return-two" (func $host (result i32)))
(func $start
call $host
i32.const 2
i32.ne
if unreachable end
)
(start $start)
)
(core func $return_two
(canon lower (func $i "return-two"))
)
(core instance (instantiate $m
(with "host" (instance
(export "return-two" (func $return_two))
))
))
)
(instance (instantiate $c2
(with "host" (instance
(export "return-two" (func $import2))
))
))
)