有没有一种方法可以使用WASM直接从JS访问C结构内存



我有下面的C结构

typedef struct {
ValueType type;
union {
bool boolean;
double number;
Obj* obj;
} as;
} Value;

其中ValueType是如下所示的枚举

typedef enum {
VALUE_BOOL,
VALUE_NIL,
VALUE_NUMBER,
VALUE_OBJ
} ValueType;

使用WASM,我定义了一个名为js_library.js的外部JS文件,该文件中有一个称为accessStruct的函数,该函数具有以下在C.中定义的签名

extern void accessStruct(Value value);

我在JS中实现的功能如下

function accessStruct(value) {
console.log(Module.getValue(value, "i32"));
}

我可以准确地将ValueType字段的值记录为整数。然而,我的印象是,如果我只是将指针增加所需的偏移量,我就可以访问剩余的结构字段,因为它们需要按照指定的顺序在内存中并排排列。

所以,我试过

function accessStruct(value) {
console.log(Module.getValue(value, "i32"));
const v = value + 32;
console.log(Module.getValue(v, "i64"));
}

CCD_ 4占用4个字节=32个比特。如果ValueType是double,我应该能够通过Module.getValue(v, "i64");行代码访问double值,但我得到了垃圾。

我哪里错了?

getValue函数期望其第一个参数为偏移量(以字节为单位(。第二个参数是数据类型。你需要";双";在这种情况下,根据文档。

const v = value + 32;似乎是以位为单位的,但您需要字节。要获取字段从结构开始的偏移量(以字节为单位(,请使用类似的方法。你可能需要在C++端写一些函数来返回偏移量,然后在JavaScript端做:

function accessStruct(offset) {
console.log(Module.getValue(offset, "i32"));
console.log(Module.getValue(offset + offsetToValue(), "double"));
}

您还必须确保内存寻址为32位。看来你可以用"*"而不是";i32";,以支持64位的存储器寻址。也许您也可以使用指向实例的指针:extern void accessStruct(Value * value);

最新更新