size: Wasm Tabelleninstruktion
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since November 2021.
Die table.size Tabelleninstruktion gibt die aktuelle Größe der Tabelle zurück.
Probieren Sie es aus
(module
;; table with 0 function slots
(table $my_table 0 funcref)
(func (export "run") (result i32)
;; Grow the table by 1, setting the initial values to null.
(table.grow $my_table
ref.null func
(i32.const 1)
)
(drop)
(table.size $my_table)
)
)
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}")).then((result) => {
const value = result.instance.exports.run();
console.log(value);
});
Syntax
table.size identifier
table.size-
Der
table.sizeInstruktionstyp. Muss immer zuerst enthalten sein. identifierOptional-
Der Bezeichner für die Tabelle, deren Größe Sie abrufen möchten. Dies kann eine der folgenden sein:
name-
Ein identifizierender Name, der der Tabelle zugewiesen wurde, als sie erstmals erstellt wurde. Dieser muss mit einem
$-Symbol beginnen, zum Beispiel$my_table. index-
Die Indexnummer der Tabelle, zum Beispiel
0für die erste Tabelle im wasm-Skript,1für die zweite usw.
Wenn der
identifierweggelassen wird, wird standardmäßig0verwendet.
Typ
[] -> [length]
- length
-
Ein
i32, der der aktuellen Anzahl von Elementen innerhalb der Tabelle entspricht.
Opcodes
| Instruktion | Binärer Opcode |
|---|---|
table.size |
𝟶𝚡𝙵𝙲 16:𝚞𝟹𝟸 (variable-width LEB128) |
Beschreibung
table.size wird verwendet, um die Größe einer Tabelle zurückzugeben.
Die Größe einer wasm-Tabelle kann über JavaScript mittels der table.length Eigenschaft abgerufen werden.
Beispiele
>Beobachtung von Größenzunahmen der Tabelle
Dieses Beispiel zeigt, wie eine Tabelle erstellt und ihre Größe beobachtet wird, während die Tabelle mittels table.size wächst.
JavaScript
In unserem Skript beginnen wir damit, eine Referenz auf ein <p> Element zu erhalten, an das wir Ergebnisse ausgeben werden. Wir definieren dann ein obj Objekt, das eine Funktion namens output() enthält, welche einen gegebenen Wert zum textContent eines gegebenen Elements hinzufügt.
Anschließend kompilieren und instanziieren wir unser Wasm-Modul mit der Methode WebAssembly.instantiateStreaming() und importieren dabei das obj Objekt.
Wenn das Ergebnis zurückgegeben wird, rufen wir die exportierte Wasm run() Funktion auf, die im WebAssembly Instance exports Objekt verfügbar ist, und übergeben ihr das outputElem Element als Parameter.
const outputElem = document.querySelector("p");
const obj = {
output: function (elem, val) {
elem.textContent += `${val} `;
},
};
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}"), {
obj,
}).then((result) => {
value = result.instance.exports.run(outputElem);
});
Wasm
In unserem Wasm-Modul importieren wir zuerst die JavaScript output() Funktion und stellen sicher, dass wir deklarieren, dass sie zwei Parameter hat, ein externref und ein i32.
Als Nächstes definieren wir eine table, die Funktionsreferenzen speichert (daher funcref angegeben) und leer ist.
Schließlich exportieren wir die run() Funktion, die ein externref namens $elem als Parameter entgegennimmt. Im Funktionskörper:
- Verwenden wir
table.grow, um die Tabellengröße um1zu erhöhen, mit einem initialenref.nullWert. - Rufen wir die importierte
$outputFunktion auf, indem wir ihr als Parameter das in dieoutput()Funktion übergebene$elemexternrefund den Rückgabewert dertable.sizeInstruktion übergeben. Dies führt dazu, dass die Tabellengröße im DOM ausgegeben wird. - Wiederholen wir die letzten beiden Schritte erneut, was dazu führt, dass die Tabelle um ein weiteres Element wächst und die Größe erneut im DOM ausgegeben wird.
(module
;; Import output function
(import "obj" "output" (func $output (param externref) (param i32)))
;; Define an initially empty table of funcrefs
(table 0 funcref)
(func (export "run") (param $elem externref)
;; Grow the table by 1, setting the initial values to null.
(table.grow
ref.null func
(i32.const 1)
)
(drop)
;; Call the output function, to output the table size to the DOM
(call $output
(local.get $elem)
(table.size)
)
;; Grow the table by 1, setting the initial values to null.
(table.grow
ref.null func
(i32.const 1)
)
(drop)
;; Call the output function, to output the table size to the DOM
(call $output
(local.get $elem)
(table.size)
)
)
)
Ergebnis
Die Ausgabe ist wie folgt:
Dies ist sinnvoll, da jedes Mal, wenn die output() Funktion aus dem wasm-Modul heraus ausgeführt wird, der als zweites Parameter übergebene Wert in unserem Ergebnis <p> im DOM ausgegeben wird. Jeder Wert ist die Tabellengröße zu jedem Zeitpunkt — 1 und 2 jeweils.
Spezifikationen
| Specification |
|---|
| Unknown specification> # syntax-instr-table> |