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 Ergebnis-Wertetypen zu. Beide Listen können leer sein.
Funktionstypen erscheinen an drei Stellen:
- Funktionsdeklarationen: Jede
funchat einen Typ. Sie können entwederparam- undresult-Klauseln einfügen oder auf einen benannten Typ mit(type $name)verweisen. Wenn beide vorhanden sind, müssen sie übereinstimmen. Das Inlinieren eines Funktionstyps in einer Deklaration ist gleichbedeutend mit dem Schreiben eines separaten Funktionstyps und dem Referenzieren desselben. - Indirekte Aufrufe:
call_indirectnimmt einen Funktionstyp und leitet durch einetablevonfuncref-Werten um. Die Engine prüft zur Laufzeit, ob der typisierte Index des aufgerufenen Funktions entspricht, und löst andernfalls eine Ausnahme aus. - 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 Ergebnis-Typsequenzen elementweise übereinstimmen. Die Identität des Typindexes oder des Moduls, aus dem er stammt, spielt keine Rolle. Ein call_indirect wird daher bei einem Aufruf erfolgreich sein, wenn der Typ des Aufgerufenen 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 einzelnen $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)))
Der Aufruf von dispatch(0, 3, 4) ruft $add auf und gibt 7 zurück; der Aufruf 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 zeigt, löst eine Ausnahme aus.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # composite-types%E2%91%A2> |