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)
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