summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-08-27 11:48:36 +0800
committerJohn Hodge <tpg@mutabah.net>2016-08-27 11:48:36 +0800
commit5fa1292cf4a8cbdd1d28cba5aa89f0e93922b6fc (patch)
treed6ffe62d278e70d31b0adf47db514430e637c97c
parent228866b0acc537a2058e86dfba7412355cc4aa0a (diff)
downloadmrust-5fa1292cf4a8cbdd1d28cba5aa89f0e93922b6fc.tar.gz
HIR Serialise - Simplify u64 compressed format, fix bug in string write
-rw-r--r--src/hir/serialise.cpp33
1 files changed, 6 insertions, 27 deletions
diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp
index 75375265..e7b262a5 100644
--- a/src/hir/serialise.cpp
+++ b/src/hir/serialise.cpp
@@ -65,33 +65,12 @@ namespace {
}
}
void write_i64c(int64_t v) {
+ // Convert from 2's completement
bool sign = (v < 0);
- if( v == INT64_MIN ) {
- write_u8(0xFF);
- write_u64( static_cast<uint64_t>(v) );
- }
- else {
- uint64_t va = (v < 0 ? -v : v);
- if( va < (1 << 6) ) {
- write_u8( (sign ? 0x80 : 0x00) | static_cast<uint8_t>(va) );
- }
- else if( va < (1 << (5+16)) ) {
- write_u8( 0x80 + (sign ? 0x40 : 0x00) + (va >> 16)); // 0x80 -- 0xB0
- write_u8(va >> 8);
- write_u8(va);
- }
- else if( va < (1ul << (4 + 32)) ) {
- write_u8( 0xC0 + (sign ? 0x20 : 0x00) + (va >> 32)); // 0x80 -- 0xB0
- write_u8(va >> 24);
- write_u8(va >> 16);
- write_u8(va >> 8);
- write_u8(va);
- }
- else {
- write_u8(0xFF);
- write_u64( static_cast<uint64_t>(v) );
- }
- }
+ uint64_t va = (v < 0 ? -v : v);
+ va <<= 1;
+ va |= (sign ? 1 : 0);
+ write_u64c(va);
}
void write_double(double v) {
m_os.write(reinterpret_cast<const char*>(&v), sizeof v);
@@ -120,7 +99,7 @@ namespace {
}
else {
assert(v.size() < (1u<<(16+7)));
- write_u16( static_cast<uint8_t>(128 + (v.size() >> 16)) );
+ write_u8( static_cast<uint8_t>(128 + (v.size() >> 16)) );
write_u16( static_cast<uint16_t>(v.size() & 0xFFFF) );
}
m_os.write(v.data(), v.size());