#assemblyscript #wasm-module #wasmer #read-write

as-ffi-bindings

在AssemblyScript wasm模块中读取和写入内存的辅助工具

11个版本

0.2.7 2022年9月21日
0.2.6 2022年9月15日
0.2.5 2022年6月29日
0.2.3 2022年2月14日
0.1.1 2021年12月24日

#490 in WebAssembly

37 每月下载量
用于 massa-sc-runtime

Apache-2.0

31KB
520 代码行

AssemblyScript绑定 cargo版本

目前,此绑定库与Wasmer兼容,我们正在研究与WasmTime的兼容性。使用这些辅助工具可以读取、写入并使用从AssemblyScript编译的WebAssembly模块中的分配。

读取

我们提供了两个辅助工具,StringPtrBufferPtr。字符串对应AssemblyScript中的字符串,而 BufferPtr 对应 ArrayBuffer。如果您想读取本地函数的返回值,这非常简单

use as_ffi_bindings::{Read, StringPtr};
let instance = Instance::new(&module, &import_object)?;
let memory = instance.exports.get_memory("memory").expect("get memory");
// Instanciation of your wasmer things

let get_string = instance
    .exports
    .get_native_function::<(), StringPtr>("getString")?;
// Get native function in your module

let str_ptr: StringPtr = get_string.call()?;
// Get directly a string pointer

let string: String = str_ptr.read(memory)?;

注意:如果您选择使用 as_ffi_bindings::Env,在您使用env(使用Wasmer)声明本地函数时,您也可以访问内存,因此实例的内存始终可用

let str_ptr: BufferPtr = get_buffer.call()?;
// Get directly a buffer pointer

let buffer: Vec<u8> = buffer_ptr.read(memory)?;

分配/写入

use as_ffi_bindings::{Write};

Write 特性允许您释放(开发中)、写入和分配 StringPtrBufferPtr。这允许您从Rust向AssemblyScript模块发送值

let input: Vec<u8> = vec![0x03, 0x02, 0x00, 0x01];
// instanciate a vector
let buffer_ptr = BufferPtr::alloc(&input, &env)?;
// Allocate a new buffer on the defined environment
sort_buffer.call(buffer_ptr.offset() as i32)?;
// Sort your buffer in webassembly

所有内容在Rust端仍然可访问。您可以使用 .write() 方法在Rust端修改变量,显然在WebAssembly模块中也可以。所以最好将其视为一个不安全的操作,请注意 🥲。

no_thread功能

启用 'no_thread' 功能可以有效地将缓冲区复制到BufferPtr。为了避免数据竞争,您应该只使用1个线程来处理您的Wasmer实例的内存。

Env实例化

您需要初始化您的环境以分配和写入,这是因为您需要使用导出函数作为 __new__pin,根据AssemblyScript内存文档的美妙之处 📚。当Wasmer在 ImportObject 中使用带有环境(即将提供示例)的函数调用函数时,它会自动初始化。

但是当Wasmer不在后面时,您必须亲自操作!看

let mut env = Env::default();
env.init(&instance)?;

不难吧?

更多使用示例

还有一些更微妙的事情需要初始化,比如在ImportObject中的abort函数。使用特性的完整示例在test_features.rs文件中,我们尽量使用简单的示例。


许可证

您可以根据自己的选择,在Apache License, Version 2.0MIT许可证下获得许可。

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,将如上所述双重许可,不附加任何额外条款或条件。

致谢

您可以查看原始的@onsails wasmer-as实验,该仓库是基于此实验的分支。

最小Rust版本:1.56.1

依赖项

~6–15MB
~194K SLoC