use std::collections::VecDeque; use crsn::asm::data::literal::Value; use crsn::asm::instr::op::{EvalRes, OpTrait}; use crsn::runtime::fault::Fault; use crsn::runtime::run_thread::{RunState, ThreadInfo}; use crate::defs::StackOp; struct Stacks { stacks: Vec>, } impl Default for Stacks { fn default() -> Self { Stacks { stacks: vec![VecDeque::default(); 8], } } } impl OpTrait for StackOp { fn execute(&self, _ti: &ThreadInfo, state: &mut RunState) -> Result { let eres = EvalRes::default(); match self { StackOp::Push { num, src } => { state.frame.status.clear(); let stack_num = state.frame.read(*num)?; let val = state.frame.read(*src)?; if stack_num > 8 { state.frame.status.invalid = true; } else { let obj: &mut Stacks = state.ext_mut(); obj.stacks[stack_num as usize].push_back(val); } } StackOp::Pop { dst, num } => { state.frame.status.clear(); let stack_num = state.frame.read(*num)?; if stack_num > 8 { state.frame.status.invalid = true; } else { let obj: &mut Stacks = state.ext_mut(); let val = obj.stacks[stack_num as usize].pop_back(); if obj.stacks[stack_num as usize].is_empty() { state.frame.status.zero = true; } let val = match val { None => { state.frame.status.overflow = true; 0 } Some(val) => { val } }; state.frame.write(*dst, val)?; } // TODO } } Ok(eres) } // }