22 lines
927 B
Rust
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),
|
|
}
|
|
}
|