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
........
This commit is contained in:
Amaury Forgeot d'Arc 2008-12-10 23:49:33 +00:00
parent ee763951dc
commit 10b24e87e5
3 changed files with 44 additions and 2 deletions

View file

@ -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;
}