在WebAssembly文本格式中,我看到的每个data
表达式都将数据提供为字符串,如"hello"
中所示。但是规范说data
的最后一个参数可以是concat((*)*)
,它显然代表了数据元素的串联。
有没有人有这方面的例子?我找不到任何有用的东西。感谢。
答案 0 :(得分:3)
可以使用多个字符串编写数据段,这些字符串简单连接:
(data (offset (i32.const 0))
"... part 1 ..."
"... part 2 ..."
"... part 3 ..."
)
此功能的唯一原因是启用将字符串拆分为多行(参见C中的字符串文字)。
答案 1 :(得分:0)
据我了解data
部分中的规范,最后一个参数是当前块的大小。由于data
使用linear memory possible
,您可以猜测字符串的大小并返回字符串concat
(module
(import "imp" "log" (func $log (param i32 i32)))
(memory (import "imp" "mem") 1)
(func $writeHi
i32.const 0
i32.const 13
call $log
)
(data (i32.const 0) "hello")
(data (i32.const 5) " ")
(data (i32.const 6) "world")
(export "writeLog" (func $writeHi))
)
用这个js
function consoleLogString(memory, offset, length) {
var bytes = new Uint8Array(memory.buffer, offset, length);
var string = new TextDecoder('utf8').decode(bytes);
console.log(string);
}
const memory = new WebAssembly.Memory({ initial: 2 });
const consoleLogStringWrapper = memory => (offset, length) => consoleLogString(memory, offset, length);
var importObj = {
imp : {
mem: memory,
log: consoleLogStringWrapper(memory)
}
};
const wasmInstance = new WebAssembly.Instance(wasmModule, importObj);
const { writeHi } = wasmInstance.exports;
writeHi();
将返回hello world
,您可以查看wat2wasm