1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
"""Exception-related primitive ops."""
from __future__ import annotations
from mypyc.ir.ops import ERR_ALWAYS, ERR_FALSE, ERR_NEVER
from mypyc.ir.rtypes import bit_rprimitive, exc_rtuple, object_rprimitive, void_rtype
from mypyc.primitives.registry import custom_op
# If the argument is a class, raise an instance of the class. Otherwise, assume
# that the argument is an exception object, and raise it.
raise_exception_op = custom_op(
arg_types=[object_rprimitive],
return_type=void_rtype,
c_function_name="CPy_Raise",
error_kind=ERR_ALWAYS,
)
# Raise StopIteration exception with the specified value (which can be NULL).
set_stop_iteration_value = custom_op(
arg_types=[object_rprimitive],
return_type=void_rtype,
c_function_name="CPyGen_SetStopIterationValue",
error_kind=ERR_ALWAYS,
)
# Raise exception with traceback.
# Arguments are (exception type, exception value, traceback).
raise_exception_with_tb_op = custom_op(
arg_types=[object_rprimitive, object_rprimitive, object_rprimitive],
return_type=void_rtype,
c_function_name="CPyErr_SetObjectAndTraceback",
error_kind=ERR_ALWAYS,
)
# Reraise the currently raised exception.
reraise_exception_op = custom_op(
arg_types=[], return_type=void_rtype, c_function_name="CPy_Reraise", error_kind=ERR_ALWAYS
)
# Propagate exception if the CPython error indicator is set (an exception was raised).
no_err_occurred_op = custom_op(
arg_types=[],
return_type=bit_rprimitive,
c_function_name="CPy_NoErrOccurred",
error_kind=ERR_FALSE,
)
err_occurred_op = custom_op(
arg_types=[],
return_type=object_rprimitive,
c_function_name="PyErr_Occurred",
error_kind=ERR_NEVER,
is_borrowed=True,
)
# Keep propagating a raised exception by unconditionally giving an error value.
# This doesn't actually raise an exception.
keep_propagating_op = custom_op(
arg_types=[],
return_type=bit_rprimitive,
c_function_name="CPy_KeepPropagating",
error_kind=ERR_FALSE,
)
# Catches a propagating exception and makes it the "currently
# handled exception" (by sticking it into sys.exc_info()). Returns the
# exception that was previously being handled, which must be restored
# later.
error_catch_op = custom_op(
arg_types=[], return_type=exc_rtuple, c_function_name="CPy_CatchError", error_kind=ERR_NEVER
)
# Restore an old "currently handled exception" returned from.
# error_catch (by sticking it into sys.exc_info())
restore_exc_info_op = custom_op(
arg_types=[exc_rtuple],
return_type=void_rtype,
c_function_name="CPy_RestoreExcInfo",
error_kind=ERR_NEVER,
)
# Checks whether the exception currently being handled matches a particular type.
exc_matches_op = custom_op(
arg_types=[object_rprimitive],
return_type=bit_rprimitive,
c_function_name="CPy_ExceptionMatches",
error_kind=ERR_NEVER,
)
# Get the value of the exception currently being handled.
get_exc_value_op = custom_op(
arg_types=[],
return_type=object_rprimitive,
c_function_name="CPy_GetExcValue",
error_kind=ERR_NEVER,
)
# Get exception info (exception type, exception instance, traceback object).
get_exc_info_op = custom_op(
arg_types=[], return_type=exc_rtuple, c_function_name="CPy_GetExcInfo", error_kind=ERR_NEVER
)
|