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

View in English Always switch to English

init: Wasm Speicheranweisung

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Oktober 2021 browserübergreifend verfügbar.

Die memory.init Speicheranweisung kopiert manuell die Bytes von einer passiven Daten-Definition in einen Speicher.

Probieren Sie es aus

(module
  (memory (export "memory") 1)
  (data $greeting "Hello World")

  (func (export "init")
    i32.const 0       ;; destination offset in memory
    i32.const 0       ;; offset into the data segment
    i32.const 11      ;; number of bytes to copy
    memory.init $greeting
    data.drop $greeting
  )
)
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}")).then((result) => {
  result.instance.exports.init();
  const memBuffer = result.instance.exports.memory.buffer;
  const memArray = new Uint8Array(memBuffer, 0, 11);
  console.log(new TextDecoder().decode(memArray));
});

Im obigen Beispiel definieren wir eine Daten-Definition mit dem Bezeichner $greeting, die den String "Hello World" enthält. In der Funktion init() wird das Daten-Segment mit der Anweisung memory.init in den Speicher geschrieben; anschließend löschen wir das Daten-Segment mit data.drop, da es nicht mehr benötigt wird.

Im JavaScript rufen wir die exportierte init()-Funktion auf, um die Datendefinition in den Speicher zu schreiben, dekodieren dann den exportierten Speicherpuffer und geben das Ergebnis in der Konsole aus.

Syntax

memory.init memory_identifier data_identifier
memory.init

Der Anweisungstyp memory.init. Muss immer zuerst enthalten sein.

memory_identifier Optional

Der Bezeichner für den Speicher, in den Sie die Daten kopieren möchten. Dies kann einer der folgenden sein:

name

Ein Bezeichnername gesetzt für den Speicher, als er erstmals definiert wurde. Dieser muss mit einem $-Symbol beginnen, zum Beispiel $my_mem.

index

Die Indexnummer des Speichers, zum Beispiel 0 für den ersten Speicher im Wasm-Modul, 1 für den zweiten usw.

Wird memory_identifier weggelassen, wird es standardmäßig auf 0 gesetzt.

data_identifier

Der Bezeichner für die Daten-Definition, von der Sie die Daten kopieren möchten. Dies kann einer der folgenden sein:

name

Ein Bezeichnername gesetzt für die Daten, als sie erstmals definiert wurden. Dieser muss mit einem $-Symbol beginnen, zum Beispiel $my_data.

index

Die Indexnummer der Daten, zum Beispiel 0 für die ersten Daten im Wasm-Modul, 1 für die zweiten usw.

Typ

[dest_offset source_offset length] -> []
dest_offset

Ein Integer, der die Verschiebung darstellt, an der die kopierten Daten im Zielspeicher zu schreiben beginnen sollen. Dies wird ein i32 oder ein i64 sein, um dem address_type zu entsprechen, mit dem der Speicher definiert wurde.

source_offset

Ein i32, das die Byte-Verschiebung im Daten-Segment darstellt, ab der Daten gelesen werden sollen.

length

Ein i32, der die Anzahl der zu kopierenden Bytes darstellt.

Traps

Die memory.init-Anweisung erzeugt einen Fehler, wenn:

  • Die dest_offset plus der length die Größe des Speichers überschreitet.
  • Die source_offset plus der length die Größe des Daten-Segments überschreitet.
  • Die data.drop-Anweisung zuvor auf das im data_identifier referenzierte Daten-Segment aufgerufen wurde.

Binärcodierung

Anweisung Binärformat Beispieltext => binär
memory.init 0xfc 8:u32 x:memidx x:dataidx memory.init 0 0 => 0xfc 0x08 0x00 0x00

Spezifikationen

Spezifikation
WebAssembly Core Specification
# -hrefsyntax-instr-memorymathsfmemoryinitxy

Browser-Kompatibilität

Siehe auch