Ejemplo n.º 1
0
    def call_refexpr_with_args(self, expr: CallExpr, callee: RefExpr,
                               arg_values: List[Value]) -> Value:

        # Handle data-driven special-cased primitive call ops.
        if callee.fullname is not None and expr.arg_kinds == [ARG_POS] * len(
                arg_values):
            ops = func_ops.get(callee.fullname, [])
            target = self.builder.matching_primitive_op(
                ops, arg_values, expr.line, self.node_type(expr))
            if target:
                return target

        # Standard native call if signature and fullname are good and all arguments are positional
        # or named.
        callee_node = callee.node
        if isinstance(callee_node, OverloadedFuncDef):
            callee_node = callee_node.impl
        if (callee_node is not None and callee.fullname is not None
                and callee_node in self.mapper.func_to_decl
                and all(kind in (ARG_POS, ARG_NAMED)
                        for kind in expr.arg_kinds)):
            decl = self.mapper.func_to_decl[callee_node]
            return self.builder.call(decl, arg_values, expr.arg_kinds,
                                     expr.arg_names, expr.line)

        # Fall back to a Python call
        function = self.accept(callee)
        return self.py_call(function,
                            arg_values,
                            expr.line,
                            arg_kinds=expr.arg_kinds,
                            arg_names=expr.arg_names)
Ejemplo n.º 2
0
 def builtin_call(self, args: List[Value], fn_op: str, line: int) -> Value:
     call_c_ops_candidates = c_function_ops.get(fn_op, [])
     target = self.matching_call_c(call_c_ops_candidates, args, line)
     if target:
         return target
     ops = func_ops.get(fn_op, [])
     target = self.matching_primitive_op(ops, args, line)
     assert target, 'Unsupported builtin function: %s' % fn_op
     return target