如何优雅的在JS与MoonBit之间传输数组?

目前似乎无法直接通过函数的参数传递数组,也无法传输字符串,但传递数组是一个比较常见的需求,比如图片啊,文本啊之类的。传递js对象不太现实,但如果可以传字符串的话那可以通过json传递复杂对象,也算是一种解决方案。

所以现在我只能自己写函数,一个数字一个数字传递数组。看例子中的println似乎也是一个字节一个字节传输到js中的,感觉这样是不是开销太大了?

所以有没有办法访问WebAssemly.Memory?这样可以通过TypedArray进行大量数据交换,我看有的例子里用到了moonbit.memory,是一个WebAssemly.Memory,用户有没有可能访问自定义的Memory之类的?

1 个赞

可以。
如果是非Wasm-GC后端,那么所有的数据都在Memory中,字符串对象只不过是一个数字,可以获得数字,找到对应地址,直接修改。需要注意的是,这个地址是对象的地址,而对象有个头,需要自行计算偏移量,并且不保证稳定性(预计会有一次修改)
如果是GC后端,那么所有的数据都不在Memory中,可以任意修改Memory并通过内联指令拿到数据,具体的可以参考 GitHub - peter-jerry-ye/memory: Memory allocator for WasmGC in MoonBitGitHub - peter-jerry-ye/wasi: WASI Preview 1 implementation for moonbit 。但是由于现阶段wasm-gc指令的关系,没有办法大规模将Memory转换为GC的引用数据。但开销应该也远小于FFI调用。

2 个赞