1use std::fmt;
16use std::hash::{Hash, Hasher};
17
18use super::functions::{
19 TAG_ARRAY, TAG_BOOL, TAG_CHAR, TAG_CLOSURE, TAG_CTOR, TAG_EXTERNAL, TAG_FLOAT_BITS, TAG_HEAP,
20 TAG_INT, TAG_IO_ACTION, TAG_SMALL_NAT, TAG_STRING, TAG_TASK, TAG_THUNK, TAG_UNIT,
21};
22use super::rtobject_type::RtObject;
23
24impl fmt::Debug for RtObject {
25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26 match self.tag() {
27 TAG_SMALL_NAT => write!(f, "RtObject::Nat({})", self.payload()),
28 TAG_BOOL => write!(f, "RtObject::Bool({})", self.payload() != 0),
29 TAG_UNIT => write!(f, "RtObject::Unit"),
30 TAG_CHAR => {
31 if let Some(c) = self.as_char() {
32 write!(f, "RtObject::Char({:?})", c)
33 } else {
34 write!(f, "RtObject::Char(<invalid>)")
35 }
36 }
37 TAG_CTOR => write!(f, "RtObject::Ctor({})", self.payload()),
38 TAG_INT => {
39 if let Some(n) = self.as_small_int() {
40 write!(f, "RtObject::Int({})", n)
41 } else {
42 write!(f, "RtObject::Int(<invalid>)")
43 }
44 }
45 TAG_FLOAT_BITS => write!(f, "RtObject::Float(bits={})", self.payload()),
46 TAG_HEAP => write!(f, "RtObject::Heap(id={})", self.payload()),
47 TAG_CLOSURE => write!(f, "RtObject::Closure(id={})", self.payload()),
48 TAG_ARRAY => write!(f, "RtObject::Array(id={})", self.payload()),
49 TAG_STRING => write!(f, "RtObject::String(id={})", self.payload()),
50 TAG_THUNK => write!(f, "RtObject::Thunk(id={})", self.payload()),
51 TAG_IO_ACTION => write!(f, "RtObject::IoAction(id={})", self.payload()),
52 TAG_TASK => write!(f, "RtObject::Task(id={})", self.payload()),
53 TAG_EXTERNAL => write!(f, "RtObject::External(id={})", self.payload()),
54 _ => {
55 write!(
56 f,
57 "RtObject::Unknown(tag={}, payload={})",
58 self.tag(),
59 self.payload()
60 )
61 }
62 }
63 }
64}
65
66impl fmt::Display for RtObject {
67 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68 match self.tag() {
69 TAG_SMALL_NAT => write!(f, "{}", self.payload()),
70 TAG_BOOL => {
71 if self.payload() != 0 {
72 write!(f, "true")
73 } else {
74 write!(f, "false")
75 }
76 }
77 TAG_UNIT => write!(f, "()"),
78 TAG_CHAR => {
79 if let Some(c) = self.as_char() {
80 write!(f, "{}", c)
81 } else {
82 write!(f, "<invalid char>")
83 }
84 }
85 TAG_CTOR => write!(f, "ctor#{}", self.payload()),
86 TAG_INT => {
87 if let Some(n) = self.as_small_int() {
88 write!(f, "{}", n)
89 } else {
90 write!(f, "<invalid int>")
91 }
92 }
93 _ => write!(f, "<object tag={}>", self.tag()),
94 }
95 }
96}
97
98impl PartialEq for RtObject {
99 fn eq(&self, other: &Self) -> bool {
100 self.bits == other.bits
101 }
102}
103
104impl Eq for RtObject {}
105
106impl Hash for RtObject {
107 fn hash<H: Hasher>(&self, state: &mut H) {
108 self.bits.hash(state);
109 }
110}