Commit adcd25e7 authored by Tim Peters's avatar Tim Peters

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.
parent de2acf65
...@@ -454,37 +454,30 @@ frame_clear(PyFrameObject *f) ...@@ -454,37 +454,30 @@ frame_clear(PyFrameObject *f)
PyObject **fastlocals, **p, **oldtop; PyObject **fastlocals, **p, **oldtop;
int i, slots; int i, slots;
oldtop = f->f_stacktop;
/* Before anything else, make sure that this frame is clearly marked /* 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; f->f_stacktop = NULL;
Py_XDECREF(f->f_exc_type); Py_CLEAR(f->f_exc_type);
f->f_exc_type = NULL; Py_CLEAR(f->f_exc_value);
Py_CLEAR(f->f_exc_traceback);
Py_XDECREF(f->f_exc_value); Py_CLEAR(f->f_trace);
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;
/* locals */ /* locals */
slots = f->f_nlocals + f->f_ncells + f->f_nfreevars; slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
fastlocals = f->f_localsplus; fastlocals = f->f_localsplus;
for (i = slots; --i >= 0; ++fastlocals) { for (i = slots; --i >= 0; ++fastlocals)
Py_CLEAR(*fastlocals); Py_CLEAR(*fastlocals);
}
/* stack */ /* stack */
if (oldtop != NULL) { if (oldtop != NULL) {
for (p = f->f_valuestack; p < oldtop; p++) { for (p = f->f_valuestack; p < oldtop; p++)
Py_CLEAR(*p); Py_CLEAR(*p);
} }
}
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment