summaryrefslogtreecommitdiffstats
path: root/Objects/frameobject.c
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2001-03-13 01:58:22 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2001-03-13 01:58:22 (GMT)
commit30c9f3991cfb6a8179ea5dcf15fe17030dfbad05 (patch)
tree21d647853b4e5d0c71bbfd9a9a27ad51e967c90c /Objects/frameobject.c
parent93fe96a3c82b11b2bccef29d1f4a422a945e4cdd (diff)
downloadcpython-30c9f3991cfb6a8179ea5dcf15fe17030dfbad05.zip
cpython-30c9f3991cfb6a8179ea5dcf15fe17030dfbad05.tar.gz
cpython-30c9f3991cfb6a8179ea5dcf15fe17030dfbad05.tar.bz2
Variety of small INC/DECREF patches that fix reported memory leaks
with free variables. Thanks to Martin v. Loewis for finding two of the problems. This fixes SF buf 405583. There is also a C API change: PyFrame_New() is reverting to its pre-2.1 signature. The change introduced by nested scopes was a mistake. XXX Is this okay between beta releases? cell_clear(), the GC helper, must decref its reference to break cycles. frame_dealloc() must dealloc all cell vars and free vars in addition to locals. eval_code2() setup code must INCREF cells it copies out of the closure. The STORE_DEREF opcode implementation must DECREF the object it passes to PyCell_Set().
Diffstat (limited to 'Objects/frameobject.c')
-rw-r--r--Objects/frameobject.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 18fb0b0..a5300d1 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -65,13 +65,14 @@ static PyFrameObject *free_list = NULL;
static void
frame_dealloc(PyFrameObject *f)
{
- int i;
+ int i, slots;
PyObject **fastlocals;
Py_TRASHCAN_SAFE_BEGIN(f)
/* Kill all local variables */
+ slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
fastlocals = f->f_localsplus;
- for (i = f->f_nlocals; --i >= 0; ++fastlocals) {
+ for (i = slots; --i >= 0; ++fastlocals) {
Py_XDECREF(*fastlocals);
}
@@ -108,7 +109,7 @@ PyTypeObject PyFrame_Type = {
PyFrameObject *
PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
- PyObject *locals, PyObject *closure)
+ PyObject *locals)
{
PyFrameObject *back = tstate->frame;
static PyObject *builtin_object;