【问题标题】:Why there is only getter for WebAssembly.Memory.buffer? What's the underlying mechanism if the buffer is SharedArrayBuffer?为什么只有 WebAssembly.Memory.buffer 的 getter?如果缓冲区是 SharedArrayBuffer,底层机制是什么?
【发布时间】:2020-08-13 19:33:00
【问题描述】:

我们可以通过WebAssembly.Memory 将 WebAssembly 内存设置为共享内存:

wasmMemory = new WebAssembly.Memory({
    "initial": NUMBER,
    "maximum": NUMBER,
    "shared": true
});

WebAssembly.Memory.buffer 只有一个 getter,所以我不能执行以下操作:

buff =  new SharedArrayBuffer(NUMBER);
wasmMemory.buffer = buff;

第一个问题

有什么理由这样设计吗?我检查了SPEC,但没有找到答案。

也许 normal SharedArrayBuffer 和 wasm 的 SharedArrayBuffer 的底层实现虽然它们的 instanceofs 相同?

或者这个设计还有其他的结果吗?

第二个问题

有没有什么神奇的方法可以将存在的SharedArrayBuffer 放入WebAssembly.Memory 中?

我想这样做是因为我有一个从原始 SharedArrayBuffer 扩展而来的新类,并且我也想在 wasm 中使用它。

【问题讨论】:

    标签: javascript webassembly sharedarraybuffer


    【解决方案1】:

    我也找不到任何官方解释,但如果我不得不猜测,那是因为每次内存增长时,您的自定义缓冲区都会自动替换为默认缓冲区。

    【讨论】:

    • 我查阅了 V8 的实现。似乎 WASM 的底层缓冲区与 JS 的相同。wasm-objects.cc:Handle<JSArrayBuffer> buffer = (shared == SharedFlag::kShared) ? isolate->factory()->NewJSSharedArrayBuffer(std::move(backing_store)) : isolate->factory()->NewJSArrayBuffer(std::move(backing_store));
    • 顺便说一句。我觉得你的猜测听起来很合理。
    • 我还看到了最近的公告,由于解决了 Spectre 漏洞,他们带回了 SharedArrayBuffers,并说 WebAssembly 缓冲区现在将成为 SharedArrayBuffer。
    • 这是正确答案,应该被接受。缓冲区由 WebAssembly.Memory 实现管理,并且可以根据增长进行交换,这就是为什么您不能提供自己的缓冲区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2010-10-13
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多