about summary refs log tree commit diff
path: root/src/libserialize
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2016-08-24 15:58:40 +0300
committerest31 <MTest31@outlook.com>2016-12-30 15:17:25 +0100
commit64de4e2731cff74e0c4b81d9389734dee7229db2 (patch)
treecb6d6b205569301fc451466f549ffa00aafc6e17 /src/libserialize
parent4e2b946e6539b4866c672cda6958fc1a2fe80687 (diff)
downloadrust-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.rs48
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]