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:
Jeremy Hylton 2001-12-06 15:48:16 +00:00
parent 7802a53e38
commit 1a48ca8c53
1 changed files with 11 additions and 8 deletions

View File

@ -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;
}
}
}
}