use std::fmt::Debug; use crate::asm::instr::Cond; use crate::builtin::defs::BuiltinOp; use crate::module::{EvalRes, OpTrait}; use crate::runtime::fault::Fault; use crate::runtime::run_thread::{info::ThreadInfo, state::RunState}; /// A higher level simple opration #[derive(Debug)] pub enum OpKind { BuiltIn(BuiltinOp), /// Instruction added by an extension Ext(Box), } #[derive(Debug)] pub struct Op { pub cond: Option, pub kind: OpKind, } impl OpTrait for Op { fn execute(&self, ti: &ThreadInfo, state: &mut RunState) -> Result { if let Some(cond) = self.cond { if !state.test_cond(cond) { return Ok(EvalRes { cycles: 0, advance: 1, }); } } match &self.kind { OpKind::BuiltIn(op) => { op.execute(ti, state) } OpKind::Ext(op) => { op.execute(ti, state) } } } }