♻️ refactor: invoke luac during tests so I don't have to version artifacts
parent
0d88653c21
commit
d9469b4440
|
@ -2,6 +2,61 @@
|
|||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
||||
|
||||
[[package]]
|
||||
name = "blake3"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"arrayvec",
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"constant_time_eq",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.83"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "constant_time_eq"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.148"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
|
||||
|
||||
[[package]]
|
||||
name = "lunar_wave_vm"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"blake3",
|
||||
]
|
||||
|
|
|
@ -5,3 +5,8 @@ version = "0.1.0"
|
|||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
|
||||
[dev-dependencies]
|
||||
|
||||
# blake3, used to hash test vectors
|
||||
blake3 = "1.5.0"
|
||||
|
|
11
src/main.rs
11
src/main.rs
|
@ -8,11 +8,10 @@ fn main() {
|
|||
use state::State;
|
||||
|
||||
let lua_file = {
|
||||
let data = std::fs::read ("test_vectors/closure.luac").unwrap ();
|
||||
let data = std::fs::read ("test_vectors/fma.luac").unwrap ();
|
||||
let mut rdr = std::io::Cursor::new (data);
|
||||
loader::parse_chunk (&mut rdr).unwrap ()
|
||||
};
|
||||
assert_eq! (lua_file.blocks.len (), 3);
|
||||
|
||||
let mut vm = State::default ();
|
||||
if std::env::var("LUA_DEBUG").is_ok() {
|
||||
|
@ -22,12 +21,8 @@ fn main() {
|
|||
let upvalues = State::upvalues_from_args (std::env::args ());
|
||||
|
||||
vm.breakpoints.push (state::Breakpoint {
|
||||
block_idx: 2,
|
||||
program_counter: 3,
|
||||
});
|
||||
vm.breakpoints.push (state::Breakpoint {
|
||||
block_idx: 0,
|
||||
program_counter: 10,
|
||||
block_idx: 3,
|
||||
program_counter: 0,
|
||||
});
|
||||
|
||||
println! ("Returned: {:?}", vm.execute_chunk (&lua_file, &upvalues));
|
||||
|
|
40
src/tests.rs
40
src/tests.rs
|
@ -5,6 +5,39 @@ use crate::state::{
|
|||
State,
|
||||
};
|
||||
|
||||
// Invoke `luac` as a subprocess
|
||||
// Luckily luac is single-pass, so we can just pipe in and out
|
||||
|
||||
fn compile_bytecode (source: Vec <u8>) -> Vec <u8> {
|
||||
use std::{
|
||||
io::Write,
|
||||
process::{
|
||||
Command,
|
||||
Stdio,
|
||||
},
|
||||
};
|
||||
|
||||
let mut child = Command::new ("luac")
|
||||
.arg ("-o") // Output to...
|
||||
.arg ("-") // Standard output
|
||||
.arg ("-") // Input from standard input
|
||||
.stdin (Stdio::piped ())
|
||||
.stdout (Stdio::piped ())
|
||||
.spawn ()
|
||||
.expect ("failed to execute `luac`. Is Lua installed?");
|
||||
|
||||
let mut stdin = child.stdin.take ().expect ("failed to get stdin");
|
||||
std::thread::spawn (move || {
|
||||
stdin.write_all (&source).expect ("failed to write to stdin");
|
||||
});
|
||||
|
||||
let output = child
|
||||
.wait_with_output ()
|
||||
.expect ("failed to wait on child");
|
||||
|
||||
output.stdout.as_slice ().to_vec ()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bools () {
|
||||
/*
|
||||
|
@ -170,7 +203,12 @@ fn fma () {
|
|||
|
||||
#[test]
|
||||
fn is_93 () {
|
||||
let bytecode = include_bytes! ("../test_vectors/is_93.luac");
|
||||
let source = include_bytes! ("../test_vectors/is_93.lua");
|
||||
assert_eq! (&blake3::hash (source).to_hex (), "a058869ed5142cbc8ccb2372991ef8b37657af38dc3f5e34814a7274b14d1e52");
|
||||
|
||||
let bytecode = compile_bytecode (source.to_vec ());
|
||||
assert_eq! (&blake3::hash (&bytecode).to_hex (), "b59ce3e054500beb109c247e784cc4a0ff09ac42f8086dc5cdbf711bce1ba071");
|
||||
|
||||
let mut rdr = std::io::Cursor::new (bytecode);
|
||||
let file = crate::loader::parse_chunk (&mut rdr).unwrap ();
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
-- This one fails :( I haven't implemented closures properly yet.
|
||||
|
||||
local function add (aa, bb)
|
||||
return aa + bb
|
||||
end
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
main <test_vectors/fma.lua:0,0> (14 instructions at 0x55789d62dc90)
|
||||
0+ params, 7 slots, 1 upvalue, 4 locals, 1 constant, 3 functions
|
||||
1 [1] VARARGPREP 0
|
||||
2 [3] CLOSURE 0 0 ; 0x55789d62de30
|
||||
3 [7] CLOSURE 1 1 ; 0x55789d62df90
|
||||
4 [11] CLOSURE 2 2 ; 0x55789d62e0f0
|
||||
5 [13] MOVE 3 2
|
||||
6 [13] LOADI 4 10
|
||||
7 [13] LOADI 5 11
|
||||
8 [13] LOADI 6 12
|
||||
9 [13] CALL 3 4 2 ; 3 in 1 out
|
||||
10 [14] GETTABUP 4 0 0 ; _ENV "print"
|
||||
11 [14] MOVE 5 3
|
||||
12 [14] CALL 4 2 1 ; 1 in 0 out
|
||||
13 [15] RETURN 3 2 1k ; 1 out
|
||||
14 [15] RETURN 4 1 1k ; 0 out
|
||||
constants (1) for 0x55789d62dc90:
|
||||
0 S "print"
|
||||
locals (4) for 0x55789d62dc90:
|
||||
0 add 3 15
|
||||
1 mul 4 15
|
||||
2 fma 5 15
|
||||
3 hh 10 15
|
||||
upvalues (1) for 0x55789d62dc90:
|
||||
0 _ENV 1 0
|
||||
|
||||
function <test_vectors/fma.lua:1,3> (4 instructions at 0x55789d62de30)
|
||||
2 params, 3 slots, 0 upvalues, 2 locals, 0 constants, 0 functions
|
||||
1 [2] ADD 2 0 1
|
||||
2 [2] MMBIN 0 1 6 ; __add
|
||||
3 [2] RETURN1 2
|
||||
4 [3] RETURN0
|
||||
constants (0) for 0x55789d62de30:
|
||||
locals (2) for 0x55789d62de30:
|
||||
0 aa 1 5
|
||||
1 bb 1 5
|
||||
upvalues (0) for 0x55789d62de30:
|
||||
|
||||
function <test_vectors/fma.lua:5,7> (4 instructions at 0x55789d62df90)
|
||||
2 params, 3 slots, 0 upvalues, 2 locals, 0 constants, 0 functions
|
||||
1 [6] MUL 2 0 1
|
||||
2 [6] MMBIN 0 1 8 ; __mul
|
||||
3 [6] RETURN1 2
|
||||
4 [7] RETURN0
|
||||
constants (0) for 0x55789d62df90:
|
||||
locals (2) for 0x55789d62df90:
|
||||
0 cc 1 5
|
||||
1 dd 1 5
|
||||
upvalues (0) for 0x55789d62df90:
|
||||
|
||||
function <test_vectors/fma.lua:9,11> (9 instructions at 0x55789d62e0f0)
|
||||
3 params, 7 slots, 2 upvalues, 3 locals, 0 constants, 0 functions
|
||||
1 [10] GETUPVAL 3 0 ; add
|
||||
2 [10] GETUPVAL 4 1 ; mul
|
||||
3 [10] MOVE 5 0
|
||||
4 [10] MOVE 6 1
|
||||
5 [10] CALL 4 3 2 ; 2 in 1 out
|
||||
6 [10] MOVE 5 2
|
||||
7 [10] TAILCALL 3 3 0 ; 2 in
|
||||
8 [10] RETURN 3 0 0 ; all out
|
||||
9 [11] RETURN0
|
||||
constants (0) for 0x55789d62e0f0:
|
||||
locals (3) for 0x55789d62e0f0:
|
||||
0 ee 1 10
|
||||
1 ff 1 10
|
||||
2 gg 1 10
|
||||
upvalues (2) for 0x55789d62e0f0:
|
||||
0 add 1 0
|
||||
1 mul 1 1
|
Binary file not shown.
|
@ -2,4 +2,5 @@ local function add (a, b)
|
|||
return a + b
|
||||
end
|
||||
|
||||
|
||||
print (("1 + 2 = %i"):format (add (1, 2)))
|
||||
|
|
Loading…
Reference in New Issue