ERR_MAGIC) from mypyc.ops_primitive import method_op, binary_op, func_op, simple_emit, negative_int_emit def emit_get_item(emitter: EmitterInterface, args: List[str], dest: str) -> None: emitter.emit_lines( '%s = PyDict_GetItemWithError(%s, %s);' % (dest, args[0], args[1]), 'if (!%s)' % dest, ' PyErr_SetObject(PyExc_KeyError, %s);' % args[1], 'else', ' Py_INCREF(%s);' % dest) dict_get_item_op = method_op(name='__getitem__', arg_types=[dict_rprimitive, object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=emit_get_item) dict_set_item_op = method_op( name='__setitem__', arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=simple_emit( '{dest} = PyDict_SetItem({args[0]}, {args[1]}, {args[2]}) >= 0;')) binary_op( op='in', arg_types=[object_rprimitive, dict_rprimitive], result_type=bool_rprimitive,
error_kind=ERR_MAGIC, format_str='{dest} = not {args[0]}', emit=call_negative_magic_emit('PyObject_Not'), priority=0) 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) method_op('__getitem__', arg_types=[object_rprimitive, object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=call_emit('PyObject_GetItem'), priority=0) method_op('__setitem__', arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('PyObject_SetItem'), priority=0) method_op('__delitem__', arg_types=[object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('PyObject_DelItem'),
simple_emit, negative_int_emit, call_emit, call_negative_bool_emit, call_negative_magic_emit, ) name_ref_op('builtins.dict', result_type=object_rprimitive, error_kind=ERR_NEVER, emit=simple_emit('{dest} = (PyObject *)&PyDict_Type;'), is_borrowed=True) dict_get_item_op = method_op(name='__getitem__', arg_types=[dict_rprimitive, object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=call_emit('CPyDict_GetItem')) dict_set_item_op = method_op( name='__setitem__', arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('CPyDict_SetItem')) binary_op( op='in', arg_types=[object_rprimitive, dict_rprimitive], result_type=bool_rprimitive, error_kind=ERR_MAGIC,
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, emit=simple_emit( '{dest} = CPyList_SetItem({args[0]}, {args[1]}, {args[2]}) != 0;')) list_append_op = method_op( name='append', arg_types=[list_rprimitive, object_rprimitive], result_type=bool_rprimitive,
from typing import List from mypyc.ops import (EmitterInterface, tuple_rprimitive, int_rprimitive, list_rprimitive, object_rprimitive, ERR_NEVER, ERR_MAGIC) from mypyc.ops_primitive import ( func_op, 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()
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, emit=call_emit('CPyList_GetItemShort'), priority=2) # This is unsafe because it assumes that the index is a non-negative short integer # that is in-bounds for the list. list_get_item_unsafe_op = custom_op( name='__getitem__',
func_op(name='builtins.str', arg_types=[object_rprimitive], result_type=str_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit('{dest} = PyObject_Str({args[0]});')) binary_op(op='+', arg_types=[str_rprimitive, str_rprimitive], result_type=str_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit('{dest} = PyUnicode_Concat({args[0]}, {args[1]});')) method_op(name='join', arg_types=[str_rprimitive, object_rprimitive], result_type=str_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit('{dest} = PyUnicode_Join({args[0]}, {args[1]});')) # PyUnicodeAppend makes an effort to reuse the LHS when the refcount # is 1. This is super dodgy but oh well, the interpreter does it. binary_op(op='+=', arg_types=[str_rprimitive, str_rprimitive], steals=[True, False], result_type=str_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit( '{dest} = {args[0]}; PyUnicode_Append(&{dest}, {args[1]});')) def emit_str_compare(
error_kind=ERR_MAGIC, format_str='{dest} = not {args[0]}', emit=negative_int_emit('{dest} = PyObject_Not({args[0]});'), priority=0) unary_op(op='not', arg_type=bool_rprimitive, result_type=bool_rprimitive, error_kind=ERR_NEVER, format_str='{dest} = !{args[0]}', emit=negative_int_emit('{dest} = !{args[0]};'), priority=1) method_op('__getitem__', arg_types=[object_rprimitive, object_rprimitive], result_type=object_rprimitive, error_kind=ERR_MAGIC, emit=simple_emit('{dest} = PyObject_GetItem({args[0]}, {args[1]});'), priority=0) method_op( '__setitem__', arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=simple_emit( '{dest} = PyObject_SetItem({args[0]}, {args[1]}, {args[2]}) >= 0;'), priority=0) py_getattr_op = func_op( name='builtins.getattr', arg_types=[object_rprimitive, object_rprimitive],
binary_op( op='in', arg_types=[object_rprimitive, set_rprimitive], result_type=bool_rprimitive, error_kind=ERR_MAGIC, format_str='{dest} = {args[0]} in {args[1]} :: set', emit=negative_int_emit('{dest} = PySet_Contains({args[1]}, {args[0]});') ) method_op( name='remove', arg_types=[set_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=simple_emit('{dest} = CPySet_Remove({args[0]}, {args[1]});') ) method_op( name='discard', arg_types=[set_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=simple_emit('{dest} = PySet_Discard({args[0]}, {args[1]}) >= 0;') ) set_add_op = method_op(
result_type=int_rprimitive, error_kind=ERR_NEVER, emit=emit_len, ) binary_op( op='in', arg_types=[object_rprimitive, set_rprimitive], result_type=bool_rprimitive, error_kind=ERR_MAGIC, format_str='{dest} = {args[0]} in {args[1]} :: set', emit=negative_int_emit('{dest} = PySet_Contains({args[1]}, {args[0]});')) method_op(name='remove', arg_types=[set_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_emit('CPySet_Remove')) method_op(name='discard', arg_types=[set_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('PySet_Discard')) set_add_op = method_op(name='add', arg_types=[set_rprimitive, object_rprimitive], result_type=bool_rprimitive, error_kind=ERR_FALSE, emit=call_negative_bool_emit('PySet_Add'))
These are for varying-length tuples represented as Python tuple objects (RPrimitive, not RTuple). """ from typing import List from mypyc.ops import (EmitterInterface, PrimitiveOp, tuple_rprimitive, int_rprimitive, list_rprimitive, object_rprimitive, ERR_NEVER, ERR_MAGIC) from mypyc.ops_primitive import method_op, func_op, 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=simple_emit( '{dest} = CPySequenceTuple_GetItem({args[0]}, {args[1]});')) def emit_len(emitter: EmitterInterface, args: List[str], dest: str) -> None: temp = emitter.temp_name() emitter.emit_declaration('long long %s;' % temp) emitter.emit_line('%s = PyTuple_GET_SIZE(%s);' % (temp, args[0])) emitter.emit_line('%s = CPyTagged_ShortFromLongLong(%s);' % (dest, temp)) tuple_len_op = func_op(name='builtins.len', arg_types=[tuple_rprimitive], result_type=int_rprimitive,