← 返回首页
func: Wasm-Typdefinition - WebAssembly | MDN

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

func: Wasm-Typdefinition

Die func-Typdefinition deklariert eine Funktionssignatur: eine Liste von Parametertypen und eine Liste von Ergebnistypen.

In diesem Artikel

Syntax

wat
;; 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 func hat einen Typ. Sie können entweder param- und result-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_indirect nimmt einen Funktionstyp und leitet durch eine table aus funcref-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:

wat
(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

Siehe auch