|
@@ -1236,17 +1236,20 @@ int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs) {
|
|
const FieldDescriptor* value_descriptor =
|
|
const FieldDescriptor* value_descriptor =
|
|
descriptor->message_type()->FindFieldByName("value");
|
|
descriptor->message_type()->FindFieldByName("value");
|
|
if (value_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
|
|
if (value_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
|
|
- Py_ssize_t map_pos = 0;
|
|
|
|
- PyObject* map_key;
|
|
|
|
- PyObject* map_value;
|
|
|
|
- while (PyDict_Next(value, &map_pos, &map_key, &map_value)) {
|
|
|
|
- ScopedPyObjectPtr function_return;
|
|
|
|
- function_return.reset(PyObject_GetItem(map.get(), map_key));
|
|
|
|
- if (function_return.get() == NULL) {
|
|
|
|
|
|
+ ScopedPyObjectPtr iter(PyObject_GetIter(value));
|
|
|
|
+ if (iter == NULL) {
|
|
|
|
+ PyErr_Format(PyExc_TypeError, "Argument %s is not iterable", PyString_AsString(name));
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ ScopedPyObjectPtr next;
|
|
|
|
+ while ((next.reset(PyIter_Next(iter.get()))) != NULL) {
|
|
|
|
+ ScopedPyObjectPtr source_value(PyObject_GetItem(value, next.get()));
|
|
|
|
+ ScopedPyObjectPtr dest_value(PyObject_GetItem(map.get(), next.get()));
|
|
|
|
+ if (source_value.get() == NULL || dest_value.get() == NULL) {
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
ScopedPyObjectPtr ok(PyObject_CallMethod(
|
|
ScopedPyObjectPtr ok(PyObject_CallMethod(
|
|
- function_return.get(), "MergeFrom", "O", map_value));
|
|
|
|
|
|
+ dest_value.get(), "MergeFrom", "O", source_value.get()));
|
|
if (ok.get() == NULL) {
|
|
if (ok.get() == NULL) {
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|