#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum IType {
Other,
Exception,
Interrupt,
ExReturn,
Branch { taken: bool },
Jump(JumpType),
}
impl Default for IType {
fn default() -> Self {
Self::Other
}
}
impl TryFrom<u8> for IType {
type Error = u8;
fn try_from(num: u8) -> Result<Self, Self::Error> {
match num {
0 => Ok(Self::Other),
1 => Ok(Self::Exception),
2 => Ok(Self::Interrupt),
3 => Ok(Self::ExReturn),
4 => Ok(Self::Branch { taken: false }),
5 => Ok(Self::Branch { taken: true }),
6 => Ok(JumpType::UnferJump.into()),
8 => Ok(JumpType::UnferCall.into()),
9 => Ok(JumpType::InferCall.into()),
10 => Ok(JumpType::UnferJump.into()),
11 => Ok(JumpType::InferJump.into()),
12 => Ok(JumpType::CoRoutineSwap.into()),
13 => Ok(JumpType::Return.into()),
14 => Ok(JumpType::UnferOther.into()),
15 => Ok(JumpType::InferOther.into()),
n => Err(n),
}
}
}
impl From<JumpType> for IType {
fn from(jump: JumpType) -> Self {
Self::Jump(jump)
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum JumpType {
UnferCall,
InferCall,
UnferJump,
InferJump,
CoRoutineSwap,
Return,
UnferOther,
InferOther,
}
impl JumpType {
pub fn is_call(self) -> bool {
matches!(self, Self::UnferCall | Self::InferCall)
}
pub fn is_return(self) -> bool {
matches!(self, Self::Return)
}
pub fn is_inferable(self) -> bool {
matches!(self, Self::InferCall | Self::InferJump | Self::InferOther)
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum CType {
Unreported,
Imprecisely,
Precisely,
AsyncDiscon,
}
impl Default for CType {
fn default() -> Self {
Self::Unreported
}
}
impl TryFrom<u8> for CType {
type Error = u8;
fn try_from(num: u8) -> Result<Self, Self::Error> {
match num {
0 => Ok(Self::Unreported),
1 => Ok(Self::Imprecisely),
2 => Ok(Self::Precisely),
3 => Ok(Self::AsyncDiscon),
n => Err(n),
}
}
}