示例#1
0
文件: builder.py 项目: wesleyks/mypy
    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):
            call_c_ops_candidates = c_function_ops.get(callee.fullname, [])
            target = self.builder.matching_call_c(call_c_ops_candidates, arg_values,
                                                  expr.line, self.node_type(expr))
            if target:
                return target
            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)
示例#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