wasmtime-cli 44.0.1

Command-line interface for Wasmtime
Documentation
;;! component_model_async = true
;;! component_model_error_context = true

;; error-context.new
(component
  (core module $libc (memory (export "memory") 1))
  (core instance $libc (instantiate $libc))
  (core module $m
    (import "" "error-context.new" (func $error-context-new (param i32 i32) (result i32)))
  )
  (core func $error-context-new (canon error-context.new (memory $libc "memory")))
  (core instance $i (instantiate $m (with "" (instance (export "error-context.new" (func $error-context-new))))))
)

;; error-context.debug-message
(component
  (core module $libc
    (func (export "realloc") (param i32 i32 i32 i32) (result i32) unreachable)
    (memory (export "memory") 1)
  )
  (core instance $libc (instantiate $libc))
  (core module $m
    (import "" "error-context.debug-message" (func $error-context-debug-message (param i32 i32)))
  )
  (core func $error-context-debug-message (canon error-context.debug-message (memory $libc "memory") (realloc (func $libc "realloc"))))
  (core instance $i (instantiate $m (with "" (instance (export "error-context.debug-message" (func $error-context-debug-message))))))
)

;; error-context.drop
(component
  (core module $m
    (import "" "error-context.drop" (func $error-context-drop (param i32)))
  )
  (core func $error-context-drop (canon error-context.drop))
  (core instance $i (instantiate $m (with "" (instance (export "error-context.drop" (func $error-context-drop))))))
)

;; Test edge-case behavior of `error-context.debug-message`.
(component definition $A
  (core module $libc
    (memory (export "memory") 1)
    (global $bump (mut i32) (i32.const 100))
    (func (export "realloc") (param i32 i32 i32 i32) (result i32)
      (local $ret i32)
      (if (local.get 0) (then unreachable))
      (if (local.get 1) (then unreachable))
      (if (i32.ne (local.get 2) (i32.const 1)) (then unreachable))
      (local.set $ret (global.get $bump))
      (global.set $bump (i32.add (global.get $bump) (local.get 3)))
      (local.get $ret)
    )
  )
  (core instance $libc (instantiate $libc))

  (core module $Core
    (import "" "mem" (memory 1))
    (import "" "error-context.new" (func $error-context.new (param i32 i32) (result i32)))
    (import "" "error-context.debug-message" (func $error-context.debug-message (param i32 i32)))
    (import "" "error-context.drop" (func $error-context.drop (param i32)))

    (func (export "run") (param $dst i32)
      (local $handle i32)
      (i32.store8 (i32.const 0) (i32.const 0x61)) ;; 'a'
      (local.set $handle (call $error-context.new (i32.const 0) (i32.const 1)))
      (call $error-context.debug-message (local.get $handle) (local.get $dst))
      (call $error-context.drop (local.get $handle))
    )
  )

  (core func $error-context.new (canon error-context.new (memory $libc "memory")))
  (core func $error-context.debug-message (canon error-context.debug-message (memory $libc "memory") (realloc (func $libc "realloc"))))
  (core func $error-context.drop (canon error-context.drop))

  (core instance $core (instantiate $Core (with "" (instance
    (export "mem" (memory $libc "memory"))
    (export "error-context.new" (func $error-context.new))
    (export "error-context.debug-message" (func $error-context.debug-message))
    (export "error-context.drop" (func $error-context.drop))
  ))))

  (func (export "run") (param "p" u32) (canon lift (core func $core "run")))
)

(component instance $A $A)
(assert_return (invoke "run" (u32.const 65528)))
(assert_trap (invoke "run" (u32.const 65532)) "invalid debug message pointer")