Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
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_identifierOptional-
Der Bezeichner für den
Speicher, in den Sie dieDatenkopieren 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 Beispiel0für den erstenSpeicherim Wasm-Modul,1für den zweiten usw.
Wird
memory_identifierweggelassen, wird es standardmäßig auf0gesetzt. 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 Beispiel0für die erstenDatenim Wasm-Modul,1fü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
i32oder eini64sein, um demaddress_typezu entsprechen, mit dem derSpeicherdefiniert wurde. source_offset-
Ein
i32, das die Byte-Verschiebung imDaten-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_offsetplus derlengthdie Größe desSpeichersüberschreitet. - Die
source_offsetplus derlengthdie Größe desDaten-Segments überschreitet. - Die
data.drop-Anweisung zuvor auf das imdata_identifierreferenzierteDaten-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> |
