Exemple #1
0
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)
Exemple #2
0
                       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(
Exemple #6
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_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')]: