summaryrefslogtreecommitdiff
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-12-10 23:49:33 +0000
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-12-10 23:49:33 +0000
commit10b24e87e5e5f0ac421ab91fe993baf6b6e319c7 (patch)
treeabbf514e3ca75b332f6684af517a5e6b2d65459c /Python/ceval.c
parentee763951dc56d4cdf0d39a12214bc1342fc3d93a (diff)
downloadcpython-git-10b24e87e5e5f0ac421ab91fe993baf6b6e319c7.tar.gz
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 ........
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index c394554000..84d18b3a3c 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2189,7 +2189,17 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
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 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Py_DECREF(v);
Py_DECREF(w);
}
- Py_DECREF(x);
PREDICT(END_FINALLY);
break;
}