init: Wasm table instruction
Die table.init Table-Instruktion kopiert manuell die Referenzen von einer passiven elem-Definition in eine table.
Probieren Sie es aus
(module
(table $return_values 2 funcref)
(func $f1 (result i32)
i32.const 42
)
(func $f2 (result i32)
i32.const 100
)
(elem $funcs funcref (ref.func $f1) (ref.func $f2))
(func (export "init")
i32.const 0 ;; destination table index
i32.const 0 ;; offset into elem segment
i32.const 2 ;; number of elements to copy
table.init $funcs
elem.drop $funcs
)
(func (export "accessTable") (param $index i32) (result i32)
local.get $index
call_indirect (result i32)
)
)
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}")).then((result) => {
result.instance.exports.init();
const value = result.instance.exports.accessTable(1);
console.log(value);
});
Im obigen Beispiel definieren wir eine table, zwei Funktionen und ein elem-Segment namens $funcs, das auf die beiden Funktionen verweist. Anschließend rufen wir table.init auf, um die Referenzen von dem $funcs elem in die table zu kopieren, und verwenden elem.drop, um das elem-Segment zu löschen, wenn es nicht mehr benötigt wird.
Syntax
table.init table_identifier elem_identifier
table.init-
Der Anweisungstyp
table.init. Muss immer zuerst angegeben werden. table_identifierOptional-
Der Bezeichner für die
table, in die Sie die Referenzen einfügen möchten. Dies kann eines der folgenden sein:name-
Ein identifizierender Name, der für die
tablebeim ersten Definieren festgelegt wurde. Dieser muss mit einem$-Symbol beginnen, zum Beispiel$my_table. index-
Die Indexnummer der
table, zum Beispiel0für die erstetableim Wasm-Modul,1für die zweite usw.
Wird kein Wert angegeben, ist der Standardwert für
table_identifier0. elem_identifier-
Der Bezeichner für das
elem, von dem Sie Referenzen kopieren möchten. Dies kann eines der folgenden sein:name-
Ein identifizierender Name, der für das
elembeim ersten Definieren festgelegt wurde. Dieser muss mit einem$-Symbol beginnen, zum Beispiel$my_elem. index-
Die Indexnummer des
elem, zum Beispiel0für das ersteelemim Wasm-Modul,1für das zweite usw.
Typ
[dest_offset source_offset length] -> []
dest_offset-
Ein Integer, der den Tabellenindex angibt, an dem das Kopieren der Elementreferenzen beginnt. Dies ist ein
i32oder eini64, passend zumindex_type, mit dem dietabledefiniert wurde. source_offset-
Ein
i32, der den Startoffset in derelem-element_listangibt, von dem die Kopie der Elementreferenzen beginnt. length-
Ein
i32, der die Anzahl der zu kopierenden Referenzen darstellt.
Traps
Die table.init-Anweisung löst eine Falle aus, wenn:
- Der
dest_offsetpluslengthdie Größe dertableüberschreitet. - Der
source_offsetpluslengthdie Größe deselem-Segments überschreitet. - Die
elem.drop-Anweisung zuvor auf daselem-Segment aufgerufen wurde, das inelem_identifierreferenziert wird.
Binärkodierung
| Anweisung | Binärformat | Beispieltext => binär |
|---|---|---|
table.init |
0xfc 12:u32 x:tableidx x:elemidx |
table.init 0 0 => 0xfc 0x0c 0x00 0x00 |
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # -hrefsyntax-instr-tablemathsftableinitxy> |