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
每月1,651次下载
在 9 包 中使用
2MB
9K SLoC
golem-wasm-ast
Rust的高级WASM库
该库定义了WebAssembly模块和组件的内存中可变表示。它使用
wasmparser和wasm-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