diff Python/ceval.c @ 50106:59670b7b77a6 2.6

Merged revisions 67688 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r67688 | amaury.forgeotdarc | 2008-12-11 00:22:49 +0100 (jeu., 11 déc. 2008) | 6 lines #4559: When a context manager's __exit__() method returns an object whose conversion to bool raises an exception, 'with' loses that exception. Reviewed by Jeffrey Yasskin. Already ported to 2.5, will port to 2.6 and 3.0 ........
author Amaury Forgeot d'Arc <amauryfa@gmail.com>
date Wed, 10 Dec 2008 23:56:33 +0000
parents 30485bc17268
children 2f8c317dff17
line wrap: on
line diff
--- a/Python/ceval.c	Mon Dec 08 11:18:23 2008 +0000
+++ b/Python/ceval.c	Wed Dec 10 23:56:33 2008 +0000
@@ -2337,11 +2337,20 @@
 			/* XXX Not the fastest way to call it... */
 			x = PyObject_CallFunctionObjArgs(exit_func, u, v, w,
 							 NULL);
-			if (x == NULL) {
-				Py_DECREF(exit_func);
+			Py_DECREF(exit_func);
+			if (x == NULL)
 				break; /* Go to error exit */
-			}
-			if (u != Py_None && PyObject_IsTrue(x)) {
+
+			if (u != Py_None)
+				err = PyObject_IsTrue(x);
+			else
+				err = 0;
+			Py_DECREF(x);
+
+			if (err < 0)
+				break; /* Go to error exit */
+			else if (err > 0) {
+				err = 0;
 				/* There was an exception and a true return */
 				STACKADJ(-2);
 				Py_INCREF(Py_None);
@@ -2353,8 +2362,6 @@
 				/* The stack was rearranged to remove EXIT
 				   above. Let END_FINALLY do its thing */
 			}
-			Py_DECREF(x);
-			Py_DECREF(exit_func);
 			PREDICT(END_FINALLY);
 			break;
 		}