24 个版本
使用旧的 Rust 2015
0.10.0 | 2020年7月27日 |
---|---|
0.9.2 |
|
0.9.1 | 2019年8月12日 |
0.9.0 | 2019年7月24日 |
0.2.2 | 2018年3月11日 |
#220 in WebAssembly
8,103 每月下载量
在 65 个包中使用 (55 直接)
15MB
252K SLoC
WABT 的 Rust 绑定
Rust 对 WABT 的绑定。
用法
将此添加到您的 Cargo.toml
[dependencies]
wabt = "0.9.0"
用例
将给定的程序汇编成 WebAssembly 文本格式(即 wat)并转换为二进制格式。
extern crate wabt;
use wabt::wat2wasm;
fn main() {
assert_eq!(
wat2wasm("(module)").unwrap(),
&[
0, 97, 115, 109, // \0ASM - magic
1, 0, 0, 0 // 0x01 - version
]
);
}
或将 wasm 二进制文件反汇编成文本格式。
extern crate wabt;
use wabt::wasm2wat;
fn main() {
assert_eq!(
wasm2wat(&[
0, 97, 115, 109, // \0ASM - magic
1, 0, 0, 0 // 01 - version
]),
Ok("(module)\n".to_owned()),
);
}
wabt
还可用于解析官方的 测试套件 脚本。
use wabt::script::{ScriptParser, Command, CommandKind, Action, Value};
let wast = r#"
;; Define anonymous module with function export named `sub`.
(module
(func (export "sub") (param $x i32) (param $y i32) (result i32)
;; return x - y;
(i32.sub
(get_local $x) (get_local $y)
)
)
)
;; Assert that invoking export `sub` with parameters (8, 3)
;; should return 5.
(assert_return
(invoke "sub"
(i32.const 8) (i32.const 3)
)
(i32.const 5)
)
"#;
let mut parser = ScriptParser::<f32, f64>::from_str(wast)?;
while let Some(Command { kind, .. }) = parser.next()? {
match kind {
CommandKind::Module { module, name } => {
// The module is declared as anonymous.
assert_eq!(name, None);
// Convert the module into the binary representation and check the magic number.
let module_binary = module.into_vec();
assert_eq!(&module_binary[0..4], &[0, 97, 115, 109]);
}
CommandKind::AssertReturn { action, expected } => {
assert_eq!(action, Action::Invoke {
module: None,
field: "sub".to_string(),
args: vec![
Value::I32(8),
Value::I32(3)
],
});
assert_eq!(expected, vec![Value::I32(5)]);
},
_ => panic!("there are no other commands apart from that defined above"),
}
}
替代方案
如果您只想解析 .wat
或 .wast
源,那么您可能会发现 wat
或 wast
包很有用。使用它们的优点是它们完全用 Rust 实现。此外,wast
等其他功能允许您向 WebAssembly 文本格式添加自己的扩展。
要打印 wasm 二进制文件的文本表示,wasmprinter
可能更适合您,因为它完全用 Rust 实现。