forked from wa-lang/base60
50 lines
1.9 KiB
Markdown
50 lines
1.9 KiB
Markdown
|
||
|
||
## 关于现有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的交互是基于这两个导出的方法的,但是应该使用上有问题,第二次调用编解码的逻辑,就会这里出现内存访问错误。
|
||
|
||
|
||
2. 如何构造传入的参数
|
||
|
||
```
|
||
-- 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侧进行构造
|