mirror of
https://github.com/voltrevo/ValueScript.git
synced 2026-04-18 03:00:27 -04:00
Add unary+, unary-
This commit is contained in:
@@ -242,6 +242,8 @@ impl<'a> Assembler for AssemblerData<'a> {
|
||||
("subcall", Instruction::SubCall),
|
||||
("jmp", Instruction::Jmp),
|
||||
("jmpif", Instruction::JmpIf),
|
||||
("unary+", Instruction::UnaryPlus),
|
||||
("unary-", Instruction::UnaryMinus),
|
||||
]);
|
||||
|
||||
for (word, instruction) in instruction_word_map {
|
||||
@@ -811,6 +813,8 @@ enum Instruction {
|
||||
SubCall = 0x26,
|
||||
Jmp = 0x27,
|
||||
JmpIf = 0x28,
|
||||
UnaryPlus = 0x29,
|
||||
UnaryMinus = 0x2a,
|
||||
}
|
||||
|
||||
enum InstructionArg {
|
||||
@@ -865,6 +869,8 @@ fn get_instruction_layout(instruction: Instruction) -> Vec<InstructionArg> {
|
||||
SubCall => Vec::from([Value, Value, Value, Register]),
|
||||
Jmp => Vec::from([Label]),
|
||||
JmpIf => Vec::from([Value, Label]),
|
||||
UnaryPlus => Vec::from([Value, Register]),
|
||||
UnaryMinus => Vec::from([Value, Register]),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,8 @@ pub enum Instruction {
|
||||
SubCall = 0x26,
|
||||
Jmp = 0x27,
|
||||
JmpIf = 0x28,
|
||||
UnaryPlus = 0x29,
|
||||
UnaryMinus = 0x2a,
|
||||
}
|
||||
|
||||
impl Instruction {
|
||||
@@ -92,6 +94,8 @@ impl Instruction {
|
||||
0x26 => SubCall,
|
||||
0x27 => Jmp,
|
||||
0x28 => JmpIf,
|
||||
0x29 => UnaryPlus,
|
||||
0x2a => UnaryMinus,
|
||||
|
||||
_ => std::panic!("Unrecognized instruction: {}", byte),
|
||||
};
|
||||
|
||||
@@ -15,10 +15,18 @@ pub fn op_plus(left: Val, right: Val) -> Val {
|
||||
return Val::Number(left_prim.to_number() + right_prim.to_number());
|
||||
}
|
||||
|
||||
pub fn op_unary_plus(input: Val) -> Val {
|
||||
return Val::Number(input.to_number());
|
||||
}
|
||||
|
||||
pub fn op_minus(left: Val, right: Val) -> Val {
|
||||
return Val::Number(left.to_number() - right.to_number());
|
||||
}
|
||||
|
||||
pub fn op_unary_minus(input: Val) -> Val {
|
||||
return Val::Number(-input.to_number());
|
||||
}
|
||||
|
||||
pub fn op_mul(left: Val, right: Val) -> Val {
|
||||
return Val::Number(left.to_number() * right.to_number());
|
||||
}
|
||||
|
||||
@@ -259,6 +259,9 @@ impl VirtualMachine {
|
||||
frame.decoder.pos = dst;
|
||||
}
|
||||
}
|
||||
|
||||
UnaryPlus => frame.apply_unary_op(operations::op_unary_plus),
|
||||
UnaryMinus => frame.apply_unary_op(operations::op_unary_minus),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user