use keleusma::compiler::compile;
use keleusma::lexer::tokenize;
use keleusma::parser::parse;
use keleusma::{Value, vm::Vm, vm::VmState};
fn main() {
let source = include_str!("zero_copy_demo.kel");
let tokens = tokenize(source).expect("lex");
let program = parse(&tokens).expect("parse");
let module = compile(&program).expect("compile");
let bytes = module.to_bytes().expect("encode");
let mut aligned = rkyv::util::AlignedVec::<8>::with_capacity(bytes.len());
aligned.extend_from_slice(&bytes);
let arena = keleusma::Arena::with_capacity(64 * 1024);
let mut vm: Vm<'_, '_> =
unsafe { Vm::view_bytes_zero_copy(aligned.as_slice(), &arena).expect("framing valid") };
println!("buffer len {} bytes", aligned.len());
println!("buffer base address 0x{:x}", aligned.as_ptr() as usize);
match vm.call(&[]) {
Ok(VmState::Finished(Value::Int(v))) => {
println!("program returned {}", v);
assert_eq!(v, 42);
}
Ok(other) => panic!("unexpected state {:?}", other),
Err(e) => panic!("execution error {:?}", e),
}
println!("zero-copy execution succeeded");
}