68 lines
2.2 KiB
Rust
68 lines
2.2 KiB
Rust
#[cfg(all(test, not(feature = "jit-direct-only")))]
|
|
mod tests {
|
|
use crate::backend::VM;
|
|
use crate::mir::{
|
|
BasicBlockId, ConstValue, EffectMask, FunctionSignature, MirFunction, MirInstruction,
|
|
MirModule, MirType,
|
|
};
|
|
|
|
fn make_string_len() -> MirModule {
|
|
let mut module = MirModule::new("identical_string".to_string());
|
|
let sig = FunctionSignature {
|
|
name: "main".into(),
|
|
params: vec![],
|
|
return_type: MirType::Integer,
|
|
effects: EffectMask::PURE,
|
|
};
|
|
let mut f = MirFunction::new(sig, BasicBlockId::new(0));
|
|
let bb = f.entry_block;
|
|
let s = f.next_value_id();
|
|
f.get_block_mut(bb)
|
|
.unwrap()
|
|
.add_instruction(MirInstruction::Const {
|
|
dst: s,
|
|
value: ConstValue::String("hello".into()),
|
|
});
|
|
let ln = f.next_value_id();
|
|
f.get_block_mut(bb)
|
|
.unwrap()
|
|
.add_instruction(MirInstruction::BoxCall {
|
|
dst: Some(ln),
|
|
box_val: s,
|
|
method: "len".into(),
|
|
args: vec![],
|
|
method_id: None,
|
|
effects: EffectMask::PURE,
|
|
});
|
|
f.get_block_mut(bb)
|
|
.unwrap()
|
|
.add_instruction(MirInstruction::Return { value: Some(ln) });
|
|
module.add_function(f);
|
|
module
|
|
}
|
|
|
|
#[cfg(feature = "cranelift-jit")]
|
|
#[test]
|
|
fn identical_vm_and_jit_string_len() {
|
|
// Prefer vtable on VM and host-bridge on JIT for parity
|
|
std::env::set_var("NYASH_ABI_VTABLE", "1");
|
|
std::env::set_var("NYASH_JIT_HOST_BRIDGE", "1");
|
|
let module = make_string_len();
|
|
|
|
// VM
|
|
let mut vm = VM::new();
|
|
let vm_out = vm.execute_module(&module).expect("VM exec");
|
|
let vm_s = vm_out.to_string_box().value;
|
|
|
|
// JIT
|
|
let jit_out = crate::backend::cranelift_compile_and_execute(&module, "identical_string")
|
|
.expect("JIT exec");
|
|
let jit_s = jit_out.to_string_box().value;
|
|
|
|
assert_eq!(
|
|
vm_s, jit_s,
|
|
"VM and JIT results should match for String.len"
|
|
);
|
|
}
|
|
}
|