diff --git a/Cargo.toml b/Cargo.toml index 715f9a9..06dec5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,7 @@ [workspace] members = [ - "codegen-luajit", - "codegen-luau", + "codegen/luajit", + "codegen/luau", "dev-test", - "wasm-ast", - "wasm-synth" + "wasm-ast" ] diff --git a/codegen-luau/src/lib.rs b/codegen-luau/src/lib.rs deleted file mode 100644 index d754558..0000000 --- a/codegen-luau/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub static RUNTIME: &str = concat!( - "local I64 = (function() ", - include_str!("../runtime/numeric.lua"), - " end)()\n", - include_str!("../runtime/runtime.lua") -); - -pub use translator::{from_inst_list, from_module_typed, from_module_untyped}; - -mod analyzer; -mod backend; -mod translator; diff --git a/codegen-luajit/Cargo.toml b/codegen/luajit/Cargo.toml similarity index 79% rename from codegen-luajit/Cargo.toml rename to codegen/luajit/Cargo.toml index b2bf472..26a30c1 100644 --- a/codegen-luajit/Cargo.toml +++ b/codegen/luajit/Cargo.toml @@ -4,8 +4,11 @@ version = "0.8.0" edition = "2021" [dependencies.wasm-ast] -path = "../wasm-ast" +path = "../../wasm-ast" [dependencies.parity-wasm] git = "https://github.com/paritytech/parity-wasm.git" features = ["multi_value", "sign_ext"] + +[[bin]] +name = "wasm2luajit" diff --git a/codegen-luajit/runtime/runtime.lua b/codegen/luajit/runtime/runtime.lua similarity index 100% rename from codegen-luajit/runtime/runtime.lua rename to codegen/luajit/runtime/runtime.lua diff --git a/codegen-luajit/src/analyzer/as_symbol.rs b/codegen/luajit/src/analyzer/as_symbol.rs similarity index 100% rename from codegen-luajit/src/analyzer/as_symbol.rs rename to codegen/luajit/src/analyzer/as_symbol.rs diff --git a/codegen-luajit/src/analyzer/br_table.rs b/codegen/luajit/src/analyzer/br_table.rs similarity index 100% rename from codegen-luajit/src/analyzer/br_table.rs rename to codegen/luajit/src/analyzer/br_table.rs diff --git a/codegen-luajit/src/analyzer/localize.rs b/codegen/luajit/src/analyzer/localize.rs similarity index 100% rename from codegen-luajit/src/analyzer/localize.rs rename to codegen/luajit/src/analyzer/localize.rs diff --git a/codegen-luajit/src/analyzer/mod.rs b/codegen/luajit/src/analyzer/mod.rs similarity index 100% rename from codegen-luajit/src/analyzer/mod.rs rename to codegen/luajit/src/analyzer/mod.rs diff --git a/codegen-luajit/src/backend/expression.rs b/codegen/luajit/src/backend/expression.rs similarity index 100% rename from codegen-luajit/src/backend/expression.rs rename to codegen/luajit/src/backend/expression.rs diff --git a/codegen-luajit/src/backend/manager.rs b/codegen/luajit/src/backend/manager.rs similarity index 100% rename from codegen-luajit/src/backend/manager.rs rename to codegen/luajit/src/backend/manager.rs diff --git a/codegen-luajit/src/backend/mod.rs b/codegen/luajit/src/backend/mod.rs similarity index 100% rename from codegen-luajit/src/backend/mod.rs rename to codegen/luajit/src/backend/mod.rs diff --git a/codegen-luajit/src/backend/statement.rs b/codegen/luajit/src/backend/statement.rs similarity index 100% rename from codegen-luajit/src/backend/statement.rs rename to codegen/luajit/src/backend/statement.rs diff --git a/codegen/luajit/src/bin/wasm2luajit.rs b/codegen/luajit/src/bin/wasm2luajit.rs new file mode 100644 index 0000000..8a040a5 --- /dev/null +++ b/codegen/luajit/src/bin/wasm2luajit.rs @@ -0,0 +1,34 @@ +use std::io::{Result, Write}; + +use parity_wasm::{deserialize_file, elements::Module}; + +fn load_module(name: &str) -> Module { + deserialize_file(name) + .expect("Failed to parse WebAssembly file") + .parse_names() + .unwrap_or_else(|v| v.1) +} + +fn do_runtime(lock: &mut dyn Write) -> Result<()> { + let runtime = codegen_luajit::RUNTIME; + + writeln!(lock, "local rt = (function()")?; + writeln!(lock, "{runtime}")?; + writeln!(lock, "end)()") +} + +fn main() -> Result<()> { + let wasm = match std::env::args().nth(1) { + Some(name) => load_module(&name), + None => { + eprintln!("usage: wasm2luajit "); + + return Ok(()); + } + }; + + let lock = &mut std::io::stdout().lock(); + + do_runtime(lock)?; + codegen_luajit::from_module_untyped(&wasm, lock) +} diff --git a/codegen-luajit/src/lib.rs b/codegen/luajit/src/lib.rs similarity index 100% rename from codegen-luajit/src/lib.rs rename to codegen/luajit/src/lib.rs diff --git a/codegen-luajit/src/translator.rs b/codegen/luajit/src/translator.rs similarity index 100% rename from codegen-luajit/src/translator.rs rename to codegen/luajit/src/translator.rs diff --git a/codegen-luau/Cargo.toml b/codegen/luau/Cargo.toml similarity index 80% rename from codegen-luau/Cargo.toml rename to codegen/luau/Cargo.toml index a95b7c2..ad8e8dc 100644 --- a/codegen-luau/Cargo.toml +++ b/codegen/luau/Cargo.toml @@ -4,8 +4,11 @@ version = "0.5.0" edition = "2021" [dependencies.wasm-ast] -path = "../wasm-ast" +path = "../../wasm-ast" [dependencies.parity-wasm] git = "https://github.com/paritytech/parity-wasm.git" features = ["multi_value", "sign_ext"] + +[[bin]] +name = "wasm2luau" diff --git a/codegen-luau/runtime/numeric.lua b/codegen/luau/runtime/numeric.lua similarity index 100% rename from codegen-luau/runtime/numeric.lua rename to codegen/luau/runtime/numeric.lua diff --git a/codegen-luau/runtime/runtime.lua b/codegen/luau/runtime/runtime.lua similarity index 100% rename from codegen-luau/runtime/runtime.lua rename to codegen/luau/runtime/runtime.lua diff --git a/codegen-luau/src/analyzer/as_symbol.rs b/codegen/luau/src/analyzer/as_symbol.rs similarity index 100% rename from codegen-luau/src/analyzer/as_symbol.rs rename to codegen/luau/src/analyzer/as_symbol.rs diff --git a/codegen-luau/src/analyzer/br_table.rs b/codegen/luau/src/analyzer/br_table.rs similarity index 100% rename from codegen-luau/src/analyzer/br_table.rs rename to codegen/luau/src/analyzer/br_table.rs diff --git a/codegen-luau/src/analyzer/localize.rs b/codegen/luau/src/analyzer/localize.rs similarity index 100% rename from codegen-luau/src/analyzer/localize.rs rename to codegen/luau/src/analyzer/localize.rs diff --git a/codegen-luau/src/analyzer/mod.rs b/codegen/luau/src/analyzer/mod.rs similarity index 100% rename from codegen-luau/src/analyzer/mod.rs rename to codegen/luau/src/analyzer/mod.rs diff --git a/codegen-luau/src/backend/expression.rs b/codegen/luau/src/backend/expression.rs similarity index 100% rename from codegen-luau/src/backend/expression.rs rename to codegen/luau/src/backend/expression.rs diff --git a/codegen-luau/src/backend/manager.rs b/codegen/luau/src/backend/manager.rs similarity index 100% rename from codegen-luau/src/backend/manager.rs rename to codegen/luau/src/backend/manager.rs diff --git a/codegen-luau/src/backend/mod.rs b/codegen/luau/src/backend/mod.rs similarity index 100% rename from codegen-luau/src/backend/mod.rs rename to codegen/luau/src/backend/mod.rs diff --git a/codegen-luau/src/backend/statement.rs b/codegen/luau/src/backend/statement.rs similarity index 100% rename from codegen-luau/src/backend/statement.rs rename to codegen/luau/src/backend/statement.rs diff --git a/codegen/luau/src/bin/wasm2luau.rs b/codegen/luau/src/bin/wasm2luau.rs new file mode 100644 index 0000000..63f20ec --- /dev/null +++ b/codegen/luau/src/bin/wasm2luau.rs @@ -0,0 +1,38 @@ +use std::io::{Result, Write}; + +use parity_wasm::{deserialize_file, elements::Module}; + +fn load_module(name: &str) -> Module { + deserialize_file(name) + .expect("Failed to parse WebAssembly file") + .parse_names() + .unwrap_or_else(|v| v.1) +} + +fn do_runtime(lock: &mut dyn Write) -> Result<()> { + let runtime = codegen_luau::RUNTIME; + let numeric = codegen_luau::NUMERIC; + + writeln!(lock, "local rt = (function()")?; + writeln!(lock, "local I64 = (function()")?; + writeln!(lock, "{numeric}")?; + writeln!(lock, "end)()")?; + writeln!(lock, "{runtime}")?; + writeln!(lock, "end)()") +} + +fn main() -> Result<()> { + let wasm = match std::env::args().nth(1) { + Some(name) => load_module(&name), + None => { + eprintln!("usage: wasm2luau "); + + return Ok(()); + } + }; + + let lock = &mut std::io::stdout().lock(); + + do_runtime(lock)?; + codegen_luau::from_module_untyped(&wasm, lock) +} diff --git a/codegen/luau/src/lib.rs b/codegen/luau/src/lib.rs new file mode 100644 index 0000000..a5dee2a --- /dev/null +++ b/codegen/luau/src/lib.rs @@ -0,0 +1,8 @@ +pub static RUNTIME: &str = include_str!("../runtime/runtime.lua"); +pub static NUMERIC: &str = include_str!("../runtime/numeric.lua"); + +pub use translator::{from_inst_list, from_module_typed, from_module_untyped}; + +mod analyzer; +mod backend; +mod translator; diff --git a/codegen-luau/src/translator.rs b/codegen/luau/src/translator.rs similarity index 100% rename from codegen-luau/src/translator.rs rename to codegen/luau/src/translator.rs diff --git a/dev-test/Cargo.toml b/dev-test/Cargo.toml index a75928e..485168a 100644 --- a/dev-test/Cargo.toml +++ b/dev-test/Cargo.toml @@ -10,8 +10,8 @@ cargo-fuzz = true [dependencies] libfuzzer-sys = "0.4" wasm-smith = "0.8.0" -codegen-luajit = { path = "../codegen-luajit" } -codegen-luau = { path = "../codegen-luau" } +codegen-luajit = { path = "../codegen/luajit" } +codegen-luau = { path = "../codegen/luau" } [dependencies.parity-wasm] git = "https://github.com/paritytech/parity-wasm.git" diff --git a/dev-test/tests/luajit_translate.rs b/dev-test/tests/luajit_translate.rs index 770ebe8..475b315 100644 --- a/dev-test/tests/luajit_translate.rs +++ b/dev-test/tests/luajit_translate.rs @@ -134,7 +134,10 @@ impl Target for LuaJIT { fn write_runtime(w: &mut dyn Write) -> Result<()> { let runtime = codegen_luajit::RUNTIME; - writeln!(w, "local rt = (function() {runtime} end)()")?; + writeln!(w, "local rt = (function()")?; + writeln!(w, "{runtime}")?; + writeln!(w, "end)()")?; + writeln!(w, "{ASSERTION}") } diff --git a/dev-test/tests/luau_translate.rs b/dev-test/tests/luau_translate.rs index b60b47c..bf18ca8 100644 --- a/dev-test/tests/luau_translate.rs +++ b/dev-test/tests/luau_translate.rs @@ -146,8 +146,15 @@ impl Target for Luau { fn write_runtime(w: &mut dyn Write) -> Result<()> { let runtime = codegen_luau::RUNTIME; + let numeric = codegen_luau::NUMERIC; + + writeln!(w, "local rt = (function()")?; + writeln!(w, "local I64 = (function()")?; + writeln!(w, "{numeric}")?; + writeln!(w, "end)()")?; + writeln!(w, "{runtime}")?; + writeln!(w, "end)()")?; - writeln!(w, "local rt = (function() {runtime} end)()")?; writeln!(w, "{ASSERTION}") } diff --git a/wasm-synth/Cargo.toml b/wasm-synth/Cargo.toml deleted file mode 100644 index d9a63c0..0000000 --- a/wasm-synth/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "wasm-synth" -version = "0.5.0" -edition = "2021" - -[dependencies.parity-wasm] -git = "https://github.com/paritytech/parity-wasm.git" -features = ["multi_value", "sign_ext"] - -[dependencies.codegen-luajit] -path = "../codegen-luajit" - -[dependencies.codegen-luau] -path = "../codegen-luau" diff --git a/wasm-synth/src/main.rs b/wasm-synth/src/main.rs deleted file mode 100644 index 84b2485..0000000 --- a/wasm-synth/src/main.rs +++ /dev/null @@ -1,57 +0,0 @@ -use std::io::{Result, Write}; - -use parity_wasm::{deserialize_file, elements::Module}; - -type FromUntyped = fn(&Module, &mut dyn Write) -> Result<()>; - -fn run_with(file: &str, runtime: &str, from_untyped: FromUntyped) -> Result<()> { - let wasm = deserialize_file(file) - .expect("Failed to parse Wasm file") - .parse_names() - .unwrap_or_else(|v| v.1); - - let lock = &mut std::io::stdout().lock(); - - write!(lock, "local rt = (function() {runtime} end)() ")?; - from_untyped(&wasm, lock) -} - -fn do_translate(lang: &str, file: &str) { - let result = match lang.to_lowercase().as_str() { - "luajit" => run_with( - file, - codegen_luajit::RUNTIME, - codegen_luajit::from_module_untyped, - ), - "luau" => run_with( - file, - codegen_luau::RUNTIME, - codegen_luau::from_module_untyped, - ), - _ => panic!("Bad language: {lang}"), - }; - - result.expect("Failed to translate file"); -} - -fn do_help() { - println!("usage: program to "); - println!(" or: program help"); -} - -fn main() { - let mut args = std::env::args().skip(1); - - match args.next().as_deref().unwrap_or("help") { - "help" => do_help(), - "to" => { - let lang = args.next().expect("No language specified"); - let file = args.next().expect("No file specified"); - - do_translate(&lang, &file); - } - bad => { - eprintln!("Bad action `{bad}`; try `help`"); - } - } -}