/* Copy pto_keywords with overlapping call keywords merged
* Note, tail is already coppied. */
Py_ssize_t pos = 0, i = 0;
- while (PyDict_Next(n_merges ? pto_kw_merged : pto->kw, &pos, &key, &val)) {
+ PyObject *keyword_dict = n_merges ? pto_kw_merged : pto->kw;
+ Py_BEGIN_CRITICAL_SECTION(keyword_dict);
+ while (PyDict_Next(keyword_dict, &pos, &key, &val)) {
assert(i < pto_nkwds);
PyTuple_SET_ITEM(tot_kwnames, i, Py_NewRef(key));
stack[tot_nargs + i] = val;
i++;
}
+ Py_END_CRITICAL_SECTION();
assert(i == pto_nkwds);
Py_XDECREF(pto_kw_merged);
}
}
/* Pack keyword arguments */
+ int error = 0;
+ Py_BEGIN_CRITICAL_SECTION(kw);
for (i = 0; PyDict_Next(kw, &i, &key, &value);) {
/* Prevent key.__str__ from deleting the value. */
Py_INCREF(value);
key, value));
Py_DECREF(value);
if (arglist == NULL) {
- goto done;
+ error = 1;
+ break;
}
}
+ Py_END_CRITICAL_SECTION();
+ if (error) {
+ goto done;
+ }
mod = PyType_GetModuleName(Py_TYPE(pto));
if (mod == NULL) {