是否可以在导入的 Javascript 函数中访问调用 WASM 实例的堆?
相关,是否可以在导入的 Javascript 函数抛出异常后恢复实例? 具体来说,就在它停止的点之后,包括当前的堆数据、调用堆栈等。
我试图找出是否有可能使 WASM 进程正交持久,不仅在调用之间,而且在调用内(例如,当它们用完资源时,请参阅 https://github.com/ewasm/wasm -计量)。
是否可以在导入的 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 就是所谓的堆
最有用的评论
WebAssembly 模块没有堆,它只有一个内存,它是字节的平面向量。 当像 C++ 这样的语言被编译成 WebAssembly 时,堆存储在内存中,但其他数据也是如此。
通常,WebAssembly 调用堆栈(包括被调用函数及其本地函数的堆栈)不存储在内存中,并且不可访问。 但是当像 C++ 这样的语言被编译成 WebAssembly 时,C++ 堆栈的某些元素可能会存储在内存中。 通常这些是“取地址”的 C++ 变量和大数组。