3#ifndef __NUITKA_EXCEPTION_GROUPS_H__
4#define __NUITKA_EXCEPTION_GROUPS_H__
8#if PYTHON_VERSION >= 0x3b0
10NUITKA_MAY_BE_UNUSED
static void FORMAT_CLASS_CATCH_ERROR(PyThreadState *tstate) {
11 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
12 "catching classes that do not inherit from BaseException is not allowed");
15NUITKA_MAY_BE_UNUSED
static int CHECK_EXCEPTION_TYPE_VALID(PyThreadState *tstate, PyObject *right) {
16 if (PyTuple_Check(right)) {
17 Py_ssize_t length = PyTuple_GET_SIZE(right);
19 for (Py_ssize_t i = 0; i < length; i++) {
20 PyObject *exc = PyTuple_GET_ITEM(right, i);
22 if (!PyExceptionClass_Check(exc)) {
23 FORMAT_CLASS_CATCH_ERROR(tstate);
28 if (!PyExceptionClass_Check(right)) {
29 FORMAT_CLASS_CATCH_ERROR(tstate);
36NUITKA_MAY_BE_UNUSED
static int CHECK_EXCEPTION_STAR_VALID(PyThreadState *tstate, PyObject *right) {
37 if (CHECK_EXCEPTION_TYPE_VALID(tstate, right) < 0) {
46 if (PyTuple_Check(right)) {
47 Py_ssize_t length = PyTuple_GET_SIZE(right);
49 for (Py_ssize_t i = 0; i < length; i++) {
50 PyObject *exc = PyTuple_GET_ITEM(right, i);
51 is_subclass = PyObject_IsSubclass(exc, PyExc_BaseExceptionGroup);
53 if (is_subclass < 0) {
62 is_subclass = PyObject_IsSubclass(right, PyExc_BaseExceptionGroup);
64 if (is_subclass < 0) {
70 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
71 "catching ExceptionGroup with except* is not allowed. Use except instead.");
78NUITKA_MAY_BE_UNUSED
static int EXCEPTION_GROUP_MATCH(PyThreadState *tstate, PyObject *exc_value, PyObject *match_type,
79 PyObject **match, PyObject **rest) {
81 if (exc_value == Py_None) {
83 Py_INCREF_IMMORTAL(*match);
85 Py_INCREF_IMMORTAL(*rest);
91 assert(PyExceptionInstance_Check(exc_value));
93 if (PyErr_GivenExceptionMatches(exc_value, match_type)) {
94 bool is_exception_group = _PyBaseExceptionGroup_Check(exc_value);
96 if (is_exception_group) {
101 PyObject *exception_tuple = MAKE_TUPLE1_0(tstate, exc_value);
102 PyObject *wrapped = _PyExc_CreateExceptionGroup(
"", exception_tuple);
103 Py_DECREF(exception_tuple);
105 if (unlikely(wrapped == NULL)) {
113 Py_INCREF_IMMORTAL(*rest);
120 if (_PyBaseExceptionGroup_Check(exc_value)) {
121 PyObject *pair = CALL_METHOD_WITH_SINGLE_ARG(tstate, exc_value, const_str_plain_split, match_type);
129 assert(PyTuple_CheckExact(pair));
130 assert(PyTuple_GET_SIZE(pair) == 2);
132 *match = PyTuple_GET_ITEM(pair, 0);
135 *rest = PyTuple_GET_ITEM(pair, 1);
143 Py_INCREF_IMMORTAL(*match);
146 Py_INCREF_IMMORTAL(*rest);