64 lines
1.8 KiB
Rust
64 lines
1.8 KiB
Rust
use crate::instruction::{AddOperand, MultiplyOperand, SubtractOperand};
|
|
use crate::vm::CallFrame;
|
|
use crate::vm::constant::Constant;
|
|
use crate::vm::value::Value;
|
|
use crate::vm::value_util::{load_constant_value, load_value};
|
|
use std::collections::HashMap;
|
|
use std::rc::Rc;
|
|
|
|
pub fn add_operand_to_value(
|
|
add_operand: &AddOperand,
|
|
registers: &[Value],
|
|
current_frame: &CallFrame,
|
|
constants: &HashMap<Rc<str>, Constant>,
|
|
) -> Value {
|
|
match add_operand {
|
|
AddOperand::Location(location) => load_value(
|
|
registers,
|
|
current_frame.stack(),
|
|
current_frame.fp(),
|
|
location,
|
|
)
|
|
.clone(),
|
|
AddOperand::Int(i) => Value::Int(*i),
|
|
AddOperand::Double(d) => Value::Double(*d),
|
|
AddOperand::String(constant_name) => load_constant_value(constants, constant_name),
|
|
}
|
|
}
|
|
|
|
pub fn subtract_operand_to_value(
|
|
subtract_operand: &SubtractOperand,
|
|
registers: &[Value],
|
|
current_frame: &CallFrame,
|
|
) -> Value {
|
|
match subtract_operand {
|
|
SubtractOperand::Location(location) => load_value(
|
|
registers,
|
|
current_frame.stack(),
|
|
current_frame.fp(),
|
|
location,
|
|
)
|
|
.clone(),
|
|
SubtractOperand::Int(i) => Value::Int(*i),
|
|
SubtractOperand::Double(d) => Value::Double(*d),
|
|
}
|
|
}
|
|
|
|
pub fn multiply_operand_to_value(
|
|
multiply_operand: &MultiplyOperand,
|
|
registers: &[Value],
|
|
current_frame: &CallFrame,
|
|
) -> Value {
|
|
match multiply_operand {
|
|
MultiplyOperand::Location(location) => load_value(
|
|
registers,
|
|
current_frame.stack(),
|
|
current_frame.fp(),
|
|
location,
|
|
)
|
|
.clone(),
|
|
MultiplyOperand::Int(i) => Value::Int(*i),
|
|
MultiplyOperand::Double(d) => Value::Double(*d),
|
|
}
|
|
}
|