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().
This commit is contained in:
Jeremy Hylton 2001-03-13 01:58:22 +00:00
parent 93fe96a3c8
commit 30c9f3991c
5 changed files with 13 additions and 12 deletions

View file

@ -430,7 +430,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
f = PyFrame_New(tstate, /*back*/
co, /*code*/
globals, locals, closure);
globals, locals);
if (f == NULL)
return NULL;
@ -578,8 +578,11 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
}
if (f->f_nfreevars) {
int i;
for (i = 0; i < f->f_nfreevars; ++i)
freevars[f->f_ncells + i] = PyTuple_GET_ITEM(closure, i);
for (i = 0; i < f->f_nfreevars; ++i) {
PyObject *o = PyTuple_GET_ITEM(closure, i);
Py_INCREF(o);
freevars[f->f_ncells + i] = o;
}
}
if (tstate->sys_tracefunc != NULL) {
@ -1662,7 +1665,6 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
err = -1;
break;
}
Py_INCREF(w);
PUSH(w);
break;
@ -1670,6 +1672,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
w = POP();
x = freevars[oparg];
PyCell_Set(x, w);
Py_DECREF(w);
continue;
case BUILD_TUPLE: