base60/log/0822.md

1.9 KiB
Raw Permalink Blame History

关于现有js调用webassembly的相关记录

  • 一个webassembly对象好像只有持有一个mem然后wa语言生成的base60.wasm本身内部是有mem对象的所以js和webassmbly的数据共享是基于这个生成的mem对象
  • 基于以上的认知,关于这部分包括以下几个步骤
  1. wa build获取base60.wat, 移动到example目录
  2. go run main.go 启动server, 访问本地的127.0.0.1:2333 界面
  3. 本地的第一次编解码是ok的但是第二次调用之后都会出现问题

问题分析

  1. 关于如何在js调用ws的内存查看base60.wat, 包括了两个和内存相关的导出方法
  • runtime.malloc
  • runtime.free 现有的js的交互是基于这两个导出的方法的但是应该使用上有问题第二次调用编解码的逻辑就会这里出现内存访问错误。
  1. 如何构造传入的参数
-- 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的属性第一个应该是和引用计数相关第三个是数据部分长度其余部分不太好参考

总结问题

  1. 对于malloc和free的理解可能存在问题导致出现内存访问越界
  2. 然后是关于slice在ws层面的b这个字段表示的内容应该如何在js侧进行构造