use crate::ast::*;
use crate::reader::LineCol;
pub type Address = usize;
#[derive(Debug, Eq, PartialEq)]
pub struct JumpSpan {
pub addr: Address,
}
#[cfg_attr(test, derive(Debug, Eq, PartialEq))]
pub struct JumpIfDefinedSpan {
pub var: String,
pub addr: Address,
}
#[cfg_attr(test, derive(Debug, PartialEq))]
pub struct JumpIfBoolSpan {
pub cond: Expr,
pub addr: Address,
pub error_msg: &'static str,
}
#[derive(Clone, Copy)]
#[cfg_attr(test, derive(Debug, Eq, PartialEq))]
pub enum ErrorHandlerSpan {
Jump(Address),
None,
ResumeNext,
}
#[cfg_attr(test, derive(Debug, Eq, PartialEq))]
pub struct UnsetSpan {
pub name: String,
pub pos: LineCol,
}
#[cfg_attr(test, derive(Debug, PartialEq))]
pub enum Instruction {
ArrayAssignment(ArrayAssignmentSpan),
Assignment(AssignmentSpan),
BuiltinCall(BuiltinCallSpan),
Call(JumpSpan),
Dim(DimSpan),
DimArray(DimArraySpan),
End(EndSpan),
Jump(JumpSpan),
JumpIfDefined(JumpIfDefinedSpan),
JumpIfTrue(JumpIfBoolSpan),
JumpIfNotTrue(JumpIfBoolSpan),
Nop,
Return(ReturnSpan),
SetErrorHandler(ErrorHandlerSpan),
Unset(UnsetSpan),
}
#[cfg_attr(test, derive(Debug, PartialEq))]
pub struct Image {
pub instrs: Vec<Instruction>,
pub data: Vec<Option<Value>>,
}