mirror of
https://github.com/AdaCore/cpython.git
synced 2026-02-12 12:57:15 -08:00
#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
This commit is contained in:
@@ -2349,11 +2349,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);
|
||||
@@ -2365,8 +2374,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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user