WebAssembly parsing, validation, encoding, and optimization toolkit
Dependencies
moon version --allcc --versionulimit -s 65536moon new answer-toolcd answer-toolmoon add jtenner/starshine@0.2.2import {
"jtenner/starshine/wast" @wast,
"jtenner/starshine/validate" @validate,
"jtenner/starshine/passes" @passes,
"jtenner/starshine/binary" @binary,
"jtenner/starshine/fs" @fs,
}
pkgtype(kind: "executable")fn optimize_wat(text : String) -> Result[Bytes, String] {
let input = match @wast.wast_to_binary_module(text) {
Ok(value) => value
Err(error) => return Err("Cannot parse WAT: \{error}")
}
match @validate.validate_module(input) {
Ok(_) => ()
Err(error) => return Err("Cannot validate input: \{error}")
}
let optimized = match @passes.run_hot_pipeline(
input,
@passes.HotPipelineOptions::new(),
["precompute", "vacuum"],
) {
Ok(value) => value
Err(error) => return Err("Cannot optimize module: \{error}")
}
match @validate.validate_module(optimized) {
Ok(_) => ()
Err(error) => return Err("Cannot validate output: \{error}")
}
match @binary.encode_module(optimized) {
Ok(bytes) => Ok(bytes)
Err(error) => Err("Cannot encode module: \{error}")
}
}fn main {
let text = "(module (func (export \"answer\") (result i32) i32.const 40 i32.const 2 i32.add))"
let bytes = match optimize_wat(text) {
Ok(value) => value
Err(error) => abort(error)
}
let numbers = bytes.to_array().map(byte => byte.to_int())
let header = [0, 97, 115, 109, 1, 0, 0, 0]
if numbers.length() < header.length() {
abort("Wasm output has no header.")
}
for index = 0; index < header.length(); index = index + 1 {
if numbers[index] != header[index] {
abort("Wasm output has an invalid header.")
}
}
println(numbers)
println("Wasm header is valid.")
}moon updatemoon run cmd/main --target wasm-gcmoon run cmd/main --target native(module (func (export "answer") (result i32) i32.const 40 i32.const 2 i32.add))fn main {
let text = match @fs.read_file_sync("input.wat") {
Ok(value) => value
Err(error) => abort(error)
}
let bytes = match optimize_wat(text) {
Ok(value) => value
Err(error) => abort(error)
}
match @fs.write_file_bytes("answer.wasm", bytes) {
Ok(_) => println("Wrote answer.wasm")
Err(error) => abort(error)
}
}moon run cmd/main --target nativeInstall
Download zipWebAssembly parsing, validation, encoding, and optimization toolkit
Dependencies