pub mod compiler;
pub mod lowering;
pub use compiler::JitCompiler;
use crate::frontend::ast::Expr;
use anyhow::Result;
pub fn jit_execute(ast: &Expr) -> Result<i64> {
let mut compiler = JitCompiler::new()?;
compiler.compile_and_execute(ast)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::frontend::parser::Parser;
#[test]
#[ignore = "Enable once JIT implementation is complete"]
fn test_jit_simple_arithmetic() {
let code = "2 + 2";
let ast = Parser::new(code)
.parse()
.expect("operation should succeed in test");
let result = jit_execute(&ast).expect("operation should succeed in test");
assert_eq!(result, 4);
}
#[test]
#[ignore = "Enable once JIT implementation is complete"]
fn test_jit_fibonacci_10() {
let code = r"
fun fib(n: i32) -> i32 {
if n <= 1 {
n
} else {
fib(n - 1) + fib(n - 2)
}
}
fib(10)
";
let ast = Parser::new(code)
.parse()
.expect("operation should succeed in test");
let result = jit_execute(&ast).expect("operation should succeed in test");
assert_eq!(result, 55); }
#[test]
fn test_jit_compiler_creation() {
let compiler_result = JitCompiler::new();
assert!(compiler_result.is_ok(), "JitCompiler::new() should succeed");
}
#[test]
fn test_jit_execute_parse_error_propagation() {
let code = "42";
let ast = Parser::new(code)
.parse()
.expect("operation should succeed in test");
let _ = jit_execute(&ast); }
#[test]
fn test_jit_module_exports() {
let _compiler: Result<JitCompiler> = JitCompiler::new();
fn _check_export(_f: fn(&Expr) -> Result<i64>) {}
_check_export(jit_execute);
}
}