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, 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), } }