Fix memory leak in dict_to_map(), SF bug [ #485152 ] memory leak in test_scope.
PyCell_Set() incremenets the reference count, so the earlier XINCREF causes a leak. Also make a number of small performance improvements to the code on the assumption that most of the time variables are not rebound across a FastToLocals() / LocalsToFast() pair. Replace uses of PyCell_Set() and PyCell_Get() with PyCell_SET() and PyCell_GET(), since the frame is guaranteed to contain cells.
This commit is contained in:
parent
7802a53e38
commit
1a48ca8c53
|
@ -345,12 +345,11 @@ map_to_dict(PyObject *map, int nmap, PyObject *dict, PyObject **values,
|
|||
{
|
||||
int j;
|
||||
for (j = nmap; --j >= 0; ) {
|
||||
PyObject *key = PyTuple_GetItem(map, j);
|
||||
PyObject *key = PyTuple_GET_ITEM(map, j);
|
||||
PyObject *value = values[j];
|
||||
if (deref)
|
||||
value = PyCell_GET(value);
|
||||
if (value == NULL) {
|
||||
PyErr_Clear();
|
||||
if (PyDict_DelItem(dict, key) != 0)
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
@ -367,17 +366,21 @@ dict_to_map(PyObject *map, int nmap, PyObject *dict, PyObject **values,
|
|||
{
|
||||
int j;
|
||||
for (j = nmap; --j >= 0; ) {
|
||||
PyObject *key = PyTuple_GetItem(map, j);
|
||||
PyObject *key = PyTuple_GET_ITEM(map, j);
|
||||
PyObject *value = PyDict_GetItem(dict, key);
|
||||
Py_XINCREF(value);
|
||||
if (deref) {
|
||||
if (value || clear) {
|
||||
if (PyCell_Set(values[j], value) < 0)
|
||||
PyErr_Clear();
|
||||
if (PyCell_GET(values[j]) != value) {
|
||||
if (PyCell_Set(values[j], value) < 0)
|
||||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
} else if (value != NULL || clear) {
|
||||
Py_XDECREF(values[j]);
|
||||
values[j] = value;
|
||||
if (values[j] != value) {
|
||||
Py_XINCREF(value);
|
||||
Py_XDECREF(values[j]);
|
||||
values[j] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue