|
34 | 34 | from mypyc.primitives.dict_ops import dict_set_item_op
|
35 | 35 | from mypyc.common import SELF_NAME, LAMBDA_NAME, decorator_helper_name
|
36 | 36 | from mypyc.sametype import is_same_method_signature
|
37 |
| -from mypyc.irbuild.util import concrete_arg_kind, is_constant |
| 37 | +from mypyc.irbuild.util import is_constant |
38 | 38 | from mypyc.irbuild.context import FuncInfo, ImplicitClass
|
39 | 39 | from mypyc.irbuild.targets import AssignmentTarget
|
40 | 40 | from mypyc.irbuild.statement import transform_try_except
|
@@ -660,9 +660,10 @@ def get_args(builder: IRBuilder, rt_args: Sequence[RuntimeArg], line: int) -> Ar
|
660 | 660 | fake_vars = [(Var(arg.name), arg.type) for arg in rt_args]
|
661 | 661 | args = [builder.read(builder.add_local_reg(var, type, is_arg=True), line)
|
662 | 662 | for var, type in fake_vars]
|
663 |
| - arg_names = [arg.name if arg.kind.is_named() else None |
| 663 | + arg_names = [arg.name |
| 664 | + if arg.kind.is_named() or (arg.kind.is_optional() and not arg.pos_only) else None |
664 | 665 | for arg in rt_args]
|
665 |
| - arg_kinds = [concrete_arg_kind(arg.kind) for arg in rt_args] |
| 666 | + arg_kinds = [arg.kind for arg in rt_args] |
666 | 667 | return ArgInfo(args, arg_names, arg_kinds)
|
667 | 668 |
|
668 | 669 |
|
@@ -705,9 +706,24 @@ def f(builder: IRBuilder, x: object) -> int: ...
|
705 | 706 | arg_info = get_args(builder, rt_args, line)
|
706 | 707 | args, arg_kinds, arg_names = arg_info.args, arg_info.arg_kinds, arg_info.arg_names
|
707 | 708 |
|
| 709 | + # We can do a passthrough *args/**kwargs with a native call, but if the |
| 710 | + # args need to get distributed out to arguments, we just let python handle it |
| 711 | + if ( |
| 712 | + any(kind.is_star() for kind in arg_kinds) |
| 713 | + and any(not arg.kind.is_star() for arg in target.decl.sig.args) |
| 714 | + ): |
| 715 | + do_pycall = True |
| 716 | + |
708 | 717 | if do_pycall:
|
| 718 | + if target.decl.kind == FUNC_STATICMETHOD: |
| 719 | + # FIXME: this won't work if we can do interpreted subclasses |
| 720 | + first = builder.builder.get_native_type(cls) |
| 721 | + st = 0 |
| 722 | + else: |
| 723 | + first = args[0] |
| 724 | + st = 1 |
709 | 725 | retval = builder.builder.py_method_call(
|
710 |
| - args[0], target.name, args[1:], line, arg_kinds[1:], arg_names[1:]) |
| 726 | + first, target.name, args[st:], line, arg_kinds[st:], arg_names[st:]) |
711 | 727 | else:
|
712 | 728 | retval = builder.builder.call(target.decl, args, arg_kinds, arg_names, line)
|
713 | 729 | retval = builder.coerce(retval, sig.ret_type, line)
|
|
0 commit comments