From fe7d9379df3ce7c951bc0652a451413cff02382a Mon Sep 17 00:00:00 2001 From: Dan O'Reilly Date: Fri, 14 Aug 2015 15:26:33 -0400 Subject: [PATCH] Fixing some long/int bugs Signed-off-by: Dan O'Reilly --- python/google/protobuf/internal/decoder.py | 7 +++++-- python/google/protobuf/internal/reflection_test.py | 10 +++++----- python/google/protobuf/internal/type_checkers.py | 11 +++++++---- python/google/protobuf/text_format.py | 5 ++++- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/python/google/protobuf/internal/decoder.py b/python/google/protobuf/internal/decoder.py index 130386f276..4fd7a86493 100755 --- a/python/google/protobuf/internal/decoder.py +++ b/python/google/protobuf/internal/decoder.py @@ -86,6 +86,9 @@ import struct import six +if six.PY3: + long = int + from google.protobuf.internal import encoder from google.protobuf.internal import wire_format from google.protobuf import message @@ -157,8 +160,8 @@ def _SignedVarintDecoder(mask, result_type): # alternate implementations where the distinction is more significant # (e.g. the C++ implementation) simpler. -_DecodeVarint = _VarintDecoder((1 << 64) - 1, int) -_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1, int) +_DecodeVarint = _VarintDecoder((1 << 64) - 1, long) +_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1, long) # Use these versions for values which must be limited to 32 bits. _DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int) diff --git a/python/google/protobuf/internal/reflection_test.py b/python/google/protobuf/internal/reflection_test.py index d1c18c1fb2..9fe3abee61 100755 --- a/python/google/protobuf/internal/reflection_test.py +++ b/python/google/protobuf/internal/reflection_test.py @@ -630,17 +630,17 @@ class ReflectionTest(unittest.TestCase): TestGetAndDeserialize('optional_int32', 1, int) TestGetAndDeserialize('optional_int32', 1 << 30, int) TestGetAndDeserialize('optional_uint32', 1 << 30, int) + try: + integer_64 = long + except NameError: # Python3 + integer_64 = int if struct.calcsize('L') == 4: # Python only has signed ints, so 32-bit python can't fit an uint32 # in an int. - TestGetAndDeserialize('optional_uint32', 1 << 31, int) + TestGetAndDeserialize('optional_uint32', 1 << 31, long) else: # 64-bit python can fit uint32 inside an int TestGetAndDeserialize('optional_uint32', 1 << 31, int) - try: - integer_64 = long - except NameError: # Python3 - integer_64 = int TestGetAndDeserialize('optional_int64', 1 << 30, integer_64) TestGetAndDeserialize('optional_int64', 1 << 60, integer_64) TestGetAndDeserialize('optional_uint64', 1 << 30, integer_64) diff --git a/python/google/protobuf/internal/type_checkers.py b/python/google/protobuf/internal/type_checkers.py index 363018ed3c..8fa3d8c835 100755 --- a/python/google/protobuf/internal/type_checkers.py +++ b/python/google/protobuf/internal/type_checkers.py @@ -49,6 +49,9 @@ __author__ = 'robinson@google.com (Will Robinson)' import six +if six.PY3: + long = int + from google.protobuf.internal import decoder from google.protobuf.internal import encoder from google.protobuf.internal import wire_format @@ -195,13 +198,13 @@ class Uint32ValueChecker(IntValueChecker): class Int64ValueChecker(IntValueChecker): _MIN = -(1 << 63) _MAX = (1 << 63) - 1 - _TYPE = int + _TYPE = long class Uint64ValueChecker(IntValueChecker): _MIN = 0 _MAX = (1 << 64) - 1 - _TYPE = int + _TYPE = long # Type-checkers for all scalar CPPTYPEs. @@ -211,9 +214,9 @@ _VALUE_CHECKERS = { _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(), _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(), _FieldDescriptor.CPPTYPE_DOUBLE: TypeChecker( - float, int, int), + float, int, long), _FieldDescriptor.CPPTYPE_FLOAT: TypeChecker( - float, int, int), + float, int, long), _FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int), _FieldDescriptor.CPPTYPE_STRING: TypeChecker(bytes), } diff --git a/python/google/protobuf/text_format.py b/python/google/protobuf/text_format.py index 6dd7f55149..d4c4610fe1 100755 --- a/python/google/protobuf/text_format.py +++ b/python/google/protobuf/text_format.py @@ -39,6 +39,9 @@ import re import six +if six.PY3: + long = int + from google.protobuf.internal import type_checkers from google.protobuf import descriptor from google.protobuf import text_encoding @@ -813,7 +816,7 @@ def ParseInteger(text, is_signed=False, is_long=False): # alternate implementations where the distinction is more significant # (e.g. the C++ implementation) simpler. if is_long: - result = int(text, 0) + result = long(text, 0) else: result = int(text, 0) except ValueError: