diff --git a/codegen-luajit/src/lib.rs b/codegen-luajit/src/lib.rs index 4176ca5..05d763d 100644 --- a/codegen-luajit/src/lib.rs +++ b/codegen-luajit/src/lib.rs @@ -1,6 +1,6 @@ pub static RUNTIME: &str = include_str!("../runtime/runtime.lua"); -pub use translator::{from_inst_list, from_module}; +pub use translator::{from_inst_list, from_module_typed, from_module_untyped}; mod analyzer; mod backend; diff --git a/codegen-luajit/src/translator.rs b/codegen-luajit/src/translator.rs index 81ee5cb..0873b0f 100644 --- a/codegen-luajit/src/translator.rs +++ b/codegen-luajit/src/translator.rs @@ -329,7 +329,7 @@ pub fn from_inst_list(code: &[Instruction], type_info: &TypeInfo, w: &mut dyn Wr /// # Errors /// Returns `Err` if writing to `Write` failed. -pub fn from_module(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> { +pub fn from_module_typed(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> { let func_list = build_func_list(wasm, type_info); write_localize_used(&func_list, w)?; @@ -345,3 +345,11 @@ pub fn from_module(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Re write_func_list(wasm, type_info, &func_list, w)?; write_module_start(wasm, type_info, &mem_list, w) } + +/// # Errors +/// Returns `Err` if writing to `Write` failed. +pub fn from_module_untyped(wasm: &Module, w: &mut dyn Write) -> Result<()> { + let type_info = TypeInfo::from_module(wasm); + + from_module_typed(wasm, &type_info, w) +} diff --git a/codegen-luau/src/lib.rs b/codegen-luau/src/lib.rs index c068708..d754558 100644 --- a/codegen-luau/src/lib.rs +++ b/codegen-luau/src/lib.rs @@ -5,7 +5,7 @@ pub static RUNTIME: &str = concat!( include_str!("../runtime/runtime.lua") ); -pub use translator::{from_inst_list, from_module}; +pub use translator::{from_inst_list, from_module_typed, from_module_untyped}; mod analyzer; mod backend; diff --git a/codegen-luau/src/translator.rs b/codegen-luau/src/translator.rs index 8061ea1..3caa379 100644 --- a/codegen-luau/src/translator.rs +++ b/codegen-luau/src/translator.rs @@ -329,7 +329,7 @@ pub fn from_inst_list(code: &[Instruction], type_info: &TypeInfo, w: &mut dyn Wr /// # Errors /// Returns `Err` if writing to `Write` failed. -pub fn from_module(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> { +pub fn from_module_typed(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> { let func_list = build_func_list(wasm, type_info); write_localize_used(&func_list, w)?; @@ -344,3 +344,11 @@ pub fn from_module(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Re write_func_list(wasm, type_info, &func_list, w)?; write_module_start(wasm, type_info, &mem_list, w) } + +/// # Errors +/// Returns `Err` if writing to `Write` failed. +pub fn from_module_untyped(wasm: &Module, w: &mut dyn Write) -> Result<()> { + let type_info = TypeInfo::from_module(wasm); + + from_module_typed(wasm, &type_info, w) +} diff --git a/dev-test/Cargo.toml b/dev-test/Cargo.toml index cf525ec..c230e01 100644 --- a/dev-test/Cargo.toml +++ b/dev-test/Cargo.toml @@ -10,7 +10,6 @@ cargo-fuzz = true [dependencies] libfuzzer-sys = "0.4" wasm-smith = "0.8.0" -wasm-ast = { path = "../wasm-ast" } codegen-luajit = { path = "../codegen-luajit" } codegen-luau = { path = "../codegen-luau" } @@ -21,6 +20,7 @@ features = ["multi_value", "sign_ext"] [dev-dependencies] test-generator = "0.3.0" wast = "41.0.0" +wasm-ast = { path = "../wasm-ast" } [[bin]] name = "luajit_translate" diff --git a/dev-test/fuzz_targets/luajit_translate.rs b/dev-test/fuzz_targets/luajit_translate.rs index 9a98d0f..0d569a5 100644 --- a/dev-test/fuzz_targets/luajit_translate.rs +++ b/dev-test/fuzz_targets/luajit_translate.rs @@ -1,6 +1,5 @@ #![no_main] -use wasm_ast::builder::TypeInfo; use wasm_smith::Module; // We are not interested in parity_wasm errors. @@ -11,8 +10,7 @@ libfuzzer_sys::fuzz_target!(|module: Module| { Err(_) => return, }; - let type_info = TypeInfo::from_module(&wasm); let sink = &mut std::io::sink(); - codegen_luajit::from_module(&wasm, &type_info, sink).expect("LuaJIT should succeed"); + codegen_luajit::from_module_untyped(&wasm, sink).expect("LuaJIT should succeed"); }); diff --git a/dev-test/fuzz_targets/luau_translate.rs b/dev-test/fuzz_targets/luau_translate.rs index 12a8dda..1a5ff66 100644 --- a/dev-test/fuzz_targets/luau_translate.rs +++ b/dev-test/fuzz_targets/luau_translate.rs @@ -1,6 +1,5 @@ #![no_main] -use wasm_ast::builder::TypeInfo; use wasm_smith::Module; // We are not interested in parity_wasm errors. @@ -11,8 +10,7 @@ libfuzzer_sys::fuzz_target!(|module: Module| { Err(_) => return, }; - let type_info = TypeInfo::from_module(&wasm); let sink = &mut std::io::sink(); - codegen_luau::from_module(&wasm, &type_info, sink).expect("Luau should succeed"); + codegen_luau::from_module_untyped(&wasm, sink).expect("Luau should succeed"); }); diff --git a/dev-test/tests/specification.rs b/dev-test/tests/specification.rs index f0a8a23..1e691ff 100644 --- a/dev-test/tests/specification.rs +++ b/dev-test/tests/specification.rs @@ -64,7 +64,7 @@ impl Target for LuaJIT { fn write_module(data: TypedModule, w: &mut dyn Write) -> IResult<()> { write!(w, "storage[\"${}\"] = (function() ", data.name)?; - codegen_luajit::translate(data.module, &data.type_info, w)?; + codegen_luajit::from_module_typed(data.module, &data.type_info, w)?; writeln!(w, "end)(nil)") } } @@ -89,7 +89,7 @@ impl Target for Luau { fn write_module(data: TypedModule, w: &mut dyn Write) -> IResult<()> { write!(w, "storage[\"${}\"] = (function() ", data.name)?; - codegen_luau::translate(data.module, &data.type_info, w)?; + codegen_luau::from_module_typed(data.module, &data.type_info, w)?; writeln!(w, "end)(nil)") } } diff --git a/wasm-synth/Cargo.toml b/wasm-synth/Cargo.toml index bdec940..c86d5d8 100644 --- a/wasm-synth/Cargo.toml +++ b/wasm-synth/Cargo.toml @@ -9,9 +9,6 @@ edition = "2021" git = "https://github.com/paritytech/parity-wasm.git" features = ["multi_value", "sign_ext"] -[dependencies.wasm-ast] -path = "../wasm-ast" - [dependencies.codegen-luajit] path = "../codegen-luajit" diff --git a/wasm-synth/src/main.rs b/wasm-synth/src/main.rs index 83ed533..84b2485 100644 --- a/wasm-synth/src/main.rs +++ b/wasm-synth/src/main.rs @@ -1,31 +1,34 @@ use std::io::{Result, Write}; use parity_wasm::{deserialize_file, elements::Module}; -use wasm_ast::builder::TypeInfo; -type Translate = fn(&Module, &TypeInfo, &mut dyn Write) -> Result<()>; +type FromUntyped = fn(&Module, &mut dyn Write) -> Result<()>; -fn parse_module(name: &str) -> Module { - let wasm = deserialize_file(name).expect("Failed to parse Wasm file"); +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); - wasm.parse_names().unwrap_or_else(|v| v.1) -} - -fn run_translator(wasm: &Module, runtime: &str, translate: Translate) -> Result<()> { - let pipe = std::io::stdout(); - let lock = &mut pipe.lock(); - let type_info = TypeInfo::from_module(wasm); + let lock = &mut std::io::stdout().lock(); write!(lock, "local rt = (function() {runtime} end)() ")?; - translate(wasm, &type_info, lock) + from_untyped(&wasm, lock) } -fn do_translate(name: &str, file: &str) { - let wasm = &parse_module(file); - let result = match name.to_lowercase().as_str() { - "luajit" => run_translator(wasm, codegen_luajit::RUNTIME, codegen_luajit::from_module), - "luau" => run_translator(wasm, codegen_luau::RUNTIME, codegen_luau::from_module), - _ => panic!("Bad language: {name}"), +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");