Design: 从 Javascript 访问堆栈/堆

创建于 2018-06-12  ·  5评论  ·  资料来源: WebAssembly/design

是否可以在导入的 Javascript 函数中访问调用 WASM 实例的堆?

相关,是否可以在导入的 Javascript 函数抛出异常后恢复实例? 具体来说,就在它停止的点之后,包括当前的堆数据、调用堆栈等。

我试图找出是否有可能使 WASM 进程正交持久,不仅在调用之间,而且在调用内(例如,当它们用完资源时,请参阅 https://github.com/ewasm/wasm -计量)。

最有用的评论

WebAssembly 模块没有堆,它只有一个内存,它是字节的平面向量。 当像 C++ 这样的语言被编译成 WebAssembly 时,堆存储在内存中,但其他数据也是如此。

通常,WebAssembly 调用堆栈(包括被调用函数及其本地函数的堆栈)不存储在内存中,并且不可访问。 但是当像 C++ 这样的语言被编译成 WebAssembly 时,C++ 堆栈的某些元素可能会存储在内存中。 通常这些是“取地址”的 C++ 变量和大数组。

所有5条评论

是否可以在导入的 Javascript 函数中访问调用 WASM 实例的堆?

是的,如果从模块中导出线性存储器,则可以访问它。 它将是一个WebAssembly.Memory对象,它的buffer属性是一个ArrayBuffer具有线性内存的内容。

相关,是否可以在导入的 Javascript 函数抛出异常后恢复实例?

不,这目前是不可能的。 抛出异常时,调用堆栈将被丢弃。 为此,您必须对模块进行检测以允许这种行为。 异常处理提案中讨论的一些扩展很可能在这里也有帮助。

堆是否包含在内存缓冲区中? 我还没有看到文档中提到它。
在不检测 WASM 模块的情况下访问导入的 javascript 函数中的调用堆栈似乎也是不可能的。

WebAssembly 模块没有堆,它只有一个内存,它是字节的平面向量。 当像 C++ 这样的语言被编译成 WebAssembly 时,堆存储在内存中,但其他数据也是如此。

通常,WebAssembly 调用堆栈(包括被调用函数及其本地函数的堆栈)不存储在内存中,并且不可访问。 但是当像 C++ 这样的语言被编译成 WebAssembly 时,C++ 堆栈的某些元素可能会存储在内存中。 通常这些是“取地址”的 C++ 变量和大数组。

啊,我明白了,这就是 __heap_base 的用途!

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

非常感谢你!

WebAssembly.Memory 就是所谓的堆

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

nikhedonia picture nikhedonia  ·  7评论

bobOnGitHub picture bobOnGitHub  ·  6评论

beriberikix picture beriberikix  ·  7评论

JimmyVV picture JimmyVV  ·  4评论

aaabbbcccddd00001111 picture aaabbbcccddd00001111  ·  3评论