Design: Acessando a pilha / heap de Javascript

Criado em 12 jun. 2018  ·  5Comentários  ·  Fonte: WebAssembly/design

É 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).

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.

Todos 5 comentários

É 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

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

nikhedonia picture nikhedonia  ·  7Comentários

spidoche picture spidoche  ·  4Comentários

badumt55 picture badumt55  ·  8Comentários

dpw picture dpw  ·  3Comentários

ghost picture ghost  ·  7Comentários