simple_emit, binary_op, unary_op, func_op, method_op, custom_op, negative_int_emit, call_emit, name_emit, call_negative_bool_emit, call_negative_magic_emit, ) none_object_op = custom_op(result_type=object_rprimitive, arg_types=[], error_kind=ERR_NEVER, format_str='{dest} = builtins.None :: object', emit=name_emit('Py_None'), is_borrowed=True) none_op = name_ref_op('builtins.None', result_type=none_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = 1; /* None */')) true_op = name_ref_op('builtins.True', result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = 1;')) false_op = name_ref_op('builtins.False', result_type=bool_rprimitive,
int_binary_op('+=', 'CPyTagged_Add') int_binary_op('-=', 'CPyTagged_Subtract') int_binary_op('*=', 'CPyTagged_Multiply') int_binary_op('//=', 'CPyTagged_FloorDivide') int_binary_op('%=', 'CPyTagged_Remainder') int_compare_op('==', 'CPyTagged_IsEq') int_compare_op('!=', 'CPyTagged_IsNe') int_compare_op('<', 'CPyTagged_IsLt') int_compare_op('<=', 'CPyTagged_IsLe') int_compare_op('>', 'CPyTagged_IsGt') int_compare_op('>=', 'CPyTagged_IsGe') unsafe_short_add = custom_op( arg_types=[int_rprimitive, int_rprimitive], result_type=short_int_rprimitive, error_kind=ERR_NEVER, format_str='{dest} = {args[0]} + {args[1]} :: short_int', emit=simple_emit('{dest} = {args[0]} + {args[1]};')) 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)) int_neg_op = int_unary_op('-', 'CPyTagged_Negate')
def emit_new(emitter: EmitterInterface, args: List[str], dest: str) -> None: # TODO: This would be better split into multiple smaller ops. emitter.emit_line('%s = PyList_New(%d); ' % (dest, len(args))) for arg in args: emitter.emit_line('Py_INCREF(%s);' % arg) emitter.emit_line('if (%s != NULL) {' % dest) for i, arg in enumerate(args): emitter.emit_line('PyList_SET_ITEM(%s, %s, %s);' % (dest, i, arg)) emitter.emit_line('}') new_list_op = custom_op(arg_types=[object_rprimitive], result_type=list_rprimitive, is_var_arg=True, error_kind=ERR_MAGIC, format_str='{dest} = [{comma_args}]', emit=emit_new) list_get_item_op = method_op( name='__getitem__', arg_types=[list_rprimitive, int_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit('{dest} = CPyList_GetItem({args[0]}, {args[1]});')) list_set_item_op = method_op( name='__setitem__', arg_types=[list_rprimitive, int_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE,
"""Primitive set ops.""" from mypyc.ops_primitive import func_op, custom_op, simple_emit from mypyc.ops import object_rprimitive, bool_rprimitive, ERR_MAGIC, ERR_FALSE new_set_op = func_op(name='builtins.set', arg_types=[], result_type=object_rprimitive, error_kind=ERR_MAGIC, format_str='{dest} = set()', emit=simple_emit('{dest} = PySet_New(NULL);')) # This operation is only used during set literal generation. The first argument must be a set. # If sets get added as special types, this will become a method_op on set rprimitives. set_add_op = custom_op( arg_types=[object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str='{dest} = {args[0]}.add({args[1]})', emit=simple_emit('{dest} = PySet_Add({args[0]}, {args[1]}) == 0;'))
emit=call_emit('PySequence_List')) def emit_new(emitter: EmitterInterface, args: List[str], dest: str) -> None: # TODO: This would be better split into multiple smaller ops. emitter.emit_line('%s = PyList_New(%d); ' % (dest, len(args))) emitter.emit_line('if (likely(%s != NULL)) {' % dest) for i, arg in enumerate(args): emitter.emit_line('PyList_SET_ITEM(%s, %s, %s);' % (dest, i, arg)) emitter.emit_line('}') new_list_op = custom_op(arg_types=[object_rprimitive], result_type=list_rprimitive, is_var_arg=True, error_kind=ERR_MAGIC, steals=True, format_str='{dest} = [{comma_args}]', emit=emit_new) list_get_item_op = method_op(name='__getitem__', arg_types=[list_rprimitive, int_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=call_emit('CPyList_GetItem')) # Version with no int bounds check for when it is known to be short method_op(name='__getitem__', arg_types=[list_rprimitive, short_int_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC,
method_op, custom_op, call_emit, simple_emit, ) tuple_get_item_op = method_op(name='__getitem__', arg_types=[tuple_rprimitive, int_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=call_emit('CPySequenceTuple_GetItem')) new_tuple_op = custom_op( arg_types=[object_rprimitive], result_type=tuple_rprimitive, is_var_arg=True, error_kind=ERR_MAGIC, steals=False, format_str='{dest} = ({comma_args}) :: tuple', emit=simple_emit('{dest} = PyTuple_Pack({num_args}{pre_comma_args});')) def emit_len(emitter: EmitterInterface, args: List[str], dest: str) -> None: temp = emitter.temp_name() emitter.emit_declaration('Py_ssize_t %s;' % temp) emitter.emit_line('%s = PyTuple_GET_SIZE(%s);' % (temp, args[0])) emitter.emit_line('%s = CPyTagged_ShortFromSsize_t(%s);' % (dest, temp)) tuple_len_op = func_op(name='builtins.len', arg_types=[tuple_rprimitive], result_type=int_rprimitive,
binary_op, unary_op, func_op, method_op, custom_op, simple_emit, negative_int_emit, call_emit, name_emit, call_negative_bool_emit, call_negative_magic_emit, ) none_object_op = custom_op(result_type=object_rprimitive, arg_types=[], error_kind=ERR_NEVER, format_str='{dest} = builtins.None :: object', emit=name_emit('Py_None'), is_borrowed=True) none_op = name_ref_op('builtins.None', result_type=none_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = 1; /* None */')) true_op = name_ref_op('builtins.True', result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = 1;')) false_op = name_ref_op('builtins.False', result_type=bool_rprimitive,
"""Exception-related primitive ops.""" from mypyc.ops import ( bool_rprimitive, object_rprimitive, void_rtype, exc_rtuple, ERR_NEVER, ERR_FALSE ) from mypyc.ops_primitive import ( simple_emit, custom_op, ) # TODO: Making this raise conditionally is kind of hokey. raise_exception_op = custom_op( arg_types=[object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str='raise_exception({args[0]}); {dest} = 0', emit=simple_emit('CPy_Raise({args[0]}); {dest} = 0;')) set_stop_iteration_value = custom_op( arg_types=[object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str='set_stop_iteration_value({args[0]}); {dest} = 0', emit=simple_emit('CPyGen_SetStopIterationValue({args[0]}); {dest} = 0;')) raise_exception_with_tb_op = custom_op( arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str='raise_exception_with_tb({args[0]}, {args[1]}, {args[2]}); {dest} = 0',
arg_types=[object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=negative_int_emit('{dest} = {args[0]} == {args[1]};'), priority=0) binary_op('is not', arg_types=[object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=negative_int_emit('{dest} = {args[0]} != {args[1]};'), priority=0) is_none_op = custom_op(arg_types=[object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_NEVER, format_str='{dest} = {args[0]} is None', emit=simple_emit('{dest} = {args[0]} == Py_None;')) 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=simple_emit('{dest} = %s({args[0]});' % funcname), priority=0) unary_op(op='not', arg_type=object_rprimitive, result_type=bool_rprimitive,
emit=simple_emit('{dest} = Py_None;'), is_borrowed=True) true_op = name_ref_op('builtins.True', result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = 1;')) false_op = name_ref_op('builtins.False', result_type=bool_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = 0;')) ellipsis_op = custom_op( name='...', arg_types=[], result_type=object_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = Py_Ellipsis; Py_INCREF({dest});')) iter_op = func_op(name='builtins.iter', arg_types=[object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit('{dest} = PyObject_GetIter({args[0]});')) # Although the error_kind is set to be ERR_NEVER, this can actually return NULL, and thus it must # be checked using Branch.IS_ERROR. next_op = custom_op(name='next', arg_types=[object_rprimitive], result_type=object_rprimitive, error_kind=ERR_NEVER,
result_type=bool_rprimitive, error_kind=ERR_MAGIC, format_str='{dest} = {args[0]} in {args[1]} :: dict', emit=negative_int_emit('{dest} = PyDict_Contains({args[1]}, {args[0]});')) dict_update_op = method_op(name='update', arg_types=[dict_rprimitive, dict_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('CPyDict_Update'), priority=2) dict_update_in_display_op = custom_op( arg_types=[dict_rprimitive, dict_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('CPyDict_UpdateInDisplay'), format_str='{dest} = {args[0]}.update({args[1]}) (display) :: dict', ) method_op(name='update', arg_types=[dict_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=simple_emit( '{dest} = CPyDict_UpdateFromAny({args[0]}, {args[1]}) != -1;')) method_op(name='get', arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC,
from mypyc.ops import ( EmitterInterface, PrimitiveOp, none_rprimitive, bool_rprimitive, object_rprimitive, void_rtype, exc_rtuple, ERR_NEVER, ERR_MAGIC, ERR_FALSE ) from mypyc.ops_primitive import ( simple_emit, func_op, method_op, custom_op, negative_int_emit, ) # TODO: Making this raise conditionally is kind of hokey. raise_exception_op = custom_op( arg_types=[object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str = 'raise_exception({args[0]}, {args[1]}); {dest} = 0', emit=simple_emit('PyErr_SetObject({args[0]}, {args[1]}); {dest} = 0;')) reraise_exception_op = custom_op( arg_types=[], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str = 'reraise_exc; {dest} = 0', emit=simple_emit('CPy_Reraise(); {dest} = 0;')) no_err_occurred_op = custom_op( arg_types=[], result_type=bool_rprimitive, error_kind=ERR_FALSE, format_str = '{dest} = no_err_occurred',