static void dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values, Py_ssize_t deref, int clear) { Py_ssize_t j; for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = PyObject_GetItem(dict, key); if (value == NULL) PyErr_Clear(); if (deref) { if (value || clear) { if (PyCell_GET(values[j]) != value) { if (PyCell_Set(values[j], value) < 0) PyErr_Clear(); } } } else if (value != NULL || clear) { if (values[j] != value) { Py_XINCREF(value); Py_XDECREF(values[j]); values[j] = value; } } Py_XDECREF(value); } }
static void dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values, int deref, int clear) { Py_ssize_t j; assert(PyTuple_Check(map)); assert(PyDict_Check(dict)); assert(PyTuple_Size(map) >= nmap); for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = PyObject_GetItem(dict, key); assert(PyString_Check(key)); /* We only care about NULLs if clear is true. */ if (value == NULL) { PyErr_Clear(); if (!clear) continue; } if (deref) { assert(PyCell_Check(values[j])); if (PyCell_GET(values[j]) != value) { if (PyCell_Set(values[j], value) < 0) PyErr_Clear(); } } else if (values[j] != value) { Py_XINCREF(value); Py_XDECREF(values[j]); values[j] = value; } Py_XDECREF(value); } }