summaryrefslogtreecommitdiff
path: root/Objects/exceptions.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/exceptions.c')
-rw-r--r--Objects/exceptions.c66
1 files changed, 57 insertions, 9 deletions
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index 418bffb0a0..9258ace50a 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -250,11 +250,67 @@ BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
return 0;
}
+static PyObject *
+BaseException_get_context(PyObject *self) {
+ PyObject *res = PyException_GetContext(self);
+ if (res) return res; /* new reference already returned above */
+ Py_RETURN_NONE;
+}
+
+static int
+BaseException_set_context(PyObject *self, PyObject *arg) {
+ if (arg == NULL) {
+ PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
+ return -1;
+ } else if (arg == Py_None) {
+ arg = NULL;
+ } else if (!PyExceptionInstance_Check(arg)) {
+ PyErr_SetString(PyExc_TypeError, "exception context must be None "
+ "or derive from BaseException");
+ return -1;
+ } else {
+ /* PyException_SetContext steals this reference */
+ Py_INCREF(arg);
+ }
+ PyException_SetContext(self, arg);
+ return 0;
+}
+
+static PyObject *
+BaseException_get_cause(PyObject *self) {
+ PyObject *res = PyException_GetCause(self);
+ if (res) return res; /* new reference already returned above */
+ Py_RETURN_NONE;
+}
+
+static int
+BaseException_set_cause(PyObject *self, PyObject *arg) {
+ if (arg == NULL) {
+ PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
+ return -1;
+ } else if (arg == Py_None) {
+ arg = NULL;
+ } else if (!PyExceptionInstance_Check(arg)) {
+ PyErr_SetString(PyExc_TypeError, "exception cause must be None "
+ "or derive from BaseException");
+ return -1;
+ } else {
+ /* PyException_SetCause steals this reference */
+ Py_INCREF(arg);
+ }
+ PyException_SetCause(self, arg);
+ return 0;
+}
+
static PyGetSetDef BaseException_getset[] = {
{"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
{"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
{"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
+ {"__context__", (getter)BaseException_get_context,
+ (setter)BaseException_set_context, PyDoc_STR("exception context")},
+ {"__cause__", (getter)BaseException_get_cause,
+ (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
{NULL},
};
@@ -303,14 +359,6 @@ PyException_SetContext(PyObject *self, PyObject *context) {
}
-static PyMemberDef BaseException_members[] = {
- {"__context__", T_OBJECT, offsetof(PyBaseExceptionObject, context), 0,
- PyDoc_STR("exception context")},
- {"__cause__", T_OBJECT, offsetof(PyBaseExceptionObject, cause), 0,
- PyDoc_STR("exception cause")},
- {NULL} /* Sentinel */
-};
-
static PyTypeObject _PyExc_BaseException = {
PyVarObject_HEAD_INIT(NULL, 0)
"BaseException", /*tp_name*/
@@ -341,7 +389,7 @@ static PyTypeObject _PyExc_BaseException = {
0, /* tp_iter */
0, /* tp_iternext */
BaseException_methods, /* tp_methods */
- BaseException_members, /* tp_members */
+ 0, /* tp_members */
BaseException_getset, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */