Mercurial > cpython-lru_cache-weakref
diff Python/symtable.c @ 16753:51977af230fa legacy-trunk
Fix for bug 133489: compiler leaks memory
Two different but related problems:
1. PySymtable_Free() must explicitly DECREF(st->st_cur), which should
always point to the global symtable entry. This entry is setup by the
first enter_scope() call, but there is never a corresponding
exit_scope() call.
Since each entry has a reference to scopes defined within it, the
missing DECREF caused all symtable entries to be leaked.
2. The leak here masked a separate problem with
PySymtableEntry_New(). When the requested entry was found in
st->st_symbols, the entry was returned without doing an INCREF.
And problem c) The ste_children slot was getting two copies of each
child entry, because it was populating the slot on the first and
second passes. Now only populate on the first pass.
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Fri, 23 Feb 2001 17:55:27 +0000 |
| parents | a47d93ef103a |
| children | 5a1230de436a |
line wrap: on
line diff
--- a/Python/symtable.c Fri Feb 23 16:46:39 2001 +0000 +++ b/Python/symtable.c Fri Feb 23 17:55:27 2001 +0000 @@ -13,8 +13,10 @@ if (k == NULL) goto fail; v = PyDict_GetItem(st->st_symbols, k); - if (v) /* XXX could check that name, type, lineno match */ - return v; + if (v) /* XXX could check that name, type, lineno match */ { + Py_INCREF(v); + return v; + } ste = (PySymtableEntryObject *)PyObject_New(PySymtableEntryObject, &PySymtableEntry_Type); @@ -69,7 +71,7 @@ if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0) goto fail; - + return (PyObject *)ste; fail: Py_XDECREF(ste);
