Restructure and compartmentalize the project
This commit is contained in:
parent
59a5a3219f
commit
223895e617
@ -1,8 +1,7 @@
|
||||
[workspace]
|
||||
members = [
|
||||
"codegen-luajit",
|
||||
"codegen-luau",
|
||||
"codegen/luajit",
|
||||
"codegen/luau",
|
||||
"dev-test",
|
||||
"wasm-ast",
|
||||
"wasm-synth"
|
||||
"wasm-ast"
|
||||
]
|
||||
|
@ -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;
|
@ -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"
|
34
codegen/luajit/src/bin/wasm2luajit.rs
Normal file
34
codegen/luajit/src/bin/wasm2luajit.rs
Normal file
@ -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 <file>");
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
|
||||
let lock = &mut std::io::stdout().lock();
|
||||
|
||||
do_runtime(lock)?;
|
||||
codegen_luajit::from_module_untyped(&wasm, lock)
|
||||
}
|
@ -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"
|
38
codegen/luau/src/bin/wasm2luau.rs
Normal file
38
codegen/luau/src/bin/wasm2luau.rs
Normal file
@ -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 <file>");
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
|
||||
let lock = &mut std::io::stdout().lock();
|
||||
|
||||
do_runtime(lock)?;
|
||||
codegen_luau::from_module_untyped(&wasm, lock)
|
||||
}
|
8
codegen/luau/src/lib.rs
Normal file
8
codegen/luau/src/lib.rs
Normal file
@ -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;
|
@ -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"
|
||||
|
@ -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}")
|
||||
}
|
||||
|
||||
|
@ -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}")
|
||||
}
|
||||
|
||||
|
@ -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"
|
@ -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 <lang> <file>");
|
||||
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`");
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user