diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2017-01-06 16:58:21 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-06 16:58:21 -0800 |
commit | ffa71f80070fde3eb8e6a5779df951c4fe0729e0 (patch) | |
tree | d927fb87606e98ae03ea1abee2490540418ae057 /python | |
parent | 1041710fce2fc72949aa61f8e81e1710457ca0ca (diff) | |
download | protobuf-ffa71f80070fde3eb8e6a5779df951c4fe0729e0.tar.gz protobuf-ffa71f80070fde3eb8e6a5779df951c4fe0729e0.tar.bz2 protobuf-ffa71f80070fde3eb8e6a5779df951c4fe0729e0.zip |
A few more cases for binary conformance tests. (#2500)
* A few more cases for binary conformance tests.
* over-encoded varints (encoded in more bytes than are necessary).
* truncated varints (>32 bits for 32-bit types).
* Fixed Python decoding bug with 32-bit varints.
* Fixed 1L -> 1LL for 32-bit platforms.
Diffstat (limited to 'python')
-rwxr-xr-x | python/google/protobuf/internal/decoder.py | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/python/google/protobuf/internal/decoder.py b/python/google/protobuf/internal/decoder.py index c5f73dc1..ff3e6d30 100755 --- a/python/google/protobuf/internal/decoder.py +++ b/python/google/protobuf/internal/decoder.py @@ -131,9 +131,12 @@ def _VarintDecoder(mask, result_type): return DecodeVarint -def _SignedVarintDecoder(mask, result_type): +def _SignedVarintDecoder(bits, result_type): """Like _VarintDecoder() but decodes signed values.""" + signbit = 1 << (bits - 1) + mask = (1 << bits) - 1 + def DecodeVarint(buffer, pos): result = 0 shift = 0 @@ -142,11 +145,8 @@ def _SignedVarintDecoder(mask, result_type): result |= ((b & 0x7f) << shift) pos += 1 if not (b & 0x80): - if result > 0x7fffffffffffffff: - result -= (1 << 64) - result |= ~mask - else: - result &= mask + result &= mask + result = (result ^ signbit) - signbit result = result_type(result) return (result, pos) shift += 7 @@ -159,11 +159,11 @@ def _SignedVarintDecoder(mask, result_type): # (e.g. the C++ implementation) simpler. _DecodeVarint = _VarintDecoder((1 << 64) - 1, long) -_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1, long) +_DecodeSignedVarint = _SignedVarintDecoder(64, long) # Use these versions for values which must be limited to 32 bits. _DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int) -_DecodeSignedVarint32 = _SignedVarintDecoder((1 << 32) - 1, int) +_DecodeSignedVarint32 = _SignedVarintDecoder(32, int) def ReadTag(buffer, pos): |