sleigh_rs/semantic/
token.rs

1use crate::meaning::Meaning;
2use crate::semantic::{
3    AttachLiteralId, AttachNumberId, AttachVarnodeId, PrintBase, TokenId,
4    ValueFmt,
5};
6use crate::{Endian, FieldBits, NumberNonZeroUnsigned, Sleigh, Span};
7
8#[derive(Clone, Debug)]
9pub struct Token {
10    pub(crate) name: Box<str>,
11    pub location: Span,
12    pub len_bytes: NumberNonZeroUnsigned,
13    pub endian: Endian,
14}
15
16#[derive(Clone, Debug)]
17pub struct TokenField {
18    pub(crate) name: Box<str>,
19    pub location: Span,
20    pub bits: FieldBits,
21    pub token: TokenId,
22    pub attach: TokenFieldAttach,
23}
24
25impl Token {
26    pub fn name(&self) -> &str {
27        &self.name
28    }
29}
30
31impl TokenField {
32    pub fn name(&self) -> &str {
33        &self.name
34    }
35    pub fn raw_value_is_signed(&self) -> bool {
36        match self.attach {
37            TokenFieldAttach::NoAttach(fmt) => fmt.signed,
38            TokenFieldAttach::Varnode(_)
39            | TokenFieldAttach::Literal(_)
40            | TokenFieldAttach::Number(_, _) => false,
41        }
42    }
43    pub fn execution_value_is_signed(&self, sleigh: &Sleigh) -> bool {
44        match self.attach {
45            TokenFieldAttach::NoAttach(fmt) => fmt.signed,
46            TokenFieldAttach::Varnode(_) | TokenFieldAttach::Literal(_) => {
47                false
48            }
49            TokenFieldAttach::Number(_, value) => {
50                sleigh.attach_number(value).is_signed()
51            }
52        }
53    }
54
55    pub fn meaning(&self) -> Meaning {
56        match self.attach {
57            TokenFieldAttach::NoAttach(fmt) => Meaning::NoAttach(fmt),
58            TokenFieldAttach::Varnode(id) => Meaning::Varnode(id),
59            TokenFieldAttach::Literal(id) => Meaning::Literal(id),
60            TokenFieldAttach::Number(base, id) => Meaning::Number(base, id),
61        }
62    }
63}
64
65#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
66pub enum TokenFieldAttach {
67    /// No attach, just use the raw value
68    NoAttach(ValueFmt),
69    Varnode(AttachVarnodeId),
70    Literal(AttachLiteralId),
71    Number(PrintBase, AttachNumberId),
72}