diff Python/ceval.c @ 50104:48239f6209b0

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:49:33 +0000
parents ba8fe3a40a5b
children abf815b80b5d
line wrap: on
line diff
--- a/Python/ceval.c	Wed Dec 10 06:02:39 2008 +0000
+++ b/Python/ceval.c	Wed Dec 10 23:49:33 2008 +0000
@@ -2189,7 +2189,17 @@
 			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);
 				SET_TOP(PyLong_FromLong((long) WHY_SILENCED));
@@ -2197,7 +2207,6 @@
 				Py_DECREF(v);
 				Py_DECREF(w);
 			}
-			Py_DECREF(x);
 			PREDICT(END_FINALLY);
 			break;
 		}