mirror of
https://github.com/voltrevo/ValueScript.git
synced 2026-04-18 03:00:27 -04:00
Get factorial working
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
@main = function() {
|
||||
call @factorial [5] %return
|
||||
}
|
||||
@factorial = function(%n) {
|
||||
op!== %n 0 %notZero
|
||||
jmpif %notZero :recurse
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user