summaryrefslogtreecommitdiffstats
path: root/bytecode/src/value.rs
blob: fbaa1285f64cabaf4f91dbc73a7ae48d7e2ae6c3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#[derive(Clone, Copy)]
pub struct Value(pub u64);

impl Value {
    pub fn repr(self) -> u64 {
        let Value(v) = self;
        v
    }

    pub fn to_int(self) -> Option<i64> {
        if self.repr() & 1 == 0 {
            return None;
        }
        Some(self.repr() as i64 >> 1)
    }

    pub fn from_int(i: i64) -> Value {
        Value((i as u64) << 1 | 1)
    }

    pub fn to_pointer(self) -> Option<usize> {
        if self.repr() == 0 || self.repr() & 7 != 0 {
            return None;
        }
        Some(usize::try_from(self.repr() >> 3).expect("using 32 bits in 2024 LULW"))
    }

    pub fn from_pointer(p: usize) -> Value {
        Value(u64::try_from(p).expect("a usize should always fit in a u64... right?") << 3)
    }
}