|
|
|
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<dyn CrsnExtension> {
|
|
|
|
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<ParseRes<'a, OpKind>, CrsnError> {
|
|
|
|
parse::parse(pos, keyword, args)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn drop_obj(&self, _ti: &ThreadInfo, state: &mut RunState, handle: Value) -> Result<Option<()>, 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<Option<Value>, 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<Option<()>, 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<Value>
|
|
|
|
{
|
|
|
|
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<Option<()>, Fault>
|
|
|
|
{
|
|
|
|
exec::read_obj_all(state, whandle, rhandle)
|
|
|
|
}
|
|
|
|
}
|