summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2012-05-15 05:09:31 (GMT)
committerBenjamin Peterson <benjamin@python.org>2012-05-15 05:09:31 (GMT)
commitd5a1c44455d969968f453f029727bfc45e4ce0a9 (patch)
tree98e91aa8130d600df0b1fdf329bbdc9d60d4b14c /Python/ceval.c
parentd91dc623791fd9973b914a57540d89cb986da7c9 (diff)
downloadcpython-d5a1c44455d969968f453f029727bfc45e4ce0a9.zip
cpython-d5a1c44455d969968f453f029727bfc45e4ce0a9.tar.gz
cpython-d5a1c44455d969968f453f029727bfc45e4ce0a9.tar.bz2
PEP 415: Implement suppression of __context__ display with an exception attribute
This replaces the original PEP 409 implementation. See #14133.
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index b9a006b..718bb32 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3572,23 +3572,26 @@ do_raise(PyObject *exc, PyObject *cause)
if (cause) {
PyObject *fixed_cause;
- int result;
if (PyExceptionClass_Check(cause)) {
fixed_cause = PyObject_CallObject(cause, NULL);
if (fixed_cause == NULL)
goto raise_error;
- Py_CLEAR(cause);
- } else {
- /* Let "exc.__cause__ = cause" handle all further checks */
+ Py_DECREF(cause);
+ }
+ else if (PyExceptionInstance_Check(cause)) {
fixed_cause = cause;
- cause = NULL; /* Steal the reference */
}
- /* We retain ownership of the reference to fixed_cause */
- result = _PyException_SetCauseChecked(value, fixed_cause);
- Py_DECREF(fixed_cause);
- if (result < 0) {
+ else if (cause == Py_None) {
+ Py_DECREF(cause);
+ fixed_cause = NULL;
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "exception causes must derive from "
+ "BaseException");
goto raise_error;
}
+ PyException_SetCause(value, fixed_cause);
}
PyErr_SetObject(type, value);