From 046a2ad999260eceb656fa5d06f081f1c8a1518b Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 17 Jun 2020 04:11:27 +0200 Subject: [PATCH] Better varint reader --- implementations/rust/src/value/reader.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/implementations/rust/src/value/reader.rs b/implementations/rust/src/value/reader.rs index 56842c5..2a938b3 100644 --- a/implementations/rust/src/value/reader.rs +++ b/implementations/rust/src/value/reader.rs @@ -380,11 +380,13 @@ impl<'de, S: BinarySource<'de>> BinaryReader<'de, S> { } fn varint(&mut self) -> IOResult { - 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) } } }