func: Wasm type definition
The func type definition declares a function signature: a list of parameter types and a list of result types.
Syntax
;; Declare a named function type
(type $bin_op (func (param i32) (param i32) (result i32)))
;; A function inheriting that signature
(func $add (type $bin_op) (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
;; A call_indirect site using the same type
(call_indirect (type $bin_op))
Description
A function type maps a sequence of parameter value types to a sequence of result value types. Either list may be empty.
Function types appear in three places:
- Function declarations: Every
funchas a type. You can either inlineparamandresultclauses, or reference a named type with(type $name). When both are present, they must agree. Inlining a function type on a declaration is equivalent to writing a separate function type and referencing it. - Indirect calls:
call_indirecttakes a function type and dispatches through atableoffuncrefvalues. The engine checks at runtime that the indexed function's type matches the declared type and traps otherwise. - Imports: Function imports declare a type that must be provided for a function.
Function types use structural equality: two function types are identical if and only if their parameter and result type sequences match element-for-element. The identity of the type index or the module it came from does not matter. A call_indirect will therefore succeed against a callee whose type was declared independently in another module, as long as the parameter and result sequences are the same.
Examples
>Sharing a function type across two functions and a dispatcher
The following module declares a single $bin_op type and uses it for two functions and a call_indirect site:
(module
(type $bin_op (func (param i32) (param i32) (result i32)))
(func $add (type $bin_op) (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(func $mul (type $bin_op) (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.mul)
(table 2 funcref)
(elem (i32.const 0) $add $mul)
(func (export "dispatch") (param $op i32) (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
local.get $op
call_indirect (type $bin_op)))
Calling dispatch(0, 3, 4) invokes $add and returns 7; calling dispatch(1, 3, 4) invokes $mul and returns 12. Passing an index that points to a function with a different signature traps.
Specifications
| Specification |
|---|
| Unknown specification> # syntax-functype> |