diff --git a/wasm/src/main.rs b/wasm/src/main.rs index 4331008..ca9b02b 100755 --- a/wasm/src/main.rs +++ b/wasm/src/main.rs @@ -5,9 +5,6 @@ mod analyzer; mod ast; mod writer; -static LUAJIT_RUNTIME: &str = include_str!("../runtime/luajit.lua"); -static LUAU_RUNTIME: &str = include_str!("../runtime/luau.lua"); - fn parse_module(name: &str) -> Module { let wasm = deserialize_file(name).expect("Failed to parse Wasm file"); @@ -26,6 +23,12 @@ fn run_translator<'a, T: Transpiler<'a>>(wasm: &'a Module) { .expect("Failed to transpile"); } +fn run_runtime<'a, T: Transpiler<'a>>() { + let output = std::io::stdout(); + + T::runtime(&mut output.lock()).expect("Failed to fetch runtime"); +} + fn do_translate(name: &str, file: &str) { let wasm = &parse_module(file); @@ -38,8 +41,8 @@ fn do_translate(name: &str, file: &str) { fn do_runtime(name: &str) { match name.to_lowercase().as_str() { - "luajit" => println!("{}", LUAJIT_RUNTIME), - "luau" => println!("{}", LUAU_RUNTIME), + "luajit" => run_runtime::(), + "luau" => run_runtime::(), _ => panic!("Bad runtime: {}", name), } } diff --git a/wasm/src/writer/luajit.rs b/wasm/src/writer/luajit.rs index f21fcbb..71db110 100644 --- a/wasm/src/writer/luajit.rs +++ b/wasm/src/writer/luajit.rs @@ -720,6 +720,8 @@ fn write_list(name: &str, len: usize, w: Writer) -> Result<()> { write!(w, "local {} = table_new({}, {})", name, len, hash) } +static LUAJIT_RUNTIME: &str = include_str!("../../runtime/luajit.lua"); + impl<'a> Transpiler<'a> for LuaJIT<'a> { fn new(wasm: &'a Module) -> Self { let arity = Arities::new(wasm); @@ -727,6 +729,10 @@ impl<'a> Transpiler<'a> for LuaJIT<'a> { Self { wasm, arity } } + fn runtime(writer: Writer) -> Result<()> { + write!(writer, "{}", LUAJIT_RUNTIME) + } + fn transpile(&self, w: Writer) -> Result<()> { write!(w, "local rt = require(\"luajit\")")?; diff --git a/wasm/src/writer/luau.rs b/wasm/src/writer/luau.rs index 60e6616..c21d6b6 100644 --- a/wasm/src/writer/luau.rs +++ b/wasm/src/writer/luau.rs @@ -709,6 +709,8 @@ fn write_list(name: &str, len: usize, w: Writer) -> Result<()> { write!(w, "local {} = table.create({})", name, len) } +static LUAU_RUNTIME: &str = include_str!("../../runtime/luau.lua"); + impl<'a> Transpiler<'a> for Luau<'a> { fn new(wasm: &'a Module) -> Self { let arity = Arities::new(wasm); @@ -716,6 +718,10 @@ impl<'a> Transpiler<'a> for Luau<'a> { Self { wasm, arity } } + fn runtime(writer: Writer) -> Result<()> { + write!(writer, "{}", LUAU_RUNTIME) + } + fn transpile(&self, w: Writer) -> Result<()> { write!(w, "local rt = require(script.Runtime)")?; diff --git a/wasm/src/writer/visit.rs b/wasm/src/writer/visit.rs index 7eec76f..7ba3115 100644 --- a/wasm/src/writer/visit.rs +++ b/wasm/src/writer/visit.rs @@ -9,6 +9,8 @@ pub trait Transpiler<'a> { where Self: Sized; + fn runtime(writer: Writer) -> Result<()>; + /// # Errors /// Returns `Err` if writing to `Writer` failed. fn transpile(&self, writer: Writer) -> Result<()>;