func: Wasm-Typdefinition
Die func-Typdefinition deklariert eine Funktionssignatur: eine Liste von Parametertypen und eine Liste von Ergebnistypen.
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))
Beschreibung
Ein Funktionstyp ordnet eine Sequenz von Parameter-Wertetypen einer Sequenz von Ergebniswertetypen zu. Beide Listen können leer sein.
Funktionstypen erscheinen an drei Stellen:
- Funktionsdeklarationen: Jede
funchat einen Typ. Sie können entwederparam- undresult-Klauseln einbinden oder einen benannten Typ mit(type $name)referenzieren. Wenn beides vorhanden ist, müssen sie übereinstimmen. Das Einbinden eines Funktionstyps in einer Deklaration ist gleichbedeutend mit dem Schreiben eines separaten Funktionstyps und dessen Referenzierung. - Indirekte Aufrufe:
call_indirectnimmt einen Funktionstyp und leitet durch einetableausfuncref-Werten weiter. Die Engine überprüft zur Laufzeit, ob der Typ der indizierten Funktion mit dem deklarierten Typ übereinstimmt, andernfalls wird abgefangen. - Importe: Funktionsimporte deklarieren einen Typ, der für eine Funktion bereitgestellt werden muss.
Funktionstypen verwenden strukturelle Gleichheit: Zwei Funktionstypen sind identisch, wenn und nur wenn ihre Parameter- und Ergebnistypsequenzen elementweise übereinstimmen. Die Identität des Typindex oder des Moduls, aus dem es stammt, spielt keine Rolle. Ein call_indirect wird daher erfolgreich sein bei einem Callee, dessen Typ unabhängig in einem anderen Modul deklariert wurde, solange die Parameter- und Ergebnissequenzen dieselben sind.
Beispiele
>Teilen eines Funktionstyps zwischen zwei Funktionen und einem Dispatcher
Das folgende Modul deklariert einen einzigen $bin_op Typ und verwendet ihn für zwei Funktionen und eine call_indirect-Stelle:
(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)))
Das Aufrufen von dispatch(0, 3, 4) ruft $add auf und gibt 7 zurück; das Aufrufen von dispatch(1, 3, 4) ruft $mul auf und gibt 12 zurück. Das Übergeben eines Indexes, der auf eine Funktion mit einer anderen Signatur verweist, wird abgefangen.
Spezifikationen
| Spezifikation |
|---|
| Unknown specification> # syntax-functype> |