aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-05-05 17:07:41 +0200
committerGitHub <noreply@github.com>2020-05-05 17:07:41 +0200
commitb0be6b3b94fbdf31b796adc19dc86a04a52b03e1 (patch)
tree72efb7493602da4318a06510379ceeaae5076bcd /Objects/exceptions.c
parentbpo-40513: Per-interpreter recursion_limit (GH-19929) (diff)
downloadcpython-b0be6b3b94fbdf31b796adc19dc86a04a52b03e1.tar.gz
cpython-b0be6b3b94fbdf31b796adc19dc86a04a52b03e1.tar.bz2
cpython-b0be6b3b94fbdf31b796adc19dc86a04a52b03e1.zip
bpo-29587: _PyErr_ChainExceptions() checks exception (GH-19902)
_PyErr_ChainExceptions() now ensures that the first parameter is an exception type, as done by _PyErr_SetObject(). * The following function now check PyExceptionInstance_Check() in an assertion using a new _PyBaseExceptionObject_cast() helper function: * PyException_GetTraceback(), PyException_SetTraceback() * PyException_GetCause(), PyException_SetCause() * PyException_GetContext(), PyException_SetContext() * PyExceptionClass_Name() now checks PyExceptionClass_Check() with an assertion. * Remove XXX comment and add gi_exc_state variable to _gen_throw(). * Remove comment from test_generators
Diffstat (limited to 'Objects/exceptions.c')
-rw-r--r--Objects/exceptions.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index ca917b436c4..db5e3da12b0 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -304,22 +304,33 @@ static PyGetSetDef BaseException_getset[] = {
};
+static inline PyBaseExceptionObject*
+_PyBaseExceptionObject_cast(PyObject *exc)
+{
+ assert(PyExceptionInstance_Check(exc));
+ return (PyBaseExceptionObject *)exc;
+}
+
+
PyObject *
-PyException_GetTraceback(PyObject *self) {
- PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
+PyException_GetTraceback(PyObject *self)
+{
+ PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self);
Py_XINCREF(base_self->traceback);
return base_self->traceback;
}
int
-PyException_SetTraceback(PyObject *self, PyObject *tb) {
- return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL);
+PyException_SetTraceback(PyObject *self, PyObject *tb)
+{
+ return BaseException_set_tb(_PyBaseExceptionObject_cast(self), tb, NULL);
}
PyObject *
-PyException_GetCause(PyObject *self) {
- PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
+PyException_GetCause(PyObject *self)
+{
+ PyObject *cause = _PyBaseExceptionObject_cast(self)->cause;
Py_XINCREF(cause);
return cause;
}
@@ -328,13 +339,15 @@ PyException_GetCause(PyObject *self) {
void
PyException_SetCause(PyObject *self, PyObject *cause)
{
- ((PyBaseExceptionObject *)self)->suppress_context = 1;
- Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
+ PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self);
+ base_self->suppress_context = 1;
+ Py_XSETREF(base_self->cause, cause);
}
PyObject *
-PyException_GetContext(PyObject *self) {
- PyObject *context = ((PyBaseExceptionObject *)self)->context;
+PyException_GetContext(PyObject *self)
+{
+ PyObject *context = _PyBaseExceptionObject_cast(self)->context;
Py_XINCREF(context);
return context;
}
@@ -343,7 +356,7 @@ PyException_GetContext(PyObject *self) {
void
PyException_SetContext(PyObject *self, PyObject *context)
{
- Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
+ Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context);
}
#undef PyExceptionClass_Name
@@ -351,6 +364,7 @@ PyException_SetContext(PyObject *self, PyObject *context)
const char *
PyExceptionClass_Name(PyObject *ob)
{
+ assert(PyExceptionClass_Check(ob));
return ((PyTypeObject*)ob)->tp_name;
}