Commit 32acea18 authored by Jeremy Hylton's avatar Jeremy Hylton

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.
parent 50c08614
......@@ -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,19 +366,23 @@ 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_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;
}
}
}
}
void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment