将数据传递给 WebAssembly
Passing data to WebAssembly
我正在尝试将一个值从 JavaScript 传递给 WASM,但它不起作用。这是我的 C 代码:
extern int x;
int foo() {
return x;
}
在JavaScript中,我实例化模块并将x设置为5:
var importObj = {
env: {
memory: new WebAssembly.Memory({initial: 256, maximum: 256}),
_x: 5
}
};
WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
.then(result =>
console.log('Output: ' + result.instance.exports._foo())
);
这不会产生任何错误,但记录的消息是 Output: 0
而不是 Output: 5
。有什么想法吗?
你用什么把你的C代码编译成wasm?我试图让它在 https://webassembly.studio 上运行,发现函数 foo
从内存位置 0
加载值。所以我能够通过从 JS 初始化实例内存来生成 Output: 5
:
WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
.then(result => {
const mem = new Uint32Array(result.instance.exports.memory.buffer)
mem[0] = 5
console.log('Output: ' + result.instance.exports._foo())
});
老实说,我希望 extern int x
成为 wasm 中的一个导入全局变量,可以通过 importObj
传递。我希望这仍然有助于走上正确的道路。
当前的 lld 实现在 link 时不支持未定义的数据符号。如果你传递 --allow-undefined
你将得到地址为 0 的未定义符号。
我们一直在讨论添加对导入数据符号的支持:https://github.com/WebAssembly/tool-conventions/issues/48
我正在尝试将一个值从 JavaScript 传递给 WASM,但它不起作用。这是我的 C 代码:
extern int x;
int foo() {
return x;
}
在JavaScript中,我实例化模块并将x设置为5:
var importObj = {
env: {
memory: new WebAssembly.Memory({initial: 256, maximum: 256}),
_x: 5
}
};
WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
.then(result =>
console.log('Output: ' + result.instance.exports._foo())
);
这不会产生任何错误,但记录的消息是 Output: 0
而不是 Output: 5
。有什么想法吗?
你用什么把你的C代码编译成wasm?我试图让它在 https://webassembly.studio 上运行,发现函数 foo
从内存位置 0
加载值。所以我能够通过从 JS 初始化实例内存来生成 Output: 5
:
WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
.then(result => {
const mem = new Uint32Array(result.instance.exports.memory.buffer)
mem[0] = 5
console.log('Output: ' + result.instance.exports._foo())
});
老实说,我希望 extern int x
成为 wasm 中的一个导入全局变量,可以通过 importObj
传递。我希望这仍然有助于走上正确的道路。
当前的 lld 实现在 link 时不支持未定义的数据符号。如果你传递 --allow-undefined
你将得到地址为 0 的未定义符号。
我们一直在讨论添加对导入数据符号的支持:https://github.com/WebAssembly/tool-conventions/issues/48