Fix for SF bug [ #492403 ] exec() segfaults on closure's func_code

Based on the patch from Danny Yoo.  The fix is in exec_statement() in
ceval.c.

There are also changes to introduce use of PyCode_GetNumFree() in
several places.
This commit is contained in:
Jeremy Hylton 2001-12-13 19:51:56 +00:00
parent 3095a4c228
commit 733c8935f9
3 changed files with 10 additions and 5 deletions

View file

@ -2273,7 +2273,7 @@ com_and_test(struct compiling *c, node *n)
static int
com_make_closure(struct compiling *c, PyCodeObject *co)
{
int i, free = PyTuple_GET_SIZE(co->co_freevars);
int i, free = PyCode_GetNumFree(co);
if (free == 0)
return 0;
for (i = 0; i < free; ++i) {
@ -2333,7 +2333,7 @@ com_test(struct compiling *c, node *n)
com_push(c, 1);
if (closure) {
com_addoparg(c, MAKE_CLOSURE, ndefs);
com_pop(c, PyTuple_GET_SIZE(co->co_freevars));
com_pop(c, PyCode_GetNumFree(co));
} else
com_addoparg(c, MAKE_FUNCTION, ndefs);
Py_DECREF(co);
@ -3590,7 +3590,7 @@ com_classdef(struct compiling *c, node *n)
com_push(c, 1);
if (closure) {
com_addoparg(c, MAKE_CLOSURE, 0);
com_pop(c, PyTuple_GET_SIZE(co->co_freevars));
com_pop(c, PyCode_GetNumFree(co));
} else
com_addoparg(c, MAKE_FUNCTION, 0);
com_addoparg(c, CALL_FUNCTION, 0);