"""Exception-related primitive ops.""" from mypyc.ir.ops import ERR_NEVER, ERR_FALSE, ERR_ALWAYS from mypyc.ir.rtypes import object_rprimitive, void_rtype, exc_rtuple, bit_rprimitive 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)