use aegis_vm_macro::aegis_str_internal;
use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum VmError {
Ok = 0,
InvalidOpcode = 1,
StackUnderflow = 2,
StackOverflow = 3,
InvalidRegister = 4,
DivisionByZero = 5,
InvalidJumpTarget = 6,
IntegrityFailed = 7,
TimingAnomaly = 8,
StateCorrupt = 9,
NativeCallFailed = 10,
DecryptionFailed = 11,
MaxInstructionsExceeded = 12,
InvalidBytecode = 13,
MemoryOutOfBounds = 14,
NativeFunctionNotFound = 15,
NativeFunctionAlreadyRegistered = 16,
NativeTooManyArgs = 17,
HeapOutOfMemory = 18,
HeapOutOfBounds = 19,
DoubleFree = 20,
}
impl fmt::Debug for VmError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "E{:02}", self.code())
}
}
impl fmt::Display for VmError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl VmError {
pub fn as_str(&self) -> &'static str {
match self {
VmError::Ok => aegis_str_internal!("VM_OK"),
VmError::InvalidOpcode => aegis_str_internal!("VM_ERR_INVALID_OPCODE"),
VmError::StackUnderflow => aegis_str_internal!("VM_ERR_STACK_UNDERFLOW"),
VmError::StackOverflow => aegis_str_internal!("VM_ERR_STACK_OVERFLOW"),
VmError::InvalidRegister => aegis_str_internal!("VM_ERR_INVALID_REGISTER"),
VmError::DivisionByZero => aegis_str_internal!("VM_ERR_DIVISION_BY_ZERO"),
VmError::InvalidJumpTarget => aegis_str_internal!("VM_ERR_INVALID_JUMP_TARGET"),
VmError::IntegrityFailed => aegis_str_internal!("VM_ERR_INTEGRITY_FAILED"),
VmError::TimingAnomaly => aegis_str_internal!("VM_ERR_TIMING_ANOMALY"),
VmError::StateCorrupt => aegis_str_internal!("VM_ERR_STATE_CORRUPT"),
VmError::NativeCallFailed => aegis_str_internal!("VM_ERR_NATIVE_CALL_FAILED"),
VmError::DecryptionFailed => aegis_str_internal!("VM_ERR_DECRYPTION_FAILED"),
VmError::MaxInstructionsExceeded => aegis_str_internal!("VM_ERR_MAX_INSTRUCTIONS"),
VmError::InvalidBytecode => aegis_str_internal!("VM_ERR_INVALID_BYTECODE"),
VmError::MemoryOutOfBounds => aegis_str_internal!("VM_ERR_MEMORY_OOB"),
VmError::NativeFunctionNotFound => aegis_str_internal!("VM_ERR_NATIVE_NOT_FOUND"),
VmError::NativeFunctionAlreadyRegistered => aegis_str_internal!("VM_ERR_NATIVE_ALREADY_REG"),
VmError::NativeTooManyArgs => aegis_str_internal!("VM_ERR_NATIVE_TOO_MANY_ARGS"),
VmError::HeapOutOfMemory => aegis_str_internal!("VM_ERR_HEAP_OOM"),
VmError::HeapOutOfBounds => aegis_str_internal!("VM_ERR_HEAP_OOB"),
VmError::DoubleFree => aegis_str_internal!("VM_ERR_DOUBLE_FREE"),
}
}
pub const fn code(&self) -> u8 {
*self as u8
}
}
pub type VmResult<T> = Result<T, VmError>;