[Python-checkins] r45414 - python/trunk/Objects/frameobject.c

tim.peters python-checkins at python.org
Sat Apr 15 05:30:09 CEST 2006


Author: tim.peters
Date: Sat Apr 15 05:30:08 2006
New Revision: 45414

Modified:
   python/trunk/Objects/frameobject.c
Log:
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.


Modified: python/trunk/Objects/frameobject.c
==============================================================================
--- python/trunk/Objects/frameobject.c	(original)
+++ python/trunk/Objects/frameobject.c	Sat Apr 15 05:30:08 2006
@@ -454,36 +454,29 @@
 	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);
-		}
 	}
 }
 


More information about the Python-checkins mailing list