diff options
| author | Simonas Kazlauskas <git@kazlauskas.me> | 2016-08-24 15:58:40 +0300 |
|---|---|---|
| committer | est31 <MTest31@outlook.com> | 2016-12-30 15:17:25 +0100 |
| commit | 64de4e2731cff74e0c4b81d9389734dee7229db2 (patch) | |
| tree | cb6d6b205569301fc451466f549ffa00aafc6e17 /src/libserialize | |
| parent | 4e2b946e6539b4866c672cda6958fc1a2fe80687 (diff) | |
| download | rust-64de4e2731cff74e0c4b81d9389734dee7229db2.tar.gz rust-64de4e2731cff74e0c4b81d9389734dee7229db2.zip | |
Fix LEB128 to work with the stage1
Stage 1 can’t really handle negative 128-bit literals, but an equivalent bit-not is fine
Diffstat (limited to 'src/libserialize')
| -rw-r--r-- | src/libserialize/leb128.rs | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/src/libserialize/leb128.rs b/src/libserialize/leb128.rs index 7a4d1c7a0e4..04ebffd47f2 100644 --- a/src/libserialize/leb128.rs +++ b/src/libserialize/leb128.rs @@ -87,12 +87,14 @@ pub fn write_signed_leb128_to<W>(mut value: i128, mut write: W) -> usize value >>= 7; let more = !((((value == 0) && ((byte & 0x40) == 0)) || ((value == -1) && ((byte & 0x40) != 0)))); + if more { byte |= 0x80; // Mark this byte to show that more bytes will follow. } write(position, byte); position += 1; + if !more { break; } @@ -106,30 +108,28 @@ pub fn write_signed_leb128(out: &mut Vec<u8>, start_position: usize, value: i128 #[inline] pub fn read_signed_leb128(data: &[u8], start_position: usize) -> (i128, usize) { - let (l, r) = read_unsigned_leb128(data, start_position); - (l as i128, r) - // let mut result = 0; - // let mut shift = 0; - // let mut position = start_position; - // let mut byte; - - // loop { - // byte = data[position]; - // position += 1; - // result |= ((byte & 0x7F) as i128) << shift; - // shift += 7; - - // if (byte & 0x80) == 0 { - // break; - // } - // } - - // if (shift < 64) && ((byte & 0x40) != 0) { - // // sign extend - // result |= -(1 << shift); - // } - - // (result, position - start_position) + let mut result = 0; + let mut shift = 0; + let mut position = start_position; + let mut byte; + + loop { + byte = data[position]; + position += 1; + result |= ((byte & 0x7F) as i128) << shift; + shift += 7; + + if (byte & 0x80) == 0 { + break; + } + } + + if (shift < 64) && ((byte & 0x40) != 0) { + // sign extend + result |= -(1 << shift); + } + + (result, position - start_position) } #[test] |
