diff options
Diffstat (limited to 'src/mir/mir.cpp')
-rw-r--r-- | src/mir/mir.cpp | 39 |
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 ""; |