summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-12-10 23:56:33 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-12-10 23:56:33 (GMT)
commit79c9f76629009ad8f014873437431087832e47d1 (patch)
treeb48400a62ef2bdb12987b77a56f65e87836d8bbe /Python
parentc9d4efdf486d498ba138195796645f201100b699 (diff)
downloadcpython-79c9f76629009ad8f014873437431087832e47d1.zip
cpython-79c9f76629009ad8f014873437431087832e47d1.tar.gz
cpython-79c9f76629009ad8f014873437431087832e47d1.tar.bz2
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')
-rw-r--r--Python/ceval.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 6eef7ef..dd1e171 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2337,11 +2337,20 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
/* 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 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
/* 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;
}