54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
mod gyehoek;
|
|
mod internal;
|
|
mod types;
|
|
|
|
use std::io;
|
|
use std::io::Read;
|
|
use clio::*;
|
|
use clap::Parser;
|
|
use wasmtime::*;
|
|
|
|
/// A Wasm runtime for Gyehoek scheme.
|
|
#[derive(Parser, Debug)]
|
|
#[command(name = "gyehoek", version, about, long_about = None)]
|
|
struct Args {
|
|
/// Path to Wasm binary or textual source
|
|
#[clap(value_parser)]
|
|
wasm: Input,
|
|
}
|
|
|
|
fn read<R : Read> (mut rdr : R) -> io::Result<Vec<u8>> {
|
|
let mut buf = vec! [];
|
|
rdr.read_to_end (&mut buf)?;
|
|
Ok (buf)
|
|
}
|
|
|
|
fn get_config () -> Config {
|
|
let mut cfg = Config::new ();
|
|
cfg.wasm_reference_types (true);
|
|
cfg.wasm_function_references (true);
|
|
cfg.wasm_tail_call (true);
|
|
cfg.wasm_gc (true);
|
|
cfg
|
|
}
|
|
|
|
fn link_primitives (linker : &mut Linker<u32>) -> wasmtime::Result<()> {
|
|
linker.func_wrap ("gyehoek", "write", gyehoek::write)?;
|
|
linker.func_wrap ("gyehoek", "truthy?", gyehoek::truthy_p)?;
|
|
Ok (())
|
|
}
|
|
|
|
pub fn main () -> wasmtime::Result<()> {
|
|
let args = Args::parse ();
|
|
let wasm_config = get_config ();
|
|
let engine = Engine::new (&wasm_config)?;
|
|
let module = Module::new (&engine, read (args.wasm)?)?;
|
|
let mut linker = Linker::new (&engine);
|
|
link_primitives (&mut linker)?;
|
|
let mut store : Store<u32> = Store::new (&engine, 4);
|
|
let instance = linker.instantiate (&mut store, &module)?;
|
|
let main = instance.get_typed_func::<(),()> (&mut store, "main")?;
|
|
main.call (&mut store, ())?;
|
|
Ok (())
|
|
}
|