3#ifndef __NUITKA_EXCEPTIONS_H__
4#define __NUITKA_EXCEPTIONS_H__
9#include "nuitka/checkers.h"
10#include "nuitka/constants.h"
11#include "nuitka/printing.h"
14NUITKA_MAY_BE_UNUSED
static inline bool HAS_ERROR_OCCURRED(PyThreadState
const *tstate) {
15#if PYTHON_VERSION < 0x3c0
16 return tstate->curexc_type != NULL;
18 return tstate->current_exception != NULL;
23NUITKA_MAY_BE_UNUSED
static inline PyObject *GET_ERROR_OCCURRED(PyThreadState
const *
const tstate) {
24#if PYTHON_VERSION < 0x3c0
25 return tstate->curexc_type;
27 return tstate->current_exception ? (PyObject *)PyExceptionInstance_Class(tstate->current_exception) : NULL;
32NUITKA_MAY_BE_UNUSED
static inline void ASSERT_NORMALIZED_EXCEPTION_VALUE_X(PyObject
const *
const exception_value) {
33 CHECK_OBJECT_X(exception_value);
34 assert(exception_value == NULL || PyExceptionInstance_Check(exception_value));
38NUITKA_MAY_BE_UNUSED
static inline void ASSERT_NORMALIZED_EXCEPTION_VALUE(PyObject *exception_value) {
39 CHECK_OBJECT(exception_value);
40 assert(PyExceptionInstance_Check(exception_value));
44NUITKA_MAY_BE_UNUSED
static inline void CLEAR_ERROR_OCCURRED(PyThreadState *tstate) {
45#if PYTHON_VERSION < 0x3c0
46 PyObject *old_type = tstate->curexc_type;
47 PyObject *old_value = tstate->curexc_value;
48 PyObject *old_tb = tstate->curexc_traceback;
50 tstate->curexc_type = NULL;
51 tstate->curexc_value = NULL;
52 tstate->curexc_traceback = NULL;
55 Py_XDECREF(old_value);
58 PyObject *old_exception_value = tstate->current_exception;
59 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
61 tstate->current_exception = NULL;
63 Py_XDECREF(old_exception_value);
68NUITKA_MAY_BE_UNUSED
static inline bool DROP_ERROR_OCCURRED(PyThreadState *tstate) {
70#if PYTHON_VERSION < 0x3c0
71 if (unlikely(tstate->curexc_type != NULL)) {
72 PyObject *old_type = tstate->curexc_type;
73 PyObject *old_value = tstate->curexc_value;
74 PyObject *old_tb = tstate->curexc_traceback;
76 tstate->curexc_type = NULL;
77 tstate->curexc_value = NULL;
78 tstate->curexc_traceback = NULL;
81 Py_XDECREF(old_value);
87 if (unlikely(tstate->current_exception != NULL)) {
88 PyObject *old_exception_value = tstate->current_exception;
89 ASSERT_NORMALIZED_EXCEPTION_VALUE(old_exception_value);
91 tstate->current_exception = NULL;
93 Py_DECREF(old_exception_value);
101#if PYTHON_VERSION < 0x3c0
103NUITKA_MAY_BE_UNUSED
static void FETCH_ERROR_OCCURRED(PyThreadState *tstate, PyObject **exception_type,
104 PyObject **exception_value,
105 PyTracebackObject **exception_traceback) {
106 *exception_type = tstate->curexc_type;
107 *exception_value = tstate->curexc_value;
108 *exception_traceback = (PyTracebackObject *)tstate->curexc_traceback;
111 PRINT_STRING(
"FETCH_ERROR_OCCURRED:\n");
112 PRINT_CURRENT_EXCEPTION();
115 tstate->curexc_type = NULL;
116 tstate->curexc_value = NULL;
117 tstate->curexc_traceback = NULL;
121NUITKA_MAY_BE_UNUSED
static void FETCH_ERROR_OCCURRED_UNTRACED(PyThreadState *tstate, PyObject **exception_type,
122 PyObject **exception_value,
123 PyTracebackObject **exception_traceback) {
124 *exception_type = tstate->curexc_type;
125 *exception_value = tstate->curexc_value;
126 *exception_traceback = (PyTracebackObject *)tstate->curexc_traceback;
128 tstate->curexc_type = NULL;
129 tstate->curexc_value = NULL;
130 tstate->curexc_traceback = NULL;
133NUITKA_MAY_BE_UNUSED
static void RESTORE_ERROR_OCCURRED(PyThreadState *tstate, PyObject *exception_type,
134 PyObject *exception_value,
135 PyTracebackObject *exception_traceback) {
136 PyObject *old_exception_type = tstate->curexc_type;
137 PyObject *old_exception_value = tstate->curexc_value;
138 PyObject *old_exception_traceback = tstate->curexc_traceback;
140 tstate->curexc_type = exception_type;
141 tstate->curexc_value = exception_value;
142 tstate->curexc_traceback = (PyObject *)exception_traceback;
145 PRINT_STRING(
"RESTORE_ERROR_OCCURRED:\n");
146 PRINT_CURRENT_EXCEPTION();
149 Py_XDECREF(old_exception_type);
150 Py_XDECREF(old_exception_value);
151 Py_XDECREF(old_exception_traceback);
154NUITKA_MAY_BE_UNUSED
static void RESTORE_ERROR_OCCURRED_UNTRACED(PyThreadState *tstate, PyObject *exception_type,
155 PyObject *exception_value,
156 PyTracebackObject *exception_traceback) {
157 PyObject *old_exception_type = tstate->curexc_type;
158 PyObject *old_exception_value = tstate->curexc_value;
159 PyObject *old_exception_traceback = tstate->curexc_traceback;
161 tstate->curexc_type = exception_type;
162 tstate->curexc_value = exception_value;
163 tstate->curexc_traceback = (PyObject *)exception_traceback;
165 Py_XDECREF(old_exception_type);
166 Py_XDECREF(old_exception_value);
167 Py_XDECREF(old_exception_traceback);
173extern PyTracebackObject *MAKE_TRACEBACK(
struct Nuitka_FrameObject *frame,
int lineno);
176NUITKA_MAY_BE_UNUSED
static PyTracebackObject *ADD_TRACEBACK(PyTracebackObject *exception_tb,
178 CHECK_OBJECT(exception_tb);
181 PyTracebackObject *traceback_new = MAKE_TRACEBACK(frame, lineno);
182 traceback_new->tb_next = exception_tb;
183 Py_INCREF(exception_tb);
184 return traceback_new;
190#if PYTHON_VERSION < 0x370
191#define EXC_TYPE(x) (x->exc_type)
192#define EXC_VALUE(x) (x->exc_value)
193#define EXC_TRACEBACK(x) ((PyTracebackObject *)(x->exc_traceback))
194#define EXC_TRACEBACK_PTR(x) ((PyTracebackObject **)(&x->exc_traceback))
195#define SET_EXC_TRACEBACK(x, tb) x->exc_traceback = (PyObject *)tb
196#elif PYTHON_VERSION < 0x3b0
197#define EXC_TYPE(x) (x->exc_state.exc_type)
198#define EXC_VALUE(x) (x->exc_state.exc_value)
199#define EXC_TRACEBACK(x) ((PyTracebackObject *)(x->exc_state.exc_traceback))
200#define EXC_TRACEBACK_PTR(x) ((PyTracebackObject **)(&x->exc_state.exc_traceback))
201#define SET_EXC_TRACEBACK(x, tb) x->exc_state.exc_traceback = (PyObject *)tb
203#define EXC_TYPE(x) ((PyObject *)Py_TYPE(x->exc_state.exc_value))
204#define EXC_VALUE(x) (x->exc_state.exc_value)
207#if PYTHON_VERSION < 0x370
208#define EXC_TYPE_F(x) (x->m_frame->m_frame.f_exc_type)
209#define EXC_VALUE_F(x) (x->m_frame->m_frame.f_exc_value)
210#define EXC_TRACEBACK_F(x) (x->m_frame->m_frame.f_exc_traceback)
211#define ASSIGN_EXC_TRACEBACK_F(x, tb) x->m_frame->m_frame.f_exc_traceback = (PyObject *)(tb)
212#elif PYTHON_VERSION < 0x3b0
213#define EXC_TYPE_F(x) (x->m_exc_state.exception_type)
214#define EXC_VALUE_F(x) (x->m_exc_state.exception_value)
215#define EXC_TRACEBACK_F(x) (x->m_exc_state.exception_tb)
216#define ASSIGN_EXC_TRACEBACK_F(x, tb) x->m_exc_state.exception_tb = (PyTracebackObject *)(tb)
218#define EXC_VALUE_F(x) (x->m_exc_state.exception_value)
221#if PYTHON_VERSION < 0x3b0
223 PyObject *exception_type;
224 PyObject *exception_value;
225 PyTracebackObject *exception_tb;
228#if defined(__cplusplus)
231#define Nuitka_ExceptionStackItem_Empty \
232 (struct Nuitka_ExceptionStackItem) { .exception_type = NULL, .exception_value = NULL, .exception_tb = NULL }
236 PyObject *exception_value;
239#if defined(__cplusplus)
242#define Nuitka_ExceptionStackItem_Empty \
243 (struct Nuitka_ExceptionStackItem) { .exception_value = NULL }
251#if PYTHON_VERSION < 0x3b0
252 result.exception_type = EXC_TYPE(tstate);
253 Py_XINCREF(result.exception_type);
255 result.exception_value = EXC_VALUE(tstate);
256 Py_XINCREF(result.exception_value);
257#if PYTHON_VERSION < 0x3b0
258 result.exception_tb = (PyTracebackObject *)EXC_TRACEBACK(tstate);
259 Py_XINCREF(result.exception_tb);
265#if PYTHON_VERSION < 0x300 && !defined(_NUITKA_EXPERIMENTAL_DISABLE_SYS_EXC_VARS)
266#define _NUITKA_MAINTAIN_SYS_EXC_VARS 1
271NUITKA_MAY_BE_UNUSED
inline static void SET_CURRENT_EXCEPTION(PyThreadState *tstate,
273#if PYTHON_VERSION < 0x3b0
274 CHECK_OBJECT_X(exc_state->exception_type);
276 CHECK_OBJECT_X(exc_state->exception_value);
277#if PYTHON_VERSION < 0x3b0
278 CHECK_OBJECT_X(exc_state->exception_tb);
281#if PYTHON_VERSION < 0x3b0
282 PyObject *old_type = EXC_TYPE(tstate);
284 PyObject *old_value = EXC_VALUE(tstate);
285#if PYTHON_VERSION < 0x3b0
286 PyTracebackObject *old_tb = EXC_TRACEBACK(tstate);
289#if PYTHON_VERSION < 0x3b0
290 CHECK_OBJECT_X(old_type);
292 CHECK_OBJECT_X(old_value);
293#if PYTHON_VERSION < 0x3b0
294 CHECK_OBJECT_X(old_tb);
297#if PYTHON_VERSION < 0x3b0
298 EXC_TYPE(tstate) = exc_state->exception_type;
300 EXC_VALUE(tstate) = exc_state->exception_value;
301#if PYTHON_VERSION < 0x3b0
302 SET_EXC_TRACEBACK(tstate, exc_state->exception_tb);
306 PRINT_STRING(
"SET_CURRENT_EXCEPTION:\n");
307 PRINT_PUBLISHED_EXCEPTION();
310#if PYTHON_VERSION < 0x3b0
311 Py_XDECREF(old_type);
313 Py_XDECREF(old_value);
314#if PYTHON_VERSION < 0x3b0
318#if _NUITKA_MAINTAIN_SYS_EXC_VARS
320 PyObject *sys_dict = tstate->interp->sysdict;
321 CHECK_OBJECT(sys_dict);
323 PyDict_SetItem(sys_dict, const_str_plain_exc_type, exc_state->exception_type ? exc_state->exception_type : Py_None);
324 PyDict_SetItem(sys_dict, const_str_plain_exc_value,
325 exc_state->exception_value ? exc_state->exception_value : Py_None);
326 PyDict_SetItem(sys_dict, const_str_plain_exc_traceback,
327 exc_state->exception_tb ? (PyObject *)exc_state->exception_tb : Py_None);
329 if (exc_state->exception_type) {
330 assert(Py_REFCNT(exc_state->exception_type) >= 2);
332 if (exc_state->exception_value) {
333 assert(Py_REFCNT(exc_state->exception_value) >= 2);
335 if (exc_state->exception_tb) {
336 assert(Py_REFCNT(exc_state->exception_tb) >= 2);
343NUITKA_MAY_BE_UNUSED
static inline void NORMALIZE_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
344 PyObject **exception_value,
345 PyTracebackObject **exception_tb);
347extern PyObject *NORMALIZE_EXCEPTION_VALUE_FOR_RAISE(PyThreadState *tstate, PyObject *exception_type);
351NUITKA_MAY_BE_UNUSED
inline static void SET_CURRENT_EXCEPTION_TYPE0(PyThreadState *tstate, PyObject *exception_type) {
352 CHECK_OBJECT(exception_type);
354#if PYTHON_VERSION < 0x3c0
355 PyObject *old_exception_type = tstate->curexc_type;
356 PyObject *old_exception_value = tstate->curexc_value;
357 PyObject *old_exception_traceback = tstate->curexc_traceback;
359 tstate->curexc_type = exception_type;
360 Py_INCREF(exception_type);
361 tstate->curexc_value = NULL;
362 tstate->curexc_traceback = NULL;
365 PRINT_STRING(
"SET_CURRENT_EXCEPTION_TYPE0:\n");
366 PRINT_CURRENT_EXCEPTION();
369 Py_XDECREF(old_exception_type);
370 Py_XDECREF(old_exception_value);
371 Py_XDECREF(old_exception_traceback);
373 PyObject *old_exception = tstate->current_exception;
374 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception);
377 PyObject *exception_value = NORMALIZE_EXCEPTION_VALUE_FOR_RAISE(tstate, exception_type);
378 ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
379 tstate->current_exception = exception_value;
382 PRINT_STRING(
"SET_CURRENT_EXCEPTION_TYPE0:\n");
383 PRINT_CURRENT_EXCEPTION();
386 Py_XDECREF(old_exception);
391NUITKA_MAY_BE_UNUSED
inline static void
392SET_CURRENT_EXCEPTION_TYPE0_VALUE0(PyThreadState *tstate, PyObject *exception_type, PyObject *exception_value) {
393 CHECK_OBJECT(exception_type);
394 CHECK_OBJECT(exception_value);
396#if PYTHON_VERSION < 0x3c0
397 PyObject *old_exception_type = tstate->curexc_type;
398 PyObject *old_exception_value = tstate->curexc_value;
399 PyObject *old_exception_traceback = tstate->curexc_traceback;
401 tstate->curexc_type = exception_type;
402 Py_INCREF(exception_type);
403 tstate->curexc_value = exception_value;
404 Py_INCREF(exception_value);
405 tstate->curexc_traceback = NULL;
408 PRINT_STRING(
"SET_CURRENT_EXCEPTION_TYPE0_VALUE0:\n");
409 PRINT_CURRENT_EXCEPTION();
412 Py_XDECREF(old_exception_type);
413 Py_XDECREF(old_exception_value);
414 Py_XDECREF(old_exception_traceback);
416 PyObject *old_exception_value = tstate->current_exception;
417 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
420 NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
421 ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
422 tstate->current_exception = exception_value;
423 Py_INCREF(exception_value);
426 PRINT_STRING(
"SET_CURRENT_EXCEPTION_TYPE_0_VALUE0:\n");
427 PRINT_CURRENT_EXCEPTION();
430 Py_XDECREF(old_exception_value);
436NUITKA_MAY_BE_UNUSED
inline static void
437SET_CURRENT_EXCEPTION_TYPE0_VALUE1(PyThreadState *tstate, PyObject *exception_type, PyObject *exception_value) {
438 CHECK_OBJECT(exception_type);
439 CHECK_OBJECT(exception_value);
441#if PYTHON_VERSION < 0x3c0
442 PyObject *old_exception_type = tstate->curexc_type;
443 PyObject *old_exception_value = tstate->curexc_value;
444 PyObject *old_exception_traceback = tstate->curexc_traceback;
446 tstate->curexc_type = exception_type;
447 Py_INCREF(exception_type);
448 tstate->curexc_value = exception_value;
449 tstate->curexc_traceback = NULL;
452 PRINT_STRING(
"SET_CURRENT_EXCEPTION_TYPE0_VALUE1:\n");
453 PRINT_CURRENT_EXCEPTION();
456 Py_XDECREF(old_exception_type);
457 Py_XDECREF(old_exception_value);
458 Py_XDECREF(old_exception_traceback);
460 PyObject *old_exception_value = tstate->current_exception;
461 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
464 NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, NULL);
465 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_value);
466 tstate->current_exception = exception_value;
469 PRINT_STRING(
"SET_CURRENT_EXCEPTION_TYPE0_VALUE1:\n");
470 PRINT_CURRENT_EXCEPTION();
473 Py_XDECREF(old_exception_value);
480NUITKA_MAY_BE_UNUSED
inline static void SET_CURRENT_EXCEPTION_TYPE0_STR(PyThreadState *tstate, PyObject *exception_type,
482 PyObject *exception_value = Nuitka_String_FromString(value);
484 SET_CURRENT_EXCEPTION_TYPE0_VALUE1(tstate, exception_type, exception_value);
488extern void SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyObject *exception_type,
char const *format,
char const *value);
489extern void SET_CURRENT_EXCEPTION_TYPE0_FORMAT2(PyObject *exception_type,
char const *format,
char const *value1,
491extern void SET_CURRENT_EXCEPTION_TYPE0_FORMAT3(PyObject *exception_type,
char const *format,
char const *value1,
492 char const *value2,
char const *value3);
494extern void SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
char const *format, PyObject *mistyped);
495extern void SET_CURRENT_EXCEPTION_TYPE_COMPLAINT_NICE(
char const *format, PyObject *mistyped);
497#if PYTHON_VERSION < 0x300
500NUITKA_MAY_BE_UNUSED
static inline void PRESERVE_FRAME_EXCEPTION(PyThreadState *tstate,
502 PyFrameObject *frame = (PyFrameObject *)frame_object;
505 if (frame->f_exc_type == NULL) {
506 if (tstate->exc_type != NULL && tstate->exc_type != Py_None) {
508 PRINT_STRING(
"PRESERVE_FRAME_EXCEPTION: preserve thread exception\n");
510 frame->f_exc_type = tstate->exc_type;
511 Py_INCREF(frame->f_exc_type);
512 frame->f_exc_value = tstate->exc_value;
513 Py_XINCREF(frame->f_exc_value);
514 frame->f_exc_traceback = tstate->exc_traceback;
515 Py_XINCREF(frame->f_exc_traceback);
518 PRINT_STRING(
"PRESERVE_FRAME_EXCEPTION: no exception to preserve\n");
520 frame->f_exc_type = Py_None;
521 Py_INCREF_IMMORTAL(frame->f_exc_type);
522 frame->f_exc_value = NULL;
523 frame->f_exc_traceback = NULL;
528 PRINT_STRING(
"PRESERVE_FRAME_EXCEPTION: already preserving\n");
531 PRINT_ITEM((PyObject *)frame_object);
533 PRINT_EXCEPTION(frame->f_exc_type, frame->f_exc_value, (PyTracebackObject *)frame->f_exc_traceback);
538NUITKA_MAY_BE_UNUSED
static inline void RESTORE_FRAME_EXCEPTION(PyThreadState *tstate,
540 PyFrameObject *frame = (PyFrameObject *)frame_object;
542 if (frame->f_exc_type) {
544 PRINT_STRING(
"RESTORE_FRAME_EXCEPTION: restoring preserved\n");
545 PRINT_ITEM((PyObject *)frame_object);
551 exc_state.exception_type = frame->f_exc_type;
552 exc_state.exception_value = frame->f_exc_value;
553 exc_state.exception_tb = (PyTracebackObject *)frame->f_exc_traceback;
555 SET_CURRENT_EXCEPTION(tstate, &exc_state);
557 frame->f_exc_type = NULL;
558 frame->f_exc_value = NULL;
559 frame->f_exc_traceback = NULL;
563 PRINT_STRING(
"RESTORE_FRAME_EXCEPTION: nothing to restore\n");
564 PRINT_ITEM((PyObject *)frame_object);
573#if PYTHON_VERSION < 0x300
574#define ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_value, exception_tb) ;
576NUITKA_MAY_BE_UNUSED
static inline void ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(PyObject *exception_value,
577 PyTracebackObject *exception_tb) {
578 CHECK_OBJECT(exception_value);
579 CHECK_OBJECT_X(exception_tb);
581 if (exception_tb == (PyTracebackObject *)Py_None) {
585 assert(PyExceptionInstance_Check(exception_value));
586 assert(exception_tb == NULL || PyTraceBack_Check(exception_tb));
588 PyBaseExceptionObject *e = (PyBaseExceptionObject *)exception_value;
590 PyObject *old = e->traceback;
591 Py_XINCREF(exception_tb);
592 e->traceback = (PyObject *)exception_tb;
597NUITKA_MAY_BE_UNUSED
static inline PyTracebackObject *GET_EXCEPTION_TRACEBACK(PyObject *exception_value) {
598 CHECK_OBJECT(exception_value);
599 assert(PyExceptionInstance_Check(exception_value));
601 PyBaseExceptionObject *exc_object = (PyBaseExceptionObject *)(exception_value);
602 return (PyTracebackObject *)exc_object->traceback;
607NUITKA_MAY_BE_UNUSED
static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tstate, PyObject *exception_value,
608 PyObject *exception_checked);
610NUITKA_MAY_BE_UNUSED
static bool _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(PyThreadState *tstate, PyObject *exception_type) {
611#if PYTHON_VERSION < 0x3c0
612 PyObject *exception_current = tstate->curexc_type;
614 PyObject *exception_current = tstate->current_exception;
615 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_current);
617 if (exception_current == NULL) {
619 }
else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
620 CHECK_OBJECT(exception_current);
622#if PYTHON_VERSION < 0x3c0
624 Py_DECREF(exception_current);
625 tstate->curexc_type = NULL;
627 PyObject *old_value = tstate->curexc_value;
628 PyObject *old_tb = tstate->curexc_traceback;
630 tstate->curexc_value = NULL;
631 tstate->curexc_traceback = NULL;
633 Py_XDECREF(old_value);
636 tstate->current_exception = NULL;
637 Py_DECREF(exception_current);
656NUITKA_MAY_BE_UNUSED
static bool CHECK_AND_CLEAR_STOP_ITERATION_OCCURRED(PyThreadState *tstate) {
657 return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_StopIteration);
666NUITKA_MAY_BE_UNUSED
static bool CHECK_AND_CLEAR_KEY_ERROR_OCCURRED(PyThreadState *tstate) {
667 return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_KeyError);
670NUITKA_MAY_BE_UNUSED
static bool CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(PyThreadState *tstate) {
671 return _CHECK_AND_CLEAR_EXCEPTION_OCCURRED(tstate, PyExc_AttributeError);
674#if PYTHON_VERSION >= 0x3c0
675NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_TUPLE1(PyThreadState *tstate, PyObject *element1);
677NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_EXCEPTION_FROM_TYPE_ARG0(PyThreadState *tstate, PyObject *type,
679 PyBaseExceptionObject *self;
681 PyTypeObject *type_object = (PyTypeObject *)type;
683 self = (PyBaseExceptionObject *)(type_object->tp_alloc(type_object, 0));
687 self->traceback = self->cause = self->context = NULL;
688 self->suppress_context = 0;
692 if (!PyTuple_Check(arg)) {
693 self->args = MAKE_TUPLE1(tstate, arg);
695 self->args = Py_NewRef(arg);
698 return (PyObject *)self;
702extern PyObject *CALL_FUNCTION_WITH_SINGLE_ARG(PyThreadState *tstate, PyObject *called, PyObject *arg);
704NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_EXCEPTION_FROM_TYPE_ARG0(PyThreadState *tstate, PyObject *type,
706 return CALL_FUNCTION_WITH_SINGLE_ARG(tstate, type, arg);
711#if PYTHON_VERSION < 0x3c0
713 PyObject *exception_type;
714 PyObject *exception_value;
715 PyTracebackObject *exception_tb;
721NUITKA_MAY_BE_UNUSED
static void FETCH_ERROR_OCCURRED_STATE(PyThreadState *tstate,
723 FETCH_ERROR_OCCURRED(tstate, &exception_state->exception_type, &exception_state->exception_value,
724 &exception_state->exception_tb);
728NUITKA_MAY_BE_UNUSED
static void
730 RESTORE_ERROR_OCCURRED(tstate, exception_state->exception_type, exception_state->exception_value,
731 exception_state->exception_tb);
734NUITKA_MAY_BE_UNUSED
static void
736 FETCH_ERROR_OCCURRED_UNTRACED(tstate, &exception_state->exception_type, &exception_state->exception_value,
737 &exception_state->exception_tb);
740NUITKA_MAY_BE_UNUSED
static void
742 RESTORE_ERROR_OCCURRED_UNTRACED(tstate, exception_state->exception_type, exception_state->exception_value,
743 exception_state->exception_tb);
746NUITKA_MAY_BE_UNUSED
static void
749 assert(exception_state1->exception_type == exception_state2->exception_type);
750 assert(exception_state1->exception_value == exception_state2->exception_value);
751 assert(exception_state1->exception_tb == exception_state2->exception_tb);
754NUITKA_MAY_BE_UNUSED
static void
756 assert(exception_state->exception_type == NULL);
757 assert(exception_state->exception_value == NULL);
758 assert(exception_state->exception_tb == NULL);
762 exception_state->exception_type = NULL;
763 exception_state->exception_value = NULL;
764 exception_state->exception_tb = NULL;
767NUITKA_MAY_BE_UNUSED
static void
769 CHECK_OBJECT(exception_state->exception_type);
770 CHECK_OBJECT_X(exception_state->exception_value);
771 CHECK_OBJECT_X(exception_state->exception_tb);
772 Py_DECREF(exception_state->exception_type);
773 Py_XDECREF(exception_state->exception_value);
774 Py_XDECREF(exception_state->exception_tb);
777NUITKA_MAY_BE_UNUSED
static void
779 CHECK_OBJECT_X(exception_state->exception_type);
780 CHECK_OBJECT_X(exception_state->exception_value);
781 CHECK_OBJECT_X(exception_state->exception_tb);
783 Py_XDECREF(exception_state->exception_type);
784 Py_XDECREF(exception_state->exception_value);
785 Py_XDECREF(exception_state->exception_tb);
788NUITKA_MAY_BE_UNUSED
static void SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(
790 PyObject *exception_value, PyTracebackObject *exception_tb) {
791 Py_INCREF(exception_type);
792 Py_XINCREF(exception_value);
793 Py_XINCREF(exception_tb);
795 exception_state->exception_type = exception_type;
796 exception_state->exception_value = exception_value;
797 exception_state->exception_tb = exception_tb;
800NUITKA_MAY_BE_UNUSED
static void
802 PyObject **exception_type, PyObject **exception_value,
803 PyTracebackObject **exception_tb) {
805 *exception_type = exception_state->exception_type;
806 Py_INCREF(*exception_type);
807 *exception_value = exception_state->exception_value;
808 Py_XINCREF(*exception_value);
809 *exception_tb = exception_state->exception_tb;
810 Py_XINCREF(*exception_tb);
813NUITKA_MAY_BE_UNUSED
static PyTracebackObject *
815 return exception_state->exception_tb;
820 PyTracebackObject *exception_tb) {
821 CHECK_OBJECT_X(exception_state->exception_tb);
822 CHECK_OBJECT_X(exception_tb);
824 Py_XDECREF(exception_state->exception_tb);
825 exception_state->exception_tb = exception_tb;
829 return exception_state->exception_type != NULL;
832NUITKA_MAY_BE_UNUSED
static bool
834 PyObject *exception_checked) {
835 return EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_state->exception_type, exception_checked);
838NUITKA_MAY_BE_UNUSED
inline static void
840 CHECK_OBJECT(exception_state->exception_type);
841 CHECK_OBJECT_X(exception_state->exception_value);
842 CHECK_OBJECT_X(exception_state->exception_tb);
845NUITKA_MAY_BE_UNUSED
inline static void
847 CHECK_OBJECT_X(exception_state->exception_type);
848 CHECK_OBJECT_X(exception_state->exception_value);
849 CHECK_OBJECT_X(exception_state->exception_tb);
854 PyObject *exception_value;
860NUITKA_MAY_BE_UNUSED
static void FETCH_ERROR_OCCURRED_STATE(PyThreadState *tstate,
862 exception_state->exception_value = tstate->current_exception;
863 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
866 PRINT_STRING(
"FETCH_ERROR_OCCURRED_STATE:\n");
867 PRINT_CURRENT_EXCEPTION();
870 tstate->current_exception = NULL;
873NUITKA_MAY_BE_UNUSED
static void
875 exception_state->exception_value = tstate->current_exception;
876 tstate->current_exception = NULL;
878 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
881NUITKA_MAY_BE_UNUSED
static void
883 PyObject *old_exception_value = tstate->current_exception;
884 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
886 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
887 tstate->current_exception = exception_state->exception_value;
890 PRINT_STRING(
"RESTORE_ERROR_OCCURRED_STATE:\n");
891 PRINT_CURRENT_EXCEPTION();
894 Py_XDECREF(old_exception_value);
897NUITKA_MAY_BE_UNUSED
static void
899 PyObject *old_exception_value = tstate->current_exception;
900 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(old_exception_value);
902 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
903 tstate->current_exception = exception_state->exception_value;
905 Py_XDECREF(old_exception_value);
908NUITKA_MAY_BE_UNUSED
static void
911 assert(exception_state1->exception_value == exception_state2->exception_value);
914NUITKA_MAY_BE_UNUSED
static void
916 assert(exception_state->exception_value == NULL);
920 exception_state->exception_value = NULL;
923NUITKA_MAY_BE_UNUSED
static void
925 CHECK_OBJECT(exception_state->exception_value);
926 Py_DECREF(exception_state->exception_value);
929NUITKA_MAY_BE_UNUSED
static void
931 CHECK_OBJECT_X(exception_state->exception_value);
932 Py_XDECREF(exception_state->exception_value);
935NUITKA_MAY_BE_UNUSED
static void SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(
937 PyObject *exception_value, PyTracebackObject *exception_tb) {
939 Py_XINCREF(exception_type);
940 Py_XINCREF(exception_value);
941 Py_XINCREF(exception_tb);
943 NORMALIZE_EXCEPTION(tstate, &exception_type, &exception_value, &exception_tb);
944 ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_value);
946 exception_state->exception_value = exception_value;
947 Py_INCREF(exception_value);
949 ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_value, exception_tb);
951 Py_XDECREF(exception_type);
952 Py_XDECREF(exception_value);
953 Py_XDECREF(exception_tb);
956NUITKA_MAY_BE_UNUSED
static void
958 PyObject **exception_type, PyObject **exception_value,
959 PyTracebackObject **exception_tb) {
961 *exception_value = exception_state->exception_value;
963 if (*exception_value) {
964 Py_INCREF(*exception_value);
966 *exception_type = (PyObject *)PyExceptionInstance_Class(*exception_value);
967 Py_INCREF(*exception_type);
968 *exception_tb = GET_EXCEPTION_TRACEBACK(*exception_value);
969 Py_XINCREF(*exception_tb);
971 *exception_type = NULL;
972 *exception_tb = NULL;
976NUITKA_MAY_BE_UNUSED
static PyTracebackObject *
978 return GET_EXCEPTION_TRACEBACK(exception_state->exception_value);
983 PyTracebackObject *exception_tb) {
984 ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_state->exception_value, exception_tb);
985 Py_XDECREF(exception_tb);
986 CHECK_OBJECT_X(exception_tb);
990 return exception_state->exception_value != NULL;
993NUITKA_MAY_BE_UNUSED
static bool
995 PyObject *exception_checked) {
996 return EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_state->exception_value, exception_checked);
999NUITKA_MAY_BE_UNUSED
inline static void
1001 ASSERT_NORMALIZED_EXCEPTION_VALUE(exception_state->exception_value);
1004NUITKA_MAY_BE_UNUSED
inline static void
1006 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_state->exception_value);
1011NUITKA_MAY_BE_UNUSED
inline static void SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0(
1014 SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, NULL, NULL);
1017extern PyObject *CALL_FUNCTION_WITH_SINGLE_ARG(PyThreadState *tstate, PyObject *called, PyObject *arg);
1019NUITKA_MAY_BE_UNUSED
inline static void
1020SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(PyThreadState *tstate,
1022 PyObject *exception_type, PyObject *exception_value) {
1023#if PYTHON_VERSION < 0x3c0
1024 Py_INCREF(exception_type);
1026 exception_state->exception_type = exception_type;
1027 exception_state->exception_value = exception_value;
1028 exception_state->exception_tb = NULL;
1030 PyObject *exc = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, exception_type, exception_value);
1031 exception_state->exception_value = exc;
1032 Py_DECREF(exception_value);
1036NUITKA_MAY_BE_UNUSED
inline static void
1037SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1_NORMALIZED(PyThreadState *tstate,
1039 PyObject *exception_type, PyObject *exception_value) {
1040#if PYTHON_VERSION < 0x3c0
1041 SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value);
1043 exception_state->exception_value = exception_value;
1047NUITKA_MAY_BE_UNUSED
inline static void
1048SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE0(PyThreadState *tstate,
1050 PyObject *exception_type, PyObject *exception_value) {
1052 SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, exception_state, exception_type, exception_value, NULL);
1055NUITKA_MAY_BE_UNUSED
inline static void
1056SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_STR(PyThreadState *tstate,
1058 PyObject *exception_type,
char const *value) {
1059 PyObject *exception_value = Nuitka_String_FromString(value);
1061 SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value);
1064#define SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_FORMAT1(tstate, exception_state, exception_type, message, arg1) \
1066 PyObject *exception_value = Nuitka_String_FromFormat(message, arg1); \
1067 CHECK_OBJECT(exception_value); \
1068 SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value); \
1071#define SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_FORMAT2(tstate, exception_state, exception_type, message, arg1, \
1074 PyObject *exception_value = Nuitka_String_FromFormat(message, arg1, arg2); \
1075 CHECK_OBJECT(exception_value); \
1076 SET_EXCEPTION_PRESERVATION_STATE_FROM_TYPE0_VALUE1(tstate, exception_state, exception_type, exception_value); \
1079NUITKA_MAY_BE_UNUSED
static bool EXCEPTION_MATCH_GENERATOR(PyThreadState *tstate, PyObject *exception_value) {
1080 CHECK_OBJECT(exception_value);
1085 if (PyExceptionInstance_Check(exception_value)) {
1086 exception_value = PyExceptionInstance_Class(exception_value);
1090 if (exception_value == PyExc_GeneratorExit || exception_value == PyExc_StopIteration) {
1094 if (PyExceptionClass_Check(exception_value)) {
1097 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1099 int res = PyObject_IsSubclass(exception_value, PyExc_GeneratorExit);
1102 if (unlikely(res == -1)) {
1103 PyErr_WriteUnraisable(exception_value);
1110 res = PyObject_IsSubclass(exception_value, PyExc_StopIteration);
1113 if (unlikely(res == -1)) {
1114 PyErr_WriteUnraisable(exception_value);
1117 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1125NUITKA_MAY_BE_UNUSED
static bool
1127#if PYTHON_VERSION < 0x3c0
1128 return EXCEPTION_MATCH_GENERATOR(tstate, exception_state->exception_type);
1130 return EXCEPTION_MATCH_GENERATOR(tstate, exception_state->exception_value);
1134NUITKA_MAY_BE_UNUSED
static bool EXCEPTION_MATCH_BOOL_SINGLE(PyThreadState *tstate, PyObject *exception_value,
1135 PyObject *exception_checked) {
1136 CHECK_OBJECT(exception_value);
1137 CHECK_OBJECT(exception_checked);
1140 if (PyExceptionInstance_Check(exception_value)) {
1141 exception_value = PyExceptionInstance_Class(exception_value);
1145 if (exception_value == exception_checked) {
1149 if (PyExceptionClass_Check(exception_value)) {
1150#if PYTHON_VERSION < 0x300
1153 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1157 int res = PyObject_IsSubclass(exception_value, exception_checked);
1160 if (unlikely(res == -1)) {
1161 PyErr_WriteUnraisable(exception_value);
1164 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1168 int res = Nuitka_Type_IsSubtype((PyTypeObject *)exception_value, (PyTypeObject *)exception_checked);
1176NUITKA_MAY_BE_UNUSED
static inline int _EXCEPTION_MATCH_BOOL(PyThreadState *tstate, PyObject *exception_value,
1177 PyObject *exception_checked) {
1178 CHECK_OBJECT(exception_value);
1179 CHECK_OBJECT(exception_checked);
1182 PyObject *exception_class;
1183 if (PyExceptionInstance_Check(exception_value)) {
1184 exception_class = PyExceptionInstance_Class(exception_value);
1186 exception_class = exception_value;
1189#if PYTHON_VERSION < 0x300
1190 if (PyExceptionClass_Check(exception_class) && PyExceptionClass_Check(exception_checked)) {
1193 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1196 int recursion_limit = Py_GetRecursionLimit();
1197 if (recursion_limit < (1 << 30)) {
1198 Py_SetRecursionLimit(recursion_limit + 5);
1201 int res = PyObject_IsSubclass(exception_class, exception_checked);
1203 Py_SetRecursionLimit(recursion_limit);
1206 if (unlikely(res == -1)) {
1207 PyErr_WriteUnraisable(exception_value);
1211 RESTORE_ERROR_OCCURRED_STATE(tstate, &saved_exception_state);
1215 return exception_class == exception_checked;
1218 if (PyExceptionClass_Check(exception_class) && PyExceptionClass_Check(exception_checked)) {
1219 return Nuitka_Type_IsSubtype((PyTypeObject *)exception_class, (PyTypeObject *)exception_checked);
1221 return exception_class == exception_checked;
1229NUITKA_MAY_BE_UNUSED
static inline int EXCEPTION_MATCH_BOOL(PyThreadState *tstate, PyObject *exception_value,
1230 PyObject *exception_checked) {
1231 CHECK_OBJECT(exception_value);
1232 CHECK_OBJECT(exception_checked);
1234#if PYTHON_VERSION >= 0x300
1237 if (PyTuple_Check(exception_checked)) {
1238 Py_ssize_t length = PyTuple_GET_SIZE(exception_checked);
1240 for (Py_ssize_t i = 0; i < length; i += 1) {
1241 PyObject *element = PyTuple_GET_ITEM(exception_checked, i);
1243 if (unlikely(!PyExceptionClass_Check(element))) {
1244 SET_CURRENT_EXCEPTION_TYPE0_STR(
1245 tstate, PyExc_TypeError,
"catching classes that do not inherit from BaseException is not allowed");
1249 }
else if (unlikely(!PyExceptionClass_Check(exception_checked))) {
1250 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
1251 "catching classes that do not inherit from BaseException is not allowed");
1256 if (PyTuple_Check(exception_checked)) {
1257 Py_ssize_t length = PyTuple_GET_SIZE(exception_checked);
1259 for (Py_ssize_t i = 0; i < length; i += 1) {
1260 PyObject *element = PyTuple_GET_ITEM(exception_checked, i);
1262 int res = EXCEPTION_MATCH_BOOL(tstate, exception_value, element);
1271 return _EXCEPTION_MATCH_BOOL(tstate, exception_value, exception_checked);
1277extern void Nuitka_Err_NormalizeException(PyThreadState *tstate, PyObject **exc, PyObject **val,
1278 PyTracebackObject **tb);
1282NUITKA_MAY_BE_UNUSED
static inline void NORMALIZE_EXCEPTION(PyThreadState *tstate, PyObject **exception_type,
1283 PyObject **exception_value,
1284 PyTracebackObject **exception_tb) {
1285#if _DEBUG_EXCEPTIONS
1286 PRINT_STRING(
"NORMALIZE_EXCEPTION: Enter\n");
1287 PRINT_EXCEPTION(*exception_type, *exception_value, *exception_tb);
1289 CHECK_OBJECT_X(*exception_type);
1290 CHECK_OBJECT_X(*exception_value);
1292 CHECK_OBJECT_X(*exception_tb);
1296 if (*exception_type != Py_None && *exception_type != NULL) {
1297 Nuitka_Err_NormalizeException(tstate, exception_type, exception_value, exception_tb);
1300#if _DEBUG_EXCEPTIONS
1301 PRINT_STRING(
"NORMALIZE_EXCEPTION: Leave\n");
1302 PRINT_EXCEPTION(*exception_type, *exception_value, exception_tb ? *exception_tb : NULL);
1306#if PYTHON_VERSION < 0x3c0
1309static inline void NORMALIZE_EXCEPTION_STATE(PyThreadState *tstate,
1311 CHECK_EXCEPTION_STATE_X(exception_state);
1313 NORMALIZE_EXCEPTION(tstate, &exception_state->exception_type, &exception_state->exception_value,
1314 &exception_state->exception_tb);
1318extern PyObject *CALL_FUNCTION_NO_ARGS(PyThreadState *tstate, PyObject *called);
1321NUITKA_MAY_BE_UNUSED
static inline void
1323#if _DEBUG_EXCEPTIONS
1324 PRINT_STRING(
"PUBLISH_CURRENT_EXCEPTION:\n");
1325 PRINT_EXCEPTION_STATE(exception_state);
1328#if PYTHON_VERSION < 0x3c0
1329 NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
1330 ATTACH_TRACEBACK_TO_EXCEPTION_VALUE(exception_state->exception_value, exception_state->exception_tb);
1335#if PYTHON_VERSION < 0x3b0
1336 exc_state.exception_type = exception_state->exception_type;
1338 exc_state.exception_value = exception_state->exception_value;
1339#if PYTHON_VERSION < 0x3b0
1340 exc_state.exception_tb = exception_state->exception_tb;
1343 SET_CURRENT_EXCEPTION(tstate, &exc_state);
1345#if PYTHON_VERSION >= 0x3b0 && PYTHON_VERSION < 0x3c0
1348 Py_DECREF(exception_state->exception_type);
1349 Py_XDECREF(exception_state->exception_tb);
1352 INIT_ERROR_OCCURRED_STATE(exception_state);
1355NUITKA_MAY_BE_UNUSED
static bool
1357 PyObject *exception_type) {
1358#if PYTHON_VERSION < 0x3c0
1359 PyObject *exception_current = exception_state->exception_type;
1361 PyObject *exception_current = exception_state->exception_value;
1362 ASSERT_NORMALIZED_EXCEPTION_VALUE_X(exception_current);
1364 if (exception_current == NULL) {
1366 }
else if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, exception_current, exception_type)) {
1367 CHECK_OBJECT(exception_current);
1369 RELEASE_ERROR_OCCURRED_STATE(exception_state);
1370 INIT_ERROR_OCCURRED_STATE(exception_state);
1380NUITKA_MAY_BE_UNUSED
static bool
1382 return _CHECK_AND_CLEAR_EXCEPTION_STATE(tstate, exception_state, PyExc_StopIteration);
1388 PyObject *variable_name);
1390extern void FORMAT_UNBOUND_CLOSURE_ERROR(PyThreadState *tstate,
1392 PyObject *variable_name);
1394#if PYTHON_VERSION >= 0x300
1395static inline PyBaseExceptionObject *_PyBaseExceptionObject_cast(PyObject *exc) {
1396 assert(PyExceptionInstance_Check(exc));
1397 return (PyBaseExceptionObject *)exc;
1402NUITKA_MAY_BE_UNUSED
static inline PyObject *Nuitka_Exception_GetContext(PyObject *self) {
1403 return _PyBaseExceptionObject_cast(self)->context;
1408NUITKA_MAY_BE_UNUSED
static inline void Nuitka_Exception_SetContext(PyObject *self, PyObject *context) {
1409 CHECK_OBJECT(context);
1412 Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context);
1415NUITKA_MAY_BE_UNUSED
static inline void Nuitka_Exception_DeleteContext(PyObject *self) {
1416 Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, NULL);
1419#if PYTHON_VERSION >= 0x300
1421NUITKA_MAY_BE_UNUSED
static inline void
1423 PyObject *context = EXC_VALUE(tstate);
1425 if (context != NULL) {
1426#if PYTHON_VERSION < 0x3c0
1427 NORMALIZE_EXCEPTION_STATE(tstate, exception_state);
1429 Nuitka_Exception_SetContext(exception_state->exception_value, context);
1435NUITKA_MAY_BE_UNUSED
static inline void Nuitka_Exception_SetCause(PyObject *self, PyObject *cause) {
1436 PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self);
1437 base_self->suppress_context = 1;
1438 Py_XSETREF(base_self->cause, cause);
Definition exceptions.h:712
Definition exceptions.h:222
Definition compiled_frame.h:117