2026-03-24 13:40:42 +00:00

22 lines
927 B
Rust

use prometeu_bytecode::isa::core::CoreOpCode;
use prometeu_bytecode::FunctionMeta;
use prometeu_vm::verifier::{Verifier, VerifierError};
#[test]
fn verifier_rejects_call_closure_when_top_is_not_closure() {
// Program: PUSH_I32 7; CALL_CLOSURE argc=0; HALT
let mut rom = Vec::new();
rom.extend_from_slice(&(CoreOpCode::PushI32 as u16).to_le_bytes());
rom.extend_from_slice(&7i32.to_le_bytes());
rom.extend_from_slice(&(CoreOpCode::CallClosure as u16).to_le_bytes());
rom.extend_from_slice(&0u32.to_le_bytes()); // argc = 0
rom.extend_from_slice(&(CoreOpCode::Halt as u16).to_le_bytes());
let functions = vec![FunctionMeta { code_offset: 0, code_len: rom.len() as u32, ..Default::default() }];
match Verifier::verify(&rom, &functions) {
Err(VerifierError::NotAClosureOnCallClosure { .. }) => {}
other => panic!("expected NotAClosureOnCallClosure, got {:?}", other),
}
}