wasmer_types/stack/
sourceloc.rs1use crate::lib::std::fmt;
11use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
12#[cfg(feature = "enable-serde")]
13use serde::{Deserialize, Serialize};
14
15#[cfg_attr(
20    feature = "enable-serde",
21    derive(Serialize, Deserialize),
22    serde(transparent)
23)]
24#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
25#[derive(RkyvSerialize, RkyvDeserialize, Archive)]
26#[repr(transparent)]
27#[derive(Debug, Clone, Copy, PartialEq, Eq)]
28#[rkyv(derive(Debug))]
29pub struct SourceLoc(u32);
30
31impl SourceLoc {
32    pub fn new(bits: u32) -> Self {
34        Self(bits)
35    }
36
37    pub fn is_default(self) -> bool {
39        self == Default::default()
40    }
41
42    pub fn bits(self) -> u32 {
44        self.0
45    }
46}
47
48impl Default for SourceLoc {
49    fn default() -> Self {
50        Self(!0)
51    }
52}
53
54impl fmt::Display for SourceLoc {
55    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
56        if self.is_default() {
57            write!(f, "0x-")
58        } else {
59            write!(f, "0x{:04x}", self.0)
60        }
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::SourceLoc;
67    use crate::lib::std::string::ToString;
68
69    #[test]
70    fn display() {
71        assert_eq!(SourceLoc::default().to_string(), "0x-");
72        assert_eq!(SourceLoc::new(0).to_string(), "0x0000");
73        assert_eq!(SourceLoc::new(16).to_string(), "0x0010");
74        assert_eq!(SourceLoc::new(0xabcdef).to_string(), "0xabcdef");
75    }
76}