]> granicus.if.org Git - python/commitdiff
Fix memory leak in dict_to_map(), SF bug [ #485152 ] memory leak in test_scope.
authorJeremy Hylton <jeremy@alum.mit.edu>
Thu, 6 Dec 2001 15:48:16 +0000 (15:48 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Thu, 6 Dec 2001 15:48:16 +0000 (15:48 +0000)
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.

Objects/frameobject.c

index e092ce62408db7f60b290bb562a4edc32bf8513a..cf3d73ac929481c03a52d2089ff186b8c2bac58a 100644 (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;
+                       }
                }
        }
 }