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