Get factorial working

This commit is contained in:
Andrew Morris
2022-05-03 12:38:33 +10:00
parent 1509f7f9fb
commit c09ca141f1
4 changed files with 39 additions and 0 deletions

View File

@@ -1,3 +1,6 @@
@main = function() {
call @factorial [5] %return
}
@factorial = function(%n) {
op!== %n 0 %notZero
jmpif %notZero :recurse

View File

@@ -198,8 +198,10 @@ impl BytecodeDecoder {
0x01 => Mov,
0x02 => OpInc,
0x04 => OpPlus,
0x05 => OpMinus,
0x06 => OpMul,
0x08 => OpMod,
0x0d => OpTripleNe,
0x11 => OpLess,
0x21 => Call,
0x27 => Jmp,

View File

@@ -16,6 +16,10 @@ pub fn op_plus(left: &Val, right: &Val) -> Val {
return VsNumber::from_f64(left_prim.to_number() + right_prim.to_number());
}
pub fn op_minus(left: &Val, right: &Val) -> Val {
return VsNumber::from_f64(left.to_number() - right.to_number());
}
pub fn op_mul(left: &Val, right: &Val) -> Val {
return VsNumber::from_f64(left.to_number() * right.to_number());
}
@@ -31,3 +35,11 @@ pub fn op_less(left: &Val, right: &Val) -> Val {
return VsBool::from_bool(left.to_number() < right.to_number());
}
pub fn op_triple_ne(left: &Val, right: &Val) -> Val {
if left.typeof_() != VsType::Number || right.typeof_() != VsType::Number {
std::panic!("Not implemented");
}
return VsBool::from_bool(left.to_number() != right.to_number());
}

View File

@@ -103,6 +103,17 @@ impl VirtualMachine {
}
},
OpMinus => {
let left = frame.decoder.decode_val(&frame.registers);
let right = frame.decoder.decode_val(&frame.registers);
let register_index = frame.decoder.decode_register_index();
if register_index.is_some() {
frame.registers[register_index.unwrap()] = operations::op_minus(&left, &right);
}
},
OpMul => {
let left = frame.decoder.decode_val(&frame.registers);
let right = frame.decoder.decode_val(&frame.registers);
@@ -136,6 +147,17 @@ impl VirtualMachine {
}
}
OpTripleNe => {
let left = frame.decoder.decode_val(&frame.registers);
let right = frame.decoder.decode_val(&frame.registers);
let register_index = frame.decoder.decode_register_index();
if register_index.is_some() {
frame.registers[register_index.unwrap()] = operations::op_triple_ne(&left, &right);
}
}
Call => {
let fn_ = frame.decoder.decode_val(&frame.registers);
let maybe_new_frame = fn_.make_frame();