From 0c293def6c23cc73b28e0adb55f70b1f47382563 Mon Sep 17 00:00:00 2001 From: "kenton@google.com" Date: Tue, 27 Jul 2010 20:45:09 +0000 Subject: Fix issue 207 --- python/google/protobuf/internal/reflection_test.py | 13 +++++++++++++ python/google/protobuf/reflection.py | 10 +++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'python/google') diff --git a/python/google/protobuf/internal/reflection_test.py b/python/google/protobuf/internal/reflection_test.py index 2c9fa30b..922855b6 100755 --- a/python/google/protobuf/internal/reflection_test.py +++ b/python/google/protobuf/internal/reflection_test.py @@ -1035,6 +1035,19 @@ class ReflectionTest(unittest.TestCase): self.assertEqual(222, ext2[1].bb) self.assertEqual(333, ext2[2].bb) + def testMergeFromBug(self): + message1 = unittest_pb2.TestAllTypes() + message2 = unittest_pb2.TestAllTypes() + + # Cause optional_nested_message to be instantiated within message1, even + # though it is not considered to be "present". + message1.optional_nested_message + self.assertFalse(message1.HasField('optional_nested_message')) + + # Merge into message2. This should not instantiate the field is message2. + message2.MergeFrom(message1) + self.assertFalse(message2.HasField('optional_nested_message')) + def testCopyFromSingularField(self): # Test copy with just a singular field. proto1 = unittest_pb2.TestAllTypes() diff --git a/python/google/protobuf/reflection.py b/python/google/protobuf/reflection.py index 5b238031..13bd8e5e 100755 --- a/python/google/protobuf/reflection.py +++ b/python/google/protobuf/reflection.py @@ -943,13 +943,21 @@ def _AddMergeFromMethod(cls): fields = self._fields for field, value in msg._fields.iteritems(): - if field.label == LABEL_REPEATED or field.cpp_type == CPPTYPE_MESSAGE: + if field.label == LABEL_REPEATED: field_value = fields.get(field) if field_value is None: # Construct a new object to represent this field. field_value = field._default_constructor(self) fields[field] = field_value field_value.MergeFrom(value) + elif field.cpp_type == CPPTYPE_MESSAGE: + if value._is_present_in_parent: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) else: self._fields[field] = value cls.MergeFrom = MergeFrom -- cgit v1.2.3