16个版本 (1个稳定版)

1.0.0 2024年8月19日
0.4.1 2024年8月10日
0.3.2 2024年7月15日
0.2.1 2024年2月23日
0.1.1 2023年11月22日

#143 in WebAssembly

Download history 54/week @ 2024-04-28 167/week @ 2024-05-05 161/week @ 2024-05-12 99/week @ 2024-05-19 116/week @ 2024-05-26 231/week @ 2024-06-02 174/week @ 2024-06-09 528/week @ 2024-06-16 615/week @ 2024-06-23 369/week @ 2024-06-30 421/week @ 2024-07-07 507/week @ 2024-07-14 279/week @ 2024-07-21 204/week @ 2024-07-28 454/week @ 2024-08-04 702/week @ 2024-08-11

每月1,651次下载
9 包 中使用

Apache-2.0

2MB
9K SLoC

golem-wasm-ast

Crate Docs

Rust的高级WASM库

该库定义了WebAssembly模块和组件的内存中可变表示。它使用
wasmparserwasm-encoder库来构建和序列化此模型。

在内存中构建完整的AST使得对整个WASM组件进行分析和修改变得更加容易。`analysis`模块定义了此类高级操作。

用法

将wasm-ast添加到Cargo.toml

$ cargo add golem-wasm-ast

然后从字节数组中解析WASM模块或组件

use std::fmt::Debug;
use golem_wasm_ast::DefaultAst;
use golem_wasm_ast::analysis::AnalysisContext;
use golem_wasm_ast::core::{Expr, Module};
use golem_wasm_ast::component::Component;

fn main() {
    let module_bytes: Vec<u8> = ...;
    let module: Module<DefaultAst> = Component::from_bytes(&component_bytes).unwrap();
    
    let component_bytes: Vec<u8> = ...;
    let component: Component<DefaultAst> = Component::from_bytes(&component_bytes).unwrap();

    println!("component metadata {:?}", component.get_metadata());

    let state = AnalysisContext::new(component);
    let analysed_exports = state.get_top_level_exports().unwrap();
    println!("analysed exports: {:?}", analysed_exports);

}

使用顶级`Module`或`Component`结构体来查询和操作模型的部分。可以使用不同于`Expr`、`Data`和`Custom`的类型来表示解析的AST中的代码块、数据和自定义部分,以减少内存占用,如果实际代码不需要进行分析。请注意,如果此自定义表示不能序列化为WASM指令流,则AST将不再可序列化。

以下示例仅忽略所有代码块,但保留数据和自定义部分

#[derive(Debug, Clone, PartialEq)]
struct IgnoredExpr {}

impl TryFromExprSource for IgnoredExpr {
    fn try_from<S: ExprSource>(_value: S) -> Result<Self, String>
    where
        Self: Sized,
    {
        Ok(IgnoredExpr {})
    }
}

#[derive(Debug, Clone, PartialEq)]
pub struct CustomAst;

impl AstCustomization for CustomAst {
    type Expr = IgnoredExpr;
    type Data = Data<IgnoredExpr>;
    type Custom = Custom;
}

fn main() {
    let module_bytes: Vec<u8> = ...;
    let module: Module<CustomAst> = Component::from_bytes(&component_bytes).unwrap();
}

可以在`TryFromExprSource`实现中对代码块进行一些解析时分析,并将分析结果存储在`Expr`节点中。

功能

  • component启用对WASM组件模型的支持
  • parser启用解析WASM模块和组件
  • writer启用序列化WASM模块和组件
  • metadata启用使用wasm-metadata库解析WASM元数据部分
  • analysis启用对WASM模块和组件的高级分析和修改

`default`功能启用上述所有功能。

依赖关系

~6–24MB
~348K SLoC