diff --git a/python/google/protobuf/internal/message_test.py b/python/google/protobuf/internal/message_test.py index 80ec6e4f69..94347aaf1d 100755 --- a/python/google/protobuf/internal/message_test.py +++ b/python/google/protobuf/internal/message_test.py @@ -1406,6 +1406,12 @@ class Proto2Test(unittest.TestCase): with self.assertRaises(ValueError): m.unknown_map_field[1] = 123 + def testDeepCopyClosedEnum(self): + m = map_proto2_unittest_pb2.TestEnumMap() + m.known_map_field[123] = 0 + m2 = copy.deepcopy(m) + self.assertEqual(m, m2) + def testExtensionsErrors(self): msg = unittest_pb2.TestAllTypes() self.assertRaises(AttributeError, getattr, msg, 'Extensions') diff --git a/upb/message/copy.c b/upb/message/copy.c index 5d77ab8c61..2643456d08 100644 --- a/upb/message/copy.c +++ b/upb/message/copy.c @@ -98,7 +98,7 @@ upb_Map* upb_Map_DeepClone(const upb_Map* map, upb_CType key_type, const upb_MiniTableField* value_field = &map_entry_table->UPB_PRIVATE(fields)[1]; const upb_MiniTable* value_sub = - (value_field->UPB_PRIVATE(submsg_index) != kUpb_NoSub) + upb_MiniTableField_CType(value_field) == kUpb_CType_Message ? upb_MiniTable_GetSubMessageTable(map_entry_table, value_field) : NULL; upb_CType value_field_type = upb_MiniTableField_CType(value_field); @@ -165,8 +165,7 @@ static bool upb_Message_Array_DeepClone(const upb_Array* array, UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(field); upb_Array* cloned_array = upb_Array_DeepClone( array, upb_MiniTableField_CType(field), - upb_MiniTableField_CType(field) == kUpb_CType_Message && - field->UPB_PRIVATE(submsg_index) != kUpb_NoSub + upb_MiniTableField_CType(field) == kUpb_CType_Message ? upb_MiniTable_GetSubMessageTable(mini_table, field) : NULL, arena);