É possível acessar o heap da instância WASM de chamada em uma função Javascript importada?
Relacionado, é possível retomar uma instância depois que uma função Javascript importada lançou uma exceção? Especificamente, logo após o ponto em que parou, incluindo os dados do heap atual, pilha de chamadas etc.
Estou tentando descobrir se é possível tornar os processos WASM ortogonalmente persistentes, e isso não apenas entre as chamadas, mas dentro das chamadas (por exemplo, quando eles ficam sem recursos, consulte https://github.com/ewasm/wasm -medição).
É possível acessar o heap da instância WASM de chamada em uma função Javascript importada?
Sim, você pode acessar a memória linear se exportá-la do módulo. Será um objeto WebAssembly.Memory
, e sua propriedade buffer
é um ArrayBuffer
com o conteúdo da memória linear.
Relacionado, é possível retomar uma instância depois que uma função Javascript importada lançou uma exceção?
Não, isso não é possível no momento. A pilha de chamadas é descartada quando uma exceção é lançada. Para fazer isso, você teria que instrumentar seu módulo para permitir esse comportamento. É provável que algumas das extensões discutidas na proposta de tratamento de exceções ajudem aqui também.
O heap está contido no buffer de memória? Eu não vi isso mencionado na documentação.
Também parece impossível acessar a pilha de chamadas dentro da função javascript importada sem instrumentar o módulo WASM.
Um módulo WebAssembly não tem um heap, apenas uma memória que é um vetor plano de bytes. Quando uma linguagem como C ++ é compilada para WebAssembly, o heap é armazenado na memória, mas também são outros dados.
Em geral, a pilha de chamadas WebAssembly (que inclui a pilha de funções chamadas e seus locais) não é armazenada na memória e não está acessível. Mas quando uma linguagem como C ++ é compilada para WebAssembly, alguns elementos da pilha C ++ podem ser armazenados na memória. Geralmente, essas são as variáveis C ++ "obtidas por endereço" e grandes matrizes.
Ah, entendo, então é para isso que serve o __heap_base!
Instance {
exports:
{ memory: Memory {},
__heap_base: 66560,
__data_end: 1024,
main: [Function: 2],
fac: [Function: 3] }
}
Muito obrigado!
WebAssembly.Memory é chamado de heap
Comentários muito úteis
Um módulo WebAssembly não tem um heap, apenas uma memória que é um vetor plano de bytes. Quando uma linguagem como C ++ é compilada para WebAssembly, o heap é armazenado na memória, mas também são outros dados.
Em geral, a pilha de chamadas WebAssembly (que inclui a pilha de funções chamadas e seus locais) não é armazenada na memória e não está acessível. Mas quando uma linguagem como C ++ é compilada para WebAssembly, alguns elementos da pilha C ++ podem ser armazenados na memória. Geralmente, essas são as variáveis C ++ "obtidas por endereço" e grandes matrizes.