Esempio n. 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))
Esempio n. 2
0
                          emit=call_emit('PyMethod_New'))

# Check if the current exception is a StopIteration and return its value if so.
# Treats "no exception" as StopIteration with a None value.
# If it is a different exception, re-reraise it.
check_stop_op = custom_op(name='check_stop_iteration',
                          arg_types=[],
                          result_type=object_rprimitive,
                          error_kind=ERR_MAGIC,
                          emit=call_emit('CPy_FetchStopIterationValue'))

# Negate a primitive bool
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)

# Determine the most derived metaclass and check for metaclass conflicts.
# Arguments are (metaclass, bases).
py_calc_meta_op = custom_op(
    arg_types=[object_rprimitive, object_rprimitive],
    result_type=object_rprimitive,
    error_kind=ERR_MAGIC,
    format_str='{dest} = py_calc_metaclass({comma_args})',
    emit=simple_emit(
        '{dest} = (PyObject*) _PyType_CalculateMetaclass((PyTypeObject *){args[0]}, {args[1]});'
    ),
    is_borrowed=True)
Esempio n. 3
0
binary_op(name='in',
          arg_types=[object_rprimitive, object_rprimitive],
          return_type=c_int_rprimitive,
          c_function_name='PySequence_Contains',
          error_kind=ERR_NEG_INT,
          truncated_type=bool_rprimitive,
          ordering=[1, 0],
          priority=0)

# Unary operations

for op, funcname in [('-', 'PyNumber_Negative'), ('+', 'PyNumber_Positive'),
                     ('~', 'PyNumber_Invert')]:
    unary_op(name=op,
             arg_type=object_rprimitive,
             return_type=object_rprimitive,
             c_function_name=funcname,
             error_kind=ERR_MAGIC,
             priority=0)

unary_op(name='not',
         arg_type=object_rprimitive,
         return_type=c_int_rprimitive,
         c_function_name='PyObject_Not',
         error_kind=ERR_NEG_INT,
         truncated_type=bool_rprimitive,
         priority=0)

# obj1[obj2]
method_op(name='__getitem__',
          arg_types=[object_rprimitive, object_rprimitive],
          return_type=object_rprimitive,
Esempio n. 4
0
binary_op('is not',
          arg_types=[object_rprimitive, object_rprimitive],
          result_type=bool_rprimitive,
          error_kind=ERR_NEVER,
          emit=simple_emit('{dest} = {args[0]} != {args[1]};'),
          priority=0)


# Unary operations

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=call_emit(funcname),
             priority=0)

unary_op(op='not',
         arg_type=object_rprimitive,
         result_type=bool_rprimitive,
         error_kind=ERR_MAGIC,
         format_str='{dest} = not {args[0]}',
         emit=call_negative_magic_emit('PyObject_Not'),
         priority=0)


# obj1[obj2]
method_op('__getitem__',
          arg_types=[object_rprimitive, object_rprimitive],
Esempio n. 5
0
def int_unary_op(name: str, c_function_name: str) -> CFunctionDescription:
    return unary_op(name=name,
                    arg_type=int_rprimitive,
                    return_type=int_rprimitive,
                    c_function_name=c_function_name,
                    error_kind=ERR_NEVER)