def int_binary_op(name: str, c_function_name: str, return_type: RType = int_rprimitive, error_kind: int = ERR_NEVER) -> None: c_binary_op(name=name, arg_types=[int_rprimitive, int_rprimitive], return_type=return_type, c_function_name=c_function_name, error_kind=error_kind)
arg_types=[list_rprimitive, int_rprimitive], return_type=object_rprimitive, c_function_name='CPyList_Pop', error_kind=ERR_MAGIC) # list.count(obj) c_method_op(name='count', arg_types=[list_rprimitive, object_rprimitive], return_type=short_int_rprimitive, c_function_name='CPyList_Count', error_kind=ERR_MAGIC) # list * int c_binary_op(name='*', arg_types=[list_rprimitive, int_rprimitive], return_type=list_rprimitive, c_function_name='CPySequence_Multiply', error_kind=ERR_MAGIC) # int * list c_binary_op(name='*', arg_types=[int_rprimitive, list_rprimitive], return_type=list_rprimitive, c_function_name='CPySequence_RMultiply', error_kind=ERR_MAGIC) 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 = PyList_GET_SIZE(%s);' % (temp, args[0]))
) # Binary operations for op, opid in [('==', 2), # PY_EQ ('!=', 3), # PY_NE ('<', 0), # PY_LT ('<=', 1), # PY_LE ('>', 4), # PY_GT ('>=', 5)]: # PY_GE # The result type is 'object' since that's what PyObject_RichCompare returns. c_binary_op(name=op, arg_types=[object_rprimitive, object_rprimitive], return_type=object_rprimitive, c_function_name='PyObject_RichCompare', error_kind=ERR_MAGIC, extra_int_constants=[(opid, c_int_rprimitive)], priority=0) for op, funcname in [('+', 'PyNumber_Add'), ('-', 'PyNumber_Subtract'), ('*', 'PyNumber_Multiply'), ('//', 'PyNumber_FloorDivide'), ('/', 'PyNumber_TrueDivide'), ('%', 'PyNumber_Remainder'), ('<<', 'PyNumber_Lshift'), ('>>', 'PyNumber_Rshift'), ('&', 'PyNumber_And'), ('^', 'PyNumber_Xor'), ('|', 'PyNumber_Or')]:
# Get the 'str' type object. load_address_op(name='builtins.str', type=object_rprimitive, src='PyUnicode_Type') # str(obj) c_function_op(name='builtins.str', arg_types=[object_rprimitive], return_type=str_rprimitive, c_function_name='PyObject_Str', error_kind=ERR_MAGIC) # str1 + str2 c_binary_op(name='+', arg_types=[str_rprimitive, str_rprimitive], return_type=str_rprimitive, c_function_name='PyUnicode_Concat', error_kind=ERR_MAGIC) # str.join(obj) c_method_op(name='join', arg_types=[str_rprimitive, object_rprimitive], return_type=str_rprimitive, c_function_name='PyUnicode_Join', error_kind=ERR_MAGIC) # str[index] (for an int index) c_method_op(name='__getitem__', arg_types=[str_rprimitive, int_rprimitive], return_type=str_rprimitive, c_function_name='CPyStr_GetItem',
c_function_name='CPyDict_GetItem', error_kind=ERR_MAGIC) # dict[key] = value dict_set_item_op = c_method_op( name='__setitem__', arg_types=[dict_rprimitive, object_rprimitive, object_rprimitive], return_type=c_int_rprimitive, c_function_name='CPyDict_SetItem', error_kind=ERR_NEG_INT) # key in dict c_binary_op(name='in', arg_types=[object_rprimitive, dict_rprimitive], return_type=c_int_rprimitive, c_function_name='PyDict_Contains', error_kind=ERR_NEG_INT, truncated_type=bool_rprimitive, ordering=[1, 0]) # dict1.update(dict2) dict_update_op = c_method_op(name='update', arg_types=[dict_rprimitive, dict_rprimitive], return_type=c_int_rprimitive, c_function_name='CPyDict_Update', error_kind=ERR_NEG_INT, priority=2) # Operation used for **value in dict displays. # This is mostly like dict.update(obj), but has customized error handling. dict_update_in_display_op = c_custom_op(
) # Binary operations for op, opid in [('==', 2), # PY_EQ ('!=', 3), # PY_NE ('<', 0), # PY_LT ('<=', 1), # PY_LE ('>', 4), # PY_GT ('>=', 5)]: # PY_GE # The result type is 'object' since that's what PyObject_RichCompare returns. c_binary_op(name=op, arg_types=[object_rprimitive, object_rprimitive], return_type=object_rprimitive, c_function_name='PyObject_RichCompare', error_kind=ERR_MAGIC, extra_int_constant=(opid, c_int_rprimitive), priority=0) for op, funcname in [('+', 'PyNumber_Add'), ('-', 'PyNumber_Subtract'), ('*', 'PyNumber_Multiply'), ('//', 'PyNumber_FloorDivide'), ('/', 'PyNumber_TrueDivide'), ('%', 'PyNumber_Remainder'), ('<<', 'PyNumber_Lshift'), ('>>', 'PyNumber_Rshift'), ('&', 'PyNumber_And'), ('^', 'PyNumber_Xor'), ('|', 'PyNumber_Or')]: