[Python-checkins] CVS: python/dist/src/Python ceval.c,2.230,2.231
Jeremy Hylton
jhylton@usw-pr-cvs1.sourceforge.net
Mon, 12 Mar 2001 17:58:24 -0800
Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv30486/Python
Modified Files:
ceval.c
Log Message:
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().
Index: ceval.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/ceval.c,v
retrieving revision 2.230
retrieving revision 2.231
diff -C2 -r2.230 -r2.231
*** ceval.c 2001/02/16 11:52:31 2.230
--- ceval.c 2001/03/13 01:58:21 2.231
***************
*** 431,435 ****
f = PyFrame_New(tstate, /*back*/
co, /*code*/
! globals, locals, closure);
if (f == NULL)
return NULL;
--- 431,435 ----
f = PyFrame_New(tstate, /*back*/
co, /*code*/
! globals, locals);
if (f == NULL)
return NULL;
***************
*** 579,584 ****
if (f->f_nfreevars) {
int i;
! for (i = 0; i < f->f_nfreevars; ++i)
! freevars[f->f_ncells + i] = PyTuple_GET_ITEM(closure, i);
}
--- 579,587 ----
if (f->f_nfreevars) {
int 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;
! }
}
***************
*** 1663,1667 ****
break;
}
- Py_INCREF(w);
PUSH(w);
break;
--- 1666,1669 ----
***************
*** 1671,1674 ****
--- 1673,1677 ----
x = freevars[oparg];
PyCell_Set(x, w);
+ Py_DECREF(w);
continue;