151 lines
4.4 KiB
Rust
151 lines
4.4 KiB
Rust
|
|
//! PoC tests for MIR unified ops and VM execution
|
|||
|
|
|
|||
|
|
#[cfg(test)]
|
|||
|
|
mod tests {
|
|||
|
|
use crate::backend::VM;
|
|||
|
|
use crate::mir::{BasicBlockId, ConstValue, Effect, EffectMask, MirInstruction, MirType};
|
|||
|
|
use crate::mir::{FunctionSignature, MirFunction, MirModule};
|
|||
|
|
|
|||
|
|
fn make_main() -> MirFunction {
|
|||
|
|
let sig = FunctionSignature {
|
|||
|
|
name: "main".to_string(),
|
|||
|
|
params: vec![],
|
|||
|
|
return_type: MirType::Void,
|
|||
|
|
effects: EffectMask::PURE,
|
|||
|
|
};
|
|||
|
|
MirFunction::new(sig, BasicBlockId::new(0))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Legacy VM / typeop PoC(現行の VM 実装とは前提がズレるためアーカイブ扱い).
|
|||
|
|
#[test]
|
|||
|
|
#[ignore]
|
|||
|
|
fn vm_exec_typeop_check_and_cast() {
|
|||
|
|
let mut func = make_main();
|
|||
|
|
let bb = func.entry_block;
|
|||
|
|
|
|||
|
|
let v0 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::Const {
|
|||
|
|
dst: v0,
|
|||
|
|
value: ConstValue::Integer(42),
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
let v1 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::TypeOp {
|
|||
|
|
dst: v1,
|
|||
|
|
op: crate::mir::TypeOpKind::Check,
|
|||
|
|
value: v0,
|
|||
|
|
ty: MirType::Integer,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// console.log(result) via ExternCall
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::ExternCall {
|
|||
|
|
dst: None,
|
|||
|
|
iface_name: "env.console".to_string(),
|
|||
|
|
method_name: "log".to_string(),
|
|||
|
|
args: vec![v1],
|
|||
|
|
effects: EffectMask::IO,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Cast (no-op for PoC semantics)
|
|||
|
|
let v2 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::TypeOp {
|
|||
|
|
dst: v2,
|
|||
|
|
op: crate::mir::TypeOpKind::Cast,
|
|||
|
|
value: v0,
|
|||
|
|
ty: MirType::Integer,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Return void
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::Return { value: None });
|
|||
|
|
|
|||
|
|
let mut module = MirModule::new("test".to_string());
|
|||
|
|
module.add_function(func);
|
|||
|
|
|
|||
|
|
let mut vm = VM::new();
|
|||
|
|
let _ = vm
|
|||
|
|
.execute_module(&module)
|
|||
|
|
.expect("VM should execute module");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#[test]
|
|||
|
|
#[ignore]
|
|||
|
|
fn vm_exec_typeop_cast_int_float() {
|
|||
|
|
let mut func = make_main();
|
|||
|
|
let bb = func.entry_block;
|
|||
|
|
|
|||
|
|
let v0 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::Const {
|
|||
|
|
dst: v0,
|
|||
|
|
value: ConstValue::Integer(3),
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
let v1 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::TypeOp {
|
|||
|
|
dst: v1,
|
|||
|
|
op: crate::mir::TypeOpKind::Cast,
|
|||
|
|
value: v0,
|
|||
|
|
ty: MirType::Float,
|
|||
|
|
});
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::Return { value: None });
|
|||
|
|
|
|||
|
|
let mut module = MirModule::new("test".to_string());
|
|||
|
|
module.add_function(func);
|
|||
|
|
let mut vm = VM::new();
|
|||
|
|
let _ = vm
|
|||
|
|
.execute_module(&module)
|
|||
|
|
.expect("int->float cast should succeed");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#[test]
|
|||
|
|
#[ignore]
|
|||
|
|
fn vm_exec_typeop_cast_float_int() {
|
|||
|
|
let mut func = make_main();
|
|||
|
|
let bb = func.entry_block;
|
|||
|
|
|
|||
|
|
let v0 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::Const {
|
|||
|
|
dst: v0,
|
|||
|
|
value: ConstValue::Float(3.7),
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
let v1 = func.next_value_id();
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::TypeOp {
|
|||
|
|
dst: v1,
|
|||
|
|
op: crate::mir::TypeOpKind::Cast,
|
|||
|
|
value: v0,
|
|||
|
|
ty: MirType::Integer,
|
|||
|
|
});
|
|||
|
|
func.get_block_mut(bb)
|
|||
|
|
.unwrap()
|
|||
|
|
.add_instruction(MirInstruction::Return { value: None });
|
|||
|
|
|
|||
|
|
let mut module = MirModule::new("test".to_string());
|
|||
|
|
module.add_function(func);
|
|||
|
|
let mut vm = VM::new();
|
|||
|
|
let _ = vm
|
|||
|
|
.execute_module(&module)
|
|||
|
|
.expect("float->int cast should succeed");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|