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}