48 lines
1.0 KiB
Rust
48 lines
1.0 KiB
Rust
// cargo run -- --script test_vectors/fizz_buzz.lua
|
|
|
|
mod instruction;
|
|
mod loader;
|
|
mod state;
|
|
mod value;
|
|
|
|
#[cfg (test)]
|
|
mod tests;
|
|
|
|
fn main () {
|
|
use state::State;
|
|
|
|
let mut script = String::from ("test_vectors/hello.lua");
|
|
|
|
let mut args = std::env::args ();
|
|
let exe_name = args.next ().unwrap ();
|
|
|
|
while let Some (arg) = args.next () {
|
|
match arg.as_str () {
|
|
"--script" => script = args.next ().unwrap (),
|
|
"--" => break,
|
|
_ => panic! ("can't parse args"),
|
|
}
|
|
}
|
|
|
|
let lua_file = {
|
|
let source = std::fs::read (script).expect ("couldn't load Lua source code");
|
|
let bytecode = loader::compile_bytecode(source);
|
|
let mut rdr = std::io::Cursor::new (bytecode);
|
|
loader::parse_chunk (&mut rdr).unwrap ()
|
|
};
|
|
|
|
let mut vm = State::default ();
|
|
if std::env::var("LUA_DEBUG").is_ok() {
|
|
vm.debug_print = true;
|
|
}
|
|
|
|
let upvalues = State::upvalues_from_args ([exe_name].into_iter ().chain (args));
|
|
|
|
vm.breakpoints.push (state::Breakpoint {
|
|
block_idx: 3,
|
|
program_counter: 0,
|
|
});
|
|
|
|
vm.execute_chunk (&lua_file, &upvalues);
|
|
}
|