summaryrefslogtreecommitdiff
path: root/Objects/genobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-10-21 17:09:17 +0300
committerSerhiy Storchaka <storchaka@gmail.com>2016-10-21 17:09:17 +0300
commit467ab194fc6189d9f7310c89937c51abeac56839 (patch)
treeac2397959d646b3656fbf4759f4e6cb9d82e4ae6 /Objects/genobject.c
parentb0426cd8c4ecaa19cff05b4860da1c06531a77c1 (diff)
downloadcpython-git-467ab194fc6189d9f7310c89937c51abeac56839.tar.gz
Issue #28410: Added _PyErr_FormatFromCause() -- the helper for raising
new exception with setting current exception as __cause__. _PyErr_FormatFromCause(exception, format, args...) is equivalent to Python raise exception(format % args) from sys.exc_info()[1]
Diffstat (limited to 'Objects/genobject.c')
-rw-r--r--Objects/genobject.c32
1 files changed, 2 insertions, 30 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 7a1e9fd6ab..7bcf016c34 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -118,33 +118,6 @@ gen_dealloc(PyGenObject *gen)
PyObject_GC_Del(gen);
}
-static void
-gen_chain_runtime_error(const char *msg)
-{
- PyObject *exc, *val, *val2, *tb;
-
- /* TODO: This about rewriting using _PyErr_ChainExceptions. */
-
- PyErr_Fetch(&exc, &val, &tb);
- PyErr_NormalizeException(&exc, &val, &tb);
- if (tb != NULL) {
- PyException_SetTraceback(val, tb);
- }
-
- Py_DECREF(exc);
- Py_XDECREF(tb);
-
- PyErr_SetString(PyExc_RuntimeError, msg);
- PyErr_Fetch(&exc, &val2, &tb);
- PyErr_NormalizeException(&exc, &val2, &tb);
-
- Py_INCREF(val);
- PyException_SetCause(val2, val);
- PyException_SetContext(val2, val);
-
- PyErr_Restore(exc, val2, tb);
-}
-
static PyObject *
gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing)
{
@@ -276,8 +249,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing)
else if PyAsyncGen_CheckExact(gen) {
msg = "async generator raised StopIteration";
}
- /* Raise a RuntimeError */
- gen_chain_runtime_error(msg);
+ _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg);
}
else {
/* `gen` is an ordinary generator without
@@ -309,7 +281,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing)
raise a RuntimeError.
*/
const char *msg = "async generator raised StopAsyncIteration";
- gen_chain_runtime_error(msg);
+ _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg);
}
if (!result || f->f_stacktop == NULL) {