mirror of
https://github.com/python/cpython.git
synced 2025-07-27 21:24:32 +00: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:
parent
ffd42cf444
commit
ad9b5992e3
3 changed files with 46 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue