summaryrefslogtreecommitdiff
path: root/src/mir/mir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir/mir.cpp')
-rw-r--r--src/mir/mir.cpp39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/mir/mir.cpp b/src/mir/mir.cpp
index 30d94a3d..da07ec5a 100644
--- a/src/mir/mir.cpp
+++ b/src/mir/mir.cpp
@@ -24,12 +24,19 @@ namespace MIR {
os << (e.v ? "true" : "false");
),
(Bytes,
- os << "[";
+ os << "b\"";
os << ::std::hex;
for(auto v : e)
- os << static_cast<unsigned int>(v) << " ";
+ {
+ if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' )
+ os << v;
+ else if( v < 16 )
+ os << "\\x0" << (unsigned int)v;
+ else
+ os << "\\x" << (unsigned int)v;
+ }
+ os << "\"";
os << ::std::dec;
- os << "]";
),
(StaticString,
os << "\"";
@@ -50,34 +57,40 @@ namespace MIR {
)
return os;
}
- bool Constant::operator==(const Constant& b) const
+ ::Ordering Constant::ord(const Constant& b) const
{
if( this->tag() != b.tag() )
- return false;
+ return ::ord( static_cast<unsigned int>(this->tag()), b.tag() );
TU_MATCHA( (*this,b), (ae,be),
(Int,
- return ae.v == be.v && ae.t == be.t;
+ if( ae.v != be.v )
+ return ::ord(ae.v, be.v);
+ return ::ord((unsigned)ae.t, (unsigned)be.t);
),
(Uint,
- return ae.v == be.v && ae.t == be.t;
+ if( ae.v != be.v )
+ return ::ord(ae.v, be.v);
+ return ::ord((unsigned)ae.t, (unsigned)be.t);
),
(Float,
- return ae.v == be.v && ae.t == be.t;
+ if( ae.v != be.v )
+ return ::ord(ae.v, be.v);
+ return ::ord((unsigned)ae.t, (unsigned)be.t);
),
(Bool,
- return ae.v == be.v;
+ return ::ord(ae.v, be.v);
),
(Bytes,
- return ae == be;
+ return ::ord(ae, be);
),
(StaticString,
- return ae == be;
+ return ::ord(ae, be);
),
(Const,
- return ae.p == be.p;
+ return ::ord(ae.p, be.p);
),
(ItemAddr,
- return ae == be;
+ return ::ord(ae, be);
)
)
throw "";