Design: Zugriff auf den Stack/Heap über Javascript

Erstellt am 12. Juni 2018  ·  5Kommentare  ·  Quelle: WebAssembly/design

Ist es möglich, innerhalb einer importierten Javascript-Funktion auf den Heap der aufrufenden WASM-Instanz zuzugreifen?

Ist es möglich, eine Instanz wieder aufzunehmen, nachdem eine importierte Javascript-Funktion eine Ausnahme ausgelöst hat? Insbesondere direkt nach dem Punkt, an dem es aufgehört hat, einschließlich der aktuellen Heap-Daten, des Aufrufstapels usw.

Ich versuche herauszufinden, ob es möglich ist, WASM-Prozesse orthogonal persistent zu machen, und das nicht nur zwischen Aufrufen, sondern innerhalb von Aufrufen (zB wenn ihnen die Ressourcen ausgehen, siehe https://github.com/ewasm/wasm -Messung).

Hilfreichster Kommentar

Ein WebAssembly-Modul hat keinen Heap, sondern nur einen Speicher, der ein flacher Bytevektor ist. Wenn eine Sprache wie C++ in WebAssembly kompiliert wird, wird der Heap im Speicher gespeichert, aber auch andere Daten.

Im Allgemeinen wird der WebAssembly-Aufrufstack (der den Stack der aufgerufenen Funktionen und deren Locals enthält) nicht im Speicher gespeichert und ist nicht zugänglich. Wenn jedoch eine Sprache wie C++ in WebAssembly kompiliert wird, können einige Elemente des C++-Stacks im Speicher abgelegt werden. Im Allgemeinen sind dies die "adressierten" C++-Variablen und große Arrays.

Alle 5 Kommentare

Ist es möglich, innerhalb einer importierten Javascript-Funktion auf den Heap der aufrufenden WASM-Instanz zuzugreifen?

Ja, Sie können auf den Linearspeicher zugreifen, wenn Sie ihn aus dem Modul exportieren. Es wird ein WebAssembly.Memory Objekt sein und seine buffer Eigenschaft ist ein ArrayBuffer mit dem Inhalt des linearen Speichers.

Ist es möglich, eine Instanz wieder aufzunehmen, nachdem eine importierte Javascript-Funktion eine Ausnahme ausgelöst hat?

Nein, das ist derzeit nicht möglich. Die Aufrufliste wird verworfen, wenn eine Ausnahme ausgelöst wird. Dazu müssen Sie Ihr Modul instrumentieren, um dieses Verhalten zu berücksichtigen. Es ist wahrscheinlich, dass einige der Erweiterungen, die im Vorschlag zur

Ist der Heap im Speicherpuffer enthalten? Ich habe es nicht in der Dokumentation erwähnt gesehen.
Es scheint auch unmöglich, auf die Aufrufliste innerhalb der importierten Javascript-Funktion zuzugreifen, ohne das WASM-Modul zu instrumentieren.

Ein WebAssembly-Modul hat keinen Heap, sondern nur einen Speicher, der ein flacher Bytevektor ist. Wenn eine Sprache wie C++ in WebAssembly kompiliert wird, wird der Heap im Speicher gespeichert, aber auch andere Daten.

Im Allgemeinen wird der WebAssembly-Aufrufstack (der den Stack der aufgerufenen Funktionen und deren Locals enthält) nicht im Speicher gespeichert und ist nicht zugänglich. Wenn jedoch eine Sprache wie C++ in WebAssembly kompiliert wird, können einige Elemente des C++-Stacks im Speicher abgelegt werden. Im Allgemeinen sind dies die "adressierten" C++-Variablen und große Arrays.

Ah, ich verstehe, dafür ist die __heap_base da!

Instance {
  exports: 
   { memory: Memory {},
     __heap_base: 66560,
     __data_end: 1024,
     main: [Function: 2],
     fac: [Function: 3] }
}

Vielen Dank!

WebAssembly.Memory ist ein sogenannter Heap

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

chicoxyzzy picture chicoxyzzy  ·  5Kommentare

Artur-A picture Artur-A  ·  3Kommentare

thysultan picture thysultan  ·  4Kommentare

mfateev picture mfateev  ·  5Kommentare

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3Kommentare