Пример #1
0
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))
Пример #2
0
def int_binary_op(op: str,
                  c_func_name: str,
                  result_type: RType = int_rprimitive) -> None:
    binary_op(op=op,
              arg_types=[int_rprimitive, int_rprimitive],
              result_type=result_type,
              error_kind=ERR_NEVER,
              format_str='{dest} = {args[0]} %s {args[1]} :: int' % op,
              emit=call_emit(c_func_name))
Пример #3
0
                        result_type=object_rprimitive,
                        error_kind=ERR_NEVER,
                        emit=name_emit('Py_Ellipsis'),
                        is_borrowed=True)

not_implemented_op = name_ref_op(name='builtins.NotImplemented',
                                 result_type=object_rprimitive,
                                 error_kind=ERR_NEVER,
                                 emit=name_emit('Py_NotImplemented'),
                                 is_borrowed=True)

func_op(name='builtins.id',
        arg_types=[object_rprimitive],
        result_type=int_rprimitive,
        error_kind=ERR_NEVER,
        emit=call_emit('CPyTagged_Id'))

iter_op = func_op(name='builtins.iter',
                  arg_types=[object_rprimitive],
                  result_type=object_rprimitive,
                  error_kind=ERR_MAGIC,
                  emit=call_emit('PyObject_GetIter'))

coro_op = custom_op(name='get_coroutine_obj',
                    arg_types=[object_rprimitive],
                    result_type=object_rprimitive,
                    error_kind=ERR_MAGIC,
                    emit=call_emit('CPy_GetCoro'))

# 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.
Пример #4
0
# These int constructors produce object_rprimitives that then need to be unboxed
# I guess unboxing ourselves would save a check and branch though?

# For ordinary calls to int() we use a name_ref to the type
name_ref_op('builtins.int',
            result_type=object_rprimitive,
            error_kind=ERR_NEVER,
            emit=simple_emit('{dest} = (PyObject *)&PyLong_Type;'),
            is_borrowed=True)

# Convert from a float. We could do a bit better directly.
func_op(name='builtins.int',
        arg_types=[float_rprimitive],
        result_type=object_rprimitive,
        error_kind=ERR_MAGIC,
        emit=call_emit('CPyLong_FromFloat'),
        priority=1)


def int_binary_op(op: str,
                  c_func_name: str,
                  result_type: RType = int_rprimitive) -> None:
    binary_op(op=op,
              arg_types=[int_rprimitive, int_rprimitive],
              result_type=result_type,
              error_kind=ERR_NEVER,
              format_str='{dest} = {args[0]} %s {args[1]} :: int' % op,
              emit=call_emit(c_func_name))


def int_compare_op(op: str, c_func_name: str) -> None:
Пример #5
0
    simple_emit,
    call_emit,
    call_negative_bool_emit,
)

name_ref_op('builtins.list',
            result_type=object_rprimitive,
            error_kind=ERR_NEVER,
            emit=simple_emit('{dest} = (PyObject *)&PyList_Type;'),
            is_borrowed=True)

func_op(name='builtins.list',
        arg_types=[object_rprimitive],
        result_type=list_rprimitive,
        error_kind=ERR_MAGIC,
        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,
Пример #6
0
    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,
    format_str='{dest} = {args[0]} in {args[1]} :: dict',
    emit=negative_int_emit('{dest} = PyDict_Contains({args[1]}, {args[0]});'))
Пример #7
0
                       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=name_emit('Py_Ellipsis'),
                        is_borrowed=True)

iter_op = func_op(name='builtins.iter',
                  arg_types=[object_rprimitive],
                  result_type=object_rprimitive,
                  error_kind=ERR_MAGIC,
                  emit=call_emit('PyObject_GetIter'))

# 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,
                    emit=call_emit('PyIter_Next'))

method_new_op = custom_op(name='method_new',
                          arg_types=[object_rprimitive, object_rprimitive],
                          result_type=object_rprimitive,
                          error_kind=ERR_MAGIC,
                          emit=call_emit('PyMethod_New'))
Пример #8
0
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()
    emitter.emit_declaration('Py_ssize_t %s;' % temp)
    emitter.emit_line('%s = PyTuple_GET_SIZE(%s);' % (temp, args[0]))
Пример #9
0
    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,
    format_str='{dest} = {args[0]} in {args[1]} :: dict',
    emit=negative_int_emit('{dest} = PyDict_Contains({args[1]}, {args[0]});'))
Пример #10
0
from mypyc.ops import (object_rprimitive, bool_rprimitive, set_rprimitive,
                       int_rprimitive, ERR_MAGIC, ERR_FALSE, ERR_NEVER,
                       EmitterInterface)
from typing import List

new_set_op = func_op(name='builtins.set',
                     arg_types=[],
                     result_type=set_rprimitive,
                     error_kind=ERR_MAGIC,
                     emit=simple_emit('{dest} = PySet_New(NULL);'))

func_op(name='builtins.set',
        arg_types=[object_rprimitive],
        result_type=set_rprimitive,
        error_kind=ERR_MAGIC,
        emit=call_emit('PySet_New'))

func_op(name='builtins.frozenset',
        arg_types=[object_rprimitive],
        result_type=object_rprimitive,
        error_kind=ERR_MAGIC,
        emit=call_emit('PyFrozenSet_New'))


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 = PySet_GET_SIZE(%s);' % (temp, args[0]))
    emitter.emit_line('%s = CPyTagged_ShortFromLongLong(%s);' % (dest, temp))

Пример #11
0
                       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=name_emit('Py_Ellipsis'),
                        is_borrowed=True)

iter_op = func_op(name='builtins.iter',
                  arg_types=[object_rprimitive],
                  result_type=object_rprimitive,
                  error_kind=ERR_MAGIC,
                  emit=call_emit('PyObject_GetIter'))

# 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,
                    emit=call_emit('PyIter_Next'))

# Do a next, don't swallow StopIteration, but also don't
# propagate an error.
# Can return NULL: see next_op.
next_raw_op = custom_op(name='next',
                        arg_types=[object_rprimitive],
                        result_type=object_rprimitive,