diff options
author | Tim Peters <tim.peters@gmail.com> | 2006-04-15 03:30:08 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2006-04-15 03:30:08 (GMT) |
commit | adcd25e7facaf107bd2b94f33f6b9f818ab6a177 (patch) | |
tree | 2f040722f852b24bcb662108954f6efc4b1feb22 | |
parent | de2acf6512caeacd1ad53e55aa0528f65d1201c7 (diff) | |
download | cpython-adcd25e7facaf107bd2b94f33f6b9f818ab6a177.zip cpython-adcd25e7facaf107bd2b94f33f6b9f818ab6a177.tar.gz cpython-adcd25e7facaf107bd2b94f33f6b9f818ab6a177.tar.bz2 |
frame_clear(): Explain why it's important to make the frame
look dead right at the start. Use Py_CLEAR for four more
frame members.
-rw-r--r-- | Objects/frameobject.c | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 217f4ba..9aabc7a 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -454,36 +454,29 @@ frame_clear(PyFrameObject *f) PyObject **fastlocals, **p, **oldtop; int i, slots; - oldtop = f->f_stacktop; - /* Before anything else, make sure that this frame is clearly marked - as being defunct! */ + * as being defunct! Else, e.g., a generator reachable from this + * frame may also point to this frame, believe itself to still be + * active, and try cleaning up this frame again. + */ + oldtop = f->f_stacktop; f->f_stacktop = NULL; - Py_XDECREF(f->f_exc_type); - f->f_exc_type = NULL; - - Py_XDECREF(f->f_exc_value); - f->f_exc_value = NULL; - - Py_XDECREF(f->f_exc_traceback); - f->f_exc_traceback = NULL; - - Py_XDECREF(f->f_trace); - f->f_trace = NULL; + Py_CLEAR(f->f_exc_type); + Py_CLEAR(f->f_exc_value); + Py_CLEAR(f->f_exc_traceback); + Py_CLEAR(f->f_trace); /* locals */ slots = f->f_nlocals + f->f_ncells + f->f_nfreevars; fastlocals = f->f_localsplus; - for (i = slots; --i >= 0; ++fastlocals) { + for (i = slots; --i >= 0; ++fastlocals) Py_CLEAR(*fastlocals); - } /* stack */ if (oldtop != NULL) { - for (p = f->f_valuestack; p < oldtop; p++) { + for (p = f->f_valuestack; p < oldtop; p++) Py_CLEAR(*p); - } } } |