Design: Accediendo a la pila / montón desde Javascript

Creado en 12 jun. 2018  ·  5Comentarios  ·  Fuente: WebAssembly/design

¿Es posible acceder al montón de la instancia de WASM que llama dentro de una función de Javascript importada?

Relacionado, ¿es posible reanudar una instancia después de que una función de Javascript importada arrojara una excepción? Específicamente, justo después del punto donde se detuvo, incluidos los datos del montón actual, la pila de llamadas, etc.

Estoy tratando de averiguar si es posible hacer que los procesos WASM sean ortogonalmente persistentes, y eso no solo entre llamadas, sino dentro de las llamadas (por ejemplo, cuando se quedan sin recursos, consulte https://github.com/ewasm/wasm -medida).

Comentario más útil

Un módulo WebAssembly no tiene un montón, solo tiene una memoria que es un vector plano de bytes. Cuando se compila un lenguaje como C ++ en WebAssembly, el montón se almacena en la memoria, pero también otros datos.

En general, la pila de llamadas de WebAssembly (que incluye la pila de funciones llamadas y sus locales) no se almacena en la memoria y no es accesible. Pero cuando un lenguaje como C ++ se compila en WebAssembly, algunos elementos de la pila de C ++ pueden almacenarse en la memoria. Generalmente, estas son las variables de C ++ "tomadas por direcciones" y las matrices grandes.

Todos 5 comentarios

¿Es posible acceder al montón de la instancia de WASM que llama dentro de una función de Javascript importada?

Sí, puede acceder a la memoria lineal si la exporta desde el módulo. Será un objeto WebAssembly.Memory , y su propiedad buffer es una ArrayBuffer con el contenido de la memoria lineal.

Relacionado, ¿es posible reanudar una instancia después de que una función de Javascript importada arrojara una excepción?

No, eso no es posible actualmente. La pila de llamadas se descarta cuando se lanza una excepción. Para hacer esto, tendría que instrumentar su módulo para permitir este comportamiento. Es probable que algunas de las extensiones discutidas en la propuesta de manejo de excepciones también ayuden aquí.

¿El montón está contenido en el búfer de memoria? No lo he visto mencionado en la documentación.
También parece imposible acceder a la pila de llamadas dentro de la función javascript importada sin instrumentar el módulo WASM.

Un módulo WebAssembly no tiene un montón, solo tiene una memoria que es un vector plano de bytes. Cuando se compila un lenguaje como C ++ en WebAssembly, el montón se almacena en la memoria, pero también otros datos.

En general, la pila de llamadas de WebAssembly (que incluye la pila de funciones llamadas y sus locales) no se almacena en la memoria y no es accesible. Pero cuando un lenguaje como C ++ se compila en WebAssembly, algunos elementos de la pila de C ++ pueden almacenarse en la memoria. Generalmente, estas son las variables de C ++ "tomadas por direcciones" y las matrices grandes.

Ah, ya veo, ¡para eso es __heap_base!

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

¡Muchos gracias!

WebAssembly.Memory se denomina montón

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

thysultan picture thysultan  ·  4Comentarios

beriberikix picture beriberikix  ·  7Comentarios

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6Comentarios

Artur-A picture Artur-A  ·  3Comentarios

mfateev picture mfateev  ·  5Comentarios