Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/tests/misc_testsuite/component-model-async/fused.wast
1691 views
;;! component_model_async = true
;;! component_model_async_stackful = true
;;! reference_types = true
;;! gc_types = true
;;! multi_memory = true

;; async lower -> async lift without callback
(component
  (component $lifter
    (core module $m
      (import "" "task.return" (func $task-return (param i32)))
      (func (export "foo") (param i32) (call $task-return (local.get 0)))
    )
    (core func $task-return (canon task.return (result u32)))
    (core instance $i (instantiate $m
      (with "" (instance (export "task.return" (func $task-return))))
    ))

    (func (export "foo") (param "p1" u32) (result u32)
      (canon lift (core func $i "foo") async)
    )
  )

  (component $lowerer
    (import "a" (func $foo (param "p1" u32) (result u32)))
    (core module $libc (memory (export "memory") 1))
    (core instance $libc (instantiate $libc))
    (core func $foo (canon lower (func $foo) async (memory $libc "memory")))
    (core module $m
      (import "libc" "memory" (memory 1))
      (import "" "foo" (func $foo (param i32 i32) (result i32)))
      (func (export "run")
        block
          (call $foo (i32.const 42) (i32.const 1204))
          (i32.eq (i32.load offset=0 (i32.const 1204)) (i32.const 42))
          br_if 0
          unreachable
        end
      )
    )
    (core instance $i (instantiate $m
      (with "libc" (instance $libc))
      (with "" (instance (export "foo" (func $foo))))
    ))
    (func (export "run") (canon lift (core func $i "run")))
  )

  (instance $lifter (instantiate $lifter))
  (instance $lowerer (instantiate $lowerer (with "a" (func $lifter "foo"))))
  (func (export "run") (alias export $lowerer "run"))
)

(assert_return (invoke "run"))

;; async lower -> async lift with callback
(component
  (component $lifter
    (core module $m
      (import "" "task.return" (func $task-return (param i32)))
      (func (export "callback") (param i32 i32 i32) (result i32) unreachable)
      (func (export "foo") (param i32) (result i32)
        (call $task-return (local.get 0))
        i32.const 0
      )
    )
    (core func $task-return (canon task.return (result u32)))
    (core instance $i (instantiate $m
      (with "" (instance (export "task.return" (func $task-return))))
    ))

    (func (export "foo") (param "p1" u32) (result u32)
      (canon lift (core func $i "foo") async (callback (func $i "callback")))
    )
  )

  (component $lowerer
    (import "a" (func $foo (param "p1" u32) (result u32)))
    (core module $libc (memory (export "memory") 1))
    (core instance $libc (instantiate $libc))
    (core func $foo (canon lower (func $foo) async (memory $libc "memory")))
    (core module $m
      (import "libc" "memory" (memory 1))
      (import "" "foo" (func $foo (param i32 i32) (result i32)))
      (func (export "run")
        block
          (call $foo (i32.const 42) (i32.const 1204))
          (i32.eq (i32.load offset=0 (i32.const 1204)) (i32.const 42))
          br_if 0
          unreachable
        end
      )
    )
    (core instance $i (instantiate $m
      (with "libc" (instance $libc))
      (with "" (instance (export "foo" (func $foo))))
    ))
    (func (export "run") (canon lift (core func $i "run")))
  )

  (instance $lifter (instantiate $lifter))
  (instance $lowerer (instantiate $lowerer (with "a" (func $lifter "foo"))))
  (func (export "run") (alias export $lowerer "run"))
)

(assert_return (invoke "run"))

;; async lower -> sync lift
(component
  (component $lifter
    (core module $m
      (func (export "foo") (param i32) (result i32)
         local.get 0
      )
    )
    (core instance $i (instantiate $m))
    (func (export "foo") (param "p1" u32) (result u32)
      (canon lift (core func $i "foo"))
    )
  )

  (component $lowerer
    (import "a" (func $foo (param "p1" u32) (result u32)))
    (core module $libc (memory (export "memory") 1))
    (core instance $libc (instantiate $libc))
    (core func $foo (canon lower (func $foo) async (memory $libc "memory")))
    (core module $m
      (import "libc" "memory" (memory 1))
      (import "" "foo" (func $foo (param i32 i32) (result i32)))
      (func (export "run")
        block
          (call $foo (i32.const 42) (i32.const 1204))
          (i32.eq (i32.load offset=0 (i32.const 1204)) (i32.const 42))
          br_if 0
          unreachable
        end
      )
    )
    (core instance $i (instantiate $m
      (with "libc" (instance $libc))
      (with "" (instance (export "foo" (func $foo))))
    ))
    (func (export "run") (canon lift (core func $i "run")))
  )

  (instance $lifter (instantiate $lifter))
  (instance $lowerer (instantiate $lowerer (with "a" (func $lifter "foo"))))
  (func (export "run") (alias export $lowerer "run"))
)

(assert_return (invoke "run"))

;; sync lower -> async lift without callback
(component
  (component $lifter
    (core module $m
      (import "" "task.return" (func $task-return (param i32)))
      (func (export "foo") (param i32) (call $task-return (local.get 0)))
    )
    (core func $task-return (canon task.return (result u32)))
    (core instance $i (instantiate $m
      (with "" (instance (export "task.return" (func $task-return))))
    ))

    (func (export "foo") (param "p1" u32) (result u32)
      (canon lift (core func $i "foo") async)
    )
  )

  (component $lowerer
    (import "a" (func $foo (param "p1" u32) (result u32)))
    (core func $foo (canon lower (func $foo)))
    (core module $m
      (import "" "foo" (func $foo (param i32) (result i32)))
      (func (export "run")
        block
          (i32.eq (call $foo (i32.const 42)) (i32.const 42))
          br_if 0
          unreachable
        end
      )
    )
    (core instance $i (instantiate $m
      (with "" (instance (export "foo" (func $foo))))
    ))
    (func (export "run") (canon lift (core func $i "run")))
  )

  (instance $lifter (instantiate $lifter))
  (instance $lowerer (instantiate $lowerer (with "a" (func $lifter "foo"))))
  (func (export "run") (alias export $lowerer "run"))
)

(assert_return (invoke "run"))

;; sync lower -> async lift with callback
(component
  (component $lifter
    (core module $m
      (import "" "task.return" (func $task-return (param i32)))
      (func (export "callback") (param i32 i32 i32) (result i32) unreachable)
      (func (export "foo") (param i32) (result i32)
        (call $task-return (local.get 0))
        i32.const 0
      )
    )
    (core func $task-return (canon task.return (result u32)))
    (core instance $i (instantiate $m
      (with "" (instance (export "task.return" (func $task-return))))
    ))

    (func (export "foo") (param "p1" u32) (result u32)
      (canon lift (core func $i "foo") async (callback (func $i "callback")))
    )
  )

  (component $lowerer
    (import "a" (func $foo (param "p1" u32) (result u32)))
    (core func $foo (canon lower (func $foo)))
    (core module $m
      (import "" "foo" (func $foo (param i32) (result i32)))
      (func (export "run")
        block
          (i32.eq (call $foo (i32.const 42)) (i32.const 42))
          br_if 0
          unreachable
        end
      )
    )
    (core instance $i (instantiate $m
      (with "" (instance (export "foo" (func $foo))))
    ))
    (func (export "run") (canon lift (core func $i "run")))
  )

  (instance $lifter (instantiate $lifter))
  (instance $lowerer (instantiate $lowerer (with "a" (func $lifter "foo"))))
  (func (export "run") (alias export $lowerer "run"))
)

(assert_return (invoke "run"))