make bytearray work (again) (#16691)

fix is pretty simple, just check if the type is bytearray and get the bytes if it is

addresses issue: https://github.com/protocolbuffers/protobuf/issues/15911

Closes #16691

COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/16691 from jensbjorgensen:main 6249e629d7
PiperOrigin-RevId: 642623917
pull/17120/head
jensbjorgensen 8 months ago committed by Copybara-Service
parent 41315fd37f
commit eb67a91cac
  1. 13
      python/google/protobuf/internal/message_test.py
  2. 3
      python/message.c

@ -82,6 +82,19 @@ class MessageTest(unittest.TestCase):
golden_copy = copy.deepcopy(golden_message)
self.assertEqual(golden_data, golden_copy.SerializeToString())
def testGoldenMessageBytearray(self, message_module):
# bytearray was broken, test that it works again
if message_module is unittest_pb2:
golden_data = test_util.GoldenFileData('golden_message_oneof_implemented')
else:
golden_data = test_util.GoldenFileData('golden_message_proto3')
golden_message = message_module.TestAllTypes()
golden_message.ParseFromString(bytearray(golden_data))
if message_module is unittest_pb2:
test_util.ExpectAllFieldsSet(self, golden_message)
self.assertEqual(golden_data, golden_message.SerializeToString())
def testGoldenPackedMessage(self, message_module):
golden_data = test_util.GoldenFileData('golden_packed_fields_message')
golden_message = message_module.TestPackedTypes()

@ -1329,6 +1329,9 @@ PyObject* PyUpb_Message_MergeFromString(PyObject* _self, PyObject* arg) {
int err = PyBytes_AsStringAndSize(bytes, &buf, &size);
(void)err;
assert(err >= 0);
} else if (PyByteArray_Check(arg)) {
buf = PyByteArray_AS_STRING(arg);
size = PyByteArray_GET_SIZE(arg);
} else if (PyBytes_AsStringAndSize(arg, &buf, &size) < 0) {
return NULL;
}

Loading…
Cancel
Save