Skip to main content

foundry_evm_symbolic/runtime/
symbols.rs

1use super::*;
2use inturn::InternerSymbol;
3use std::num::NonZeroU32;
4
5pub(crate) type SymbolicVars = IndexSet<Symbol>;
6
7pub(crate) type SymbolicModel = HashMap<Symbol, U256>;
8
9pub(crate) trait SymbolicModelLookup {
10    fn value(&self, name: Symbol) -> Option<U256>;
11
12    fn contains_name(&self, name: Symbol) -> bool {
13        self.value(name).is_some()
14    }
15}
16
17impl SymbolicModelLookup for SymbolicModel {
18    fn value(&self, name: Symbol) -> Option<U256> {
19        self.get(&name).copied()
20    }
21}
22
23#[derive(Clone, Copy, PartialEq, Eq, Hash)]
24pub(crate) struct Symbol(NonZeroU32);
25
26impl Symbol {
27    pub(crate) const fn id(&self) -> NonZeroU32 {
28        self.0
29    }
30}
31
32impl InternerSymbol for Symbol {
33    fn try_from_usize(id: usize) -> Option<Self> {
34        id.checked_add(1).and_then(|id| u32::try_from(id).ok()).and_then(NonZeroU32::new).map(Self)
35    }
36
37    fn to_usize(self) -> usize {
38        usize::try_from(self.0.get() - 1).expect("symbol id fits usize")
39    }
40}
41
42impl fmt::Debug for Symbol {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        fmt::Display::fmt(self, f)
45    }
46}
47
48impl fmt::Display for Symbol {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        write!(f, "sym{}", self.id())
51    }
52}