summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2006-04-15 03:30:08 (GMT)
committerTim Peters <tim.peters@gmail.com>2006-04-15 03:30:08 (GMT)
commitadcd25e7facaf107bd2b94f33f6b9f818ab6a177 (patch)
tree2f040722f852b24bcb662108954f6efc4b1feb22
parentde2acf6512caeacd1ad53e55aa0528f65d1201c7 (diff)
downloadcpython-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.c29
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);
- }
}
}