use crsn::asm::data::literal::Value; use crsn::asm::error::CrsnError; use crsn::asm::instr::op::OpKind; use crsn::asm::parse::arg_parser::TokenParser; use crsn::module::{CrsnExtension, ParseRes}; use crsn::runtime::fault::Fault; use crsn::runtime::run_thread::{RunState, ThreadInfo}; use crsn::sexp::SourcePosition; use crate::parse::{BUF_IOMODE_STACK, BUF_IOMODE_REVERSE_STACK, BUF_IOMODE_QUEUE, BUF_IOMODE_REVERSE_QUEUE}; use crsn::asm::data::Wr; mod defs; mod parse; mod exec; #[derive(Debug, Clone)] pub struct BufOps; impl BufOps { pub fn new() -> Box { Box::new(Self) } } impl CrsnExtension for BufOps { fn name(&self) -> &'static str { "bufs" } fn parse_op<'a>(&self, pos: &SourcePosition, keyword: &str, args: TokenParser<'a>) -> Result, CrsnError> { parse::parse(pos, keyword, args) } fn drop_obj(&self, _ti: &ThreadInfo, state: &mut RunState, handle: Value) -> Result, Fault> { exec::drop_obj(state, handle) } /// Run-time method called to read an object (using the object handle syntax) fn read_obj(&self, state: &mut RunState, handle: Value) -> Result, Fault> { exec::read_obj(state, handle) } /// Run-time method called to write an object (using the object handle syntax) fn write_obj(&self, state: &mut RunState, handle: Value, value: Value) -> Result, Fault> { exec::write_obj(state, handle, value) } /// Get value of an extension-provided constant. /// This constant may be an object handle, or a constant value used as argument in some other instruction. fn get_constant_value<'a>(&self, name: &str) -> Option { match name { "BFIO_STACK" => Some(BUF_IOMODE_STACK), "BFIO_RSTACK" => Some(BUF_IOMODE_REVERSE_STACK), "BFIO_QUEUE" => Some(BUF_IOMODE_QUEUE), "BFIO_RQUEUE" => Some(BUF_IOMODE_REVERSE_QUEUE), _ => None } } /// Run-time method called to read all values from an object ("lds" using the object handle syntax) fn read_obj_all(&self, state: &mut RunState, whandle: Wr, rhandle: Value) -> Result, Fault> { exec::read_obj_all(state, whandle, rhandle) } }