def int_unary_op(op: str, c_func_name: str) -> OpDescription: return unary_op(op=op, arg_type=int_rprimitive, result_type=int_rprimitive, error_kind=ERR_NEVER, format_str='{dest} = %s{args[0]} :: int' % op, emit=call_emit(c_func_name))
emit=call_emit('PyMethod_New')) # Check if the current exception is a StopIteration and return its value if so. # Treats "no exception" as StopIteration with a None value. # If it is a different exception, re-reraise it. check_stop_op = custom_op(name='check_stop_iteration', arg_types=[], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=call_emit('CPy_FetchStopIterationValue')) # Negate a primitive bool unary_op(op='not', arg_type=bool_rprimitive, result_type=bool_rprimitive, error_kind=ERR_NEVER, format_str='{dest} = !{args[0]}', emit=simple_emit('{dest} = !{args[0]};'), priority=1) # Determine the most derived metaclass and check for metaclass conflicts. # Arguments are (metaclass, bases). py_calc_meta_op = custom_op( arg_types=[object_rprimitive, object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, format_str='{dest} = py_calc_metaclass({comma_args})', emit=simple_emit( '{dest} = (PyObject*) _PyType_CalculateMetaclass((PyTypeObject *){args[0]}, {args[1]});' ), is_borrowed=True)
binary_op(name='in', arg_types=[object_rprimitive, object_rprimitive], return_type=c_int_rprimitive, c_function_name='PySequence_Contains', error_kind=ERR_NEG_INT, truncated_type=bool_rprimitive, ordering=[1, 0], priority=0) # Unary operations for op, funcname in [('-', 'PyNumber_Negative'), ('+', 'PyNumber_Positive'), ('~', 'PyNumber_Invert')]: unary_op(name=op, arg_type=object_rprimitive, return_type=object_rprimitive, c_function_name=funcname, error_kind=ERR_MAGIC, priority=0) unary_op(name='not', arg_type=object_rprimitive, return_type=c_int_rprimitive, c_function_name='PyObject_Not', error_kind=ERR_NEG_INT, truncated_type=bool_rprimitive, priority=0) # obj1[obj2] method_op(name='__getitem__', arg_types=[object_rprimitive, object_rprimitive], return_type=object_rprimitive,
binary_op('is not', arg_types=[object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = {args[0]} != {args[1]};'), priority=0) # Unary operations for op, funcname in [('-', 'PyNumber_Negative'), ('+', 'PyNumber_Positive'), ('~', 'PyNumber_Invert')]: unary_op(op=op, arg_type=object_rprimitive, result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=call_emit(funcname), priority=0) unary_op(op='not', arg_type=object_rprimitive, result_type=bool_rprimitive, error_kind=ERR_MAGIC, format_str='{dest} = not {args[0]}', emit=call_negative_magic_emit('PyObject_Not'), priority=0) # obj1[obj2] method_op('__getitem__', arg_types=[object_rprimitive, object_rprimitive],
def int_unary_op(name: str, c_function_name: str) -> CFunctionDescription: return unary_op(name=name, arg_type=int_rprimitive, return_type=int_rprimitive, c_function_name=c_function_name, error_kind=ERR_NEVER)