wasmtime-cli 42.0.2

Command-line interface for Wasmtime
Documentation
;; RUN: wast --assert default --snapshot tests/snapshots %

(component
  (component
    (import "i" (instance $i
      (export "f1" (func))
      (export "f2" (func (param "p1" string)))
    ))
    (export "run" (func $i "f1"))
  )
)

(component
  (component
    (import "i" (component $c
      (export "f1" (func))
      (export "f2" (func (param "p1" string)))
    ))
    (instance $i (instantiate $c))
    (export "run" (func $i "f1"))
  )
)

(component definition
  (import "i" (core module $m
    (export "f1" (func $f1))
    (export "f2" (func $f2 (param i32)))
  ))
  (core instance $i (instantiate $m))

  (core module $m2 (import "" "" (func)))

  (core instance (instantiate $m2 (with "" (instance (export "" (func $i "f1"))))))
)

(component definition
  (import "a" (core module $libc
    (export "memory" (memory 1))
    (export "table" (table 0 funcref))
    (export "func" (func))
    (export "global" (global i32))
    (export "global mut" (global (mut i64)))
  ))
  (core instance $libc (instantiate $libc))
  (alias core export $libc "memory" (core memory $mem))
  (alias core export $libc "table" (core table $tbl))
  (alias core export $libc "func" (core func $func))
  (alias core export $libc "global" (core global $global))
  (alias core export $libc "global mut" (core global $global_mut))

  (import "x" (core module $needs_libc
    (import "" "memory" (memory 1))
    (import "" "table" (table 0 funcref))
    (import "" "func" (func))
    (import "" "global" (global i32))
    (import "" "global mut" (global (mut i64)))
  ))

  (core instance (instantiate $needs_libc (with "" (instance
    (export "memory" (memory $mem))
    (export "table" (table $tbl))
    (export "func" (func $func))
    (export "global" (global $global))
    (export "global mut" (global $global_mut))
  ))))
)

(component
  (component
    (import "a" (instance $i
      (export "a" (func))
      (export "b" (core module))
      (export "c" (instance))
    ))
    (export "b" (func $i "a"))
    (export "c" (core module $i "b"))
    (export "d" (instance $i "c"))
  )
)


(component definition
  (import "a" (core module $libc
    (export "memory" (memory 1))
    (export "table" (table 0 funcref))
    (export "func" (func))
    (export "global" (global i32))
    (export "global mut" (global (mut i64)))
  ))

  (import "b" (core module $needs_libc
    (import "" "memory" (memory 1))
    (import "" "table" (table 0 funcref))
    (import "" "func" (func))
    (import "" "global" (global i32))
    (import "" "global mut" (global (mut i64)))
  ))

  (core instance $libc (instantiate $libc))
  (core instance (instantiate $needs_libc (with "" (instance
    (export "memory" (memory $libc "memory"))
    (export "table" (table $libc "table"))
    (export "func" (func $libc "func"))
    (export "global" (global $libc "global"))
    (export "global mut" (global $libc "global mut"))
  ))))
)

(assert_invalid
  (component
    (import "a" (instance (export "a" (func))))
    (export "a" (core module 0 "a"))
  )
  "export `a` for instance 0 is not a module")

(assert_invalid
  (component
    (component
      (component (export "a"))
    )
    (instance (instantiate 0))
    (export "a" (core module 0 "a"))
  )
  "export `a` for instance 0 is not a module")

(assert_invalid
  (component
    (import "a" (core module))
    (core instance (instantiate 0))
    (alias core export 0 "a" (core func))
  )
  "core instance 0 has no export named `a`")

(assert_invalid
  (component
    (core module)
    (core instance (instantiate 0))
    (alias core export 0 "a" (core func))
  )
  "core instance 0 has no export named `a`")

(assert_invalid
  (component
    (import "a" (component))
    (instance (instantiate 0))
    (alias export 0 "a" (func))
  )
  "instance 0 has no export named `a`")

(assert_invalid
  (component
    (import "a" (core module $a (export "" (func))))
    (import "b" (core module $b (import "" "" (func (param i32)))))

    (core instance $a (instantiate $a))
    (core instance $b (instantiate $b (with "" (instance $a))))
  )
  "type mismatch")

;; aliasing various items works

(component $PARENT
  (type $t (func (result string)))
  (component
    (import "a" (func (type $t)))
  )
  (component
    (alias outer $PARENT $t (type $my_type))
    (alias outer 0 $my_type (type $my_type_again))
    (import "a" (func (type $my_type_again)))
  )
)

(component
  (type $a (func (result string)))
  (component
    (type $b (func (result u32)))
    (component
      (type $c (func (result s32)))

      (component
        (import "a" (func $a (type $a)))
        (import "b" (func $b (type $b)))
        (import "c" (func $c (type $c)))

        (import "d" (component $C
          (import "a" (func (result string)))
          (import "b" (func (result u32)))
          (import "c" (func (result s32)))
        ))

        (instance (instantiate $C
          (with "a" (func $a))
          (with "b" (func $b))
          (with "c" (func $c))
        ))
      )
    )
  )
)

;; multiple projections in alias sugar
(component
  (component $a
    (import "a" (instance $a
      (export "a" (instance
        (export "a" (instance
          (export "a" (instance
            (export "a" (func))
          ))
        ))
      ))
    ))

    (import "b" (component $b (import "a" (func))))

    (instance (instantiate $b
      (with "a" (func $a "a" "a" "a" "a"))
    ))
  )
)

;; alias some constructs
(component
  (component
    (import "a" (instance $foo (export "v" (component))))
    (export "v" (component $foo "v"))
  )
)

(component definition
  (import "a" (instance $foo (export "v" (core module))))
  (export "v" (core module $foo "v"))
)

(component $C
  (core type $t (func))
  (component $C2
    (alias outer $C $t (core type $t2))
    (component
      (alias outer $C $t (core type))
      (alias outer $C2 $t2 (core type))
    )
  )
)

(component $C
  (core module $m)
  (alias outer $C $m (core module $target))
  (export "v" (core module $target))
)

(component
  (component $C
    (component $m)
    (alias outer $C $m (component $target))
    (export "v" (component $target))
  )
)

(assert_invalid
  (component (alias outer 100 0 (core type)))
  "invalid outer alias count of 100")

(assert_invalid
  (component (alias outer 0 0 (core type)))
  "index out of bounds")

(assert_invalid
  (component (alias outer 100 0 (core module)))
  "invalid outer alias count of 100")

(assert_invalid
  (component (alias outer 0 0 (core module)))
  "index out of bounds")

(assert_invalid
  (component (alias outer 100 0 (component)))
  "invalid outer alias count of 100")

(assert_invalid
  (component (alias outer 0 0 (component)))
  "index out of bounds")

(component definition
  (import "a" (instance $i
     (export "x" (core module))
  ))
  ;; inline alias injection sugar works for module references
  (core instance (instantiate (module $i "x")))
)

(component
  (component
    (import "a" (instance $i
       (export "x" (component))
    ))
    ;; inline alias injection sugar works for component references
    (instance (instantiate (component $i "x")))
  )
)