forked from wa-lang/base60
1.9 KiB
1.9 KiB
关于现有js调用webassembly的相关记录
- 一个webassembly对象好像只有持有一个mem,然后wa语言生成的base60.wasm本身内部是有mem对象的,所以js和webassmbly的数据共享是基于这个生成的mem对象
- 基于以上的认知,关于这部分包括以下几个步骤
- wa build获取base60.wat, 移动到example目录
- go run main.go 启动server, 访问本地的127.0.0.1:2333 界面
- 本地的第一次编解码是ok的,但是第二次调用之后都会出现问题
问题分析
- 关于如何在js调用ws的内存,查看base60.wat, 包括了两个和内存相关的导出方法
- runtime.malloc
- runtime.free 现有的js的交互是基于这两个导出的方法的,但是应该使用上有问题,第二次调用编解码的逻辑,就会这里出现内存访问错误。
- 如何构造传入的参数
-- Main中调用
;;Base60Encode(t2)
local.get $$t0.b
call $$Retain
local.get $$t0.d
local.get $$t0.l
local.get $$t0.c
call $base60.Base60Encode
local.set $$t1.l
local.set $$t1.d
local.get $$t1.b
call $$Release
local.set $$t1.b
-- Encode签名
(func $base60.Base60Encode (export "base60.Base60Encode") (param $buf.b i32) (param $buf.d i32) (param $buf.l i32) (param $buf.c i32) (result i32 i32 i32))
-- Decode签名
func $base60.Base60Decode (export "base60.Base60Decode") (param $s.b i32) (param $s.d i32) (param $s.l i32) (result i32 i32 i32 i32)
- 调Encode,需要传入四个变量,现在的处理,将l和c认为是长度和容量,d认为是数据部分首地址
- b在构造的过程中认为是一个结构体的头部,包括4个i32的属性(第一个应该是和引用计数相关,第三个是数据部分长度,其余部分不太好参考)
总结问题
- 对于malloc和free的理解可能存在问题,导致出现内存访问越界
- 然后是关于slice在ws层面的b这个字段表示的内容,应该如何在js侧进行构造