@@ -447,16 +447,18 @@ static bool PyUpb_Message_InitRepeatedAttribute(PyObject* _self, PyObject* name,
447
447
return ok ;
448
448
}
449
449
450
+ static PyObject * PyUpb_Message_MergePartialFrom (PyObject * , PyObject * );
451
+
450
452
static bool PyUpb_Message_InitMessageAttribute (PyObject * _self , PyObject * name ,
451
453
PyObject * value ) {
452
454
PyObject * submsg = PyUpb_Message_GetAttr (_self , name );
453
455
if (!submsg ) return -1 ;
454
456
assert (!PyErr_Occurred ());
455
457
bool ok ;
456
458
if (PyUpb_Message_TryCheck (value )) {
457
- PyObject * tmp = PyUpb_Message_MergeFrom (submsg , value );
459
+ PyObject * tmp = PyUpb_Message_MergePartialFrom (submsg , value );
458
460
ok = tmp != NULL ;
459
- Py_DECREF (tmp );
461
+ Py_XDECREF (tmp );
460
462
} else if (PyDict_Check (value )) {
461
463
assert (!PyErr_Occurred ());
462
464
ok = PyUpb_Message_InitAttributes (submsg , NULL , value ) >= 0 ;
@@ -1184,7 +1186,8 @@ static PyObject* PyUpb_Message_ListFields(PyObject* _self, PyObject* arg) {
1184
1186
return NULL ;
1185
1187
}
1186
1188
1187
- PyObject * PyUpb_Message_MergeFrom (PyObject * self , PyObject * arg ) {
1189
+ static PyObject * PyUpb_Message_MergeInternal (PyObject * self , PyObject * arg ,
1190
+ bool check_required ) {
1188
1191
if (self -> ob_type != arg -> ob_type ) {
1189
1192
PyErr_Format (PyExc_TypeError ,
1190
1193
"Parameter to MergeFrom() must be instance of same class: "
@@ -1194,7 +1197,10 @@ PyObject* PyUpb_Message_MergeFrom(PyObject* self, PyObject* arg) {
1194
1197
}
1195
1198
// OPT: exit if src is empty.
1196
1199
PyObject * subargs = PyTuple_New (0 );
1197
- PyObject * serialized = PyUpb_Message_SerializeToString (arg , subargs , NULL );
1200
+ PyObject * serialized =
1201
+ check_required
1202
+ ? PyUpb_Message_SerializeToString (arg , subargs , NULL )
1203
+ : PyUpb_Message_SerializePartialToString (arg , subargs , NULL );
1198
1204
Py_DECREF (subargs );
1199
1205
if (!serialized ) return NULL ;
1200
1206
PyObject * ret = PyUpb_Message_MergeFromString (self , serialized );
@@ -1203,6 +1209,14 @@ PyObject* PyUpb_Message_MergeFrom(PyObject* self, PyObject* arg) {
1203
1209
Py_RETURN_NONE ;
1204
1210
}
1205
1211
1212
+ PyObject * PyUpb_Message_MergeFrom (PyObject * self , PyObject * arg ) {
1213
+ return PyUpb_Message_MergeInternal (self , arg , true);
1214
+ }
1215
+
1216
+ static PyObject * PyUpb_Message_MergePartialFrom (PyObject * self , PyObject * arg ) {
1217
+ return PyUpb_Message_MergeInternal (self , arg , false);
1218
+ }
1219
+
1206
1220
static PyObject * PyUpb_Message_SetInParent (PyObject * _self , PyObject * arg ) {
1207
1221
PyUpb_Message * self = (void * )_self ;
1208
1222
PyUpb_Message_EnsureReified (self );
0 commit comments