Better varint reader

This commit is contained in:
Tony Garnock-Jones 2020-06-17 04:11:27 +02:00
parent 6cfb474a6f
commit 046a2ad999
1 changed files with 7 additions and 5 deletions

View File

@ -380,11 +380,13 @@ impl<'de, S: BinarySource<'de>> BinaryReader<'de, S> {
}
fn varint(&mut self) -> IOResult<usize> {
let v = self.read()?;
if v < 128 {
Ok(usize::from(v))
} else {
Ok(self.varint()? * 128 + usize::from(v - 128))
let mut shift = 0;
let mut acc: usize = 0;
loop {
let v = self.read()?;
acc = acc | (((v & 0x7f) as usize) << shift);
shift = shift + 7;
if v & 0x80 == 0 { return Ok(acc) }
}
}