| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- """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_NoErrOccured",
- 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
- )
|