From b3a108e2919a60147ae23e05e457691d77321f17 Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Sat, 1 Jun 2024 01:52:33 -0700 Subject: [PATCH 1/3] [mypyc] Fix ParamSpec Fixes https://github.com/mypyc/mypyc/issues/1051 --- mypyc/irbuild/mapper.py | 3 ++ mypyc/test-data/irbuild-generics.test | 40 +++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/mypyc/irbuild/mapper.py b/mypyc/irbuild/mapper.py index a3abbb1f84fb..8130d9d0439c 100644 --- a/mypyc/irbuild/mapper.py +++ b/mypyc/irbuild/mapper.py @@ -11,6 +11,7 @@ NoneTyp, Overloaded, PartialType, + ParamSpecType, TupleType, Type, TypedDictType, @@ -123,6 +124,8 @@ def type_to_rtype(self, typ: Type | None) -> RType: return tuple_rprimitive elif isinstance(typ, CallableType): return object_rprimitive + elif isinstance(typ, ParamSpecType): + return object_rprimitive elif isinstance(typ, NoneTyp): return none_rprimitive elif isinstance(typ, UnionType): diff --git a/mypyc/test-data/irbuild-generics.test b/mypyc/test-data/irbuild-generics.test index 4f9d0ab83a16..0f253e8bcadf 100644 --- a/mypyc/test-data/irbuild-generics.test +++ b/mypyc/test-data/irbuild-generics.test @@ -148,3 +148,43 @@ L2: r4 = x L3: return r4 + + +[case testParamSpec] +from typing import Callable, ParamSpec, TypeVar + +P = ParamSpec("P") + +def execute(func: Callable[P, int], *args: P.args, **kwargs: P.kwargs) -> int: + return func(*args, **kwargs) + +def f(x: int) -> int: + return x + +execute(f, 1) +[out] +def execute(func, args, kwargs): + func, args, kwargs :: object + r0 :: list + r1 :: object + r2 :: dict + r3 :: i32 + r4 :: bit + r5 :: tuple + r6 :: object + r7 :: int +L0: + r0 = PyList_New(0) + r1 = CPyList_Extend(r0, args) + r2 = PyDict_New() + r3 = CPyDict_UpdateInDisplay(r2, kwargs) + r4 = r3 >= 0 :: signed + r5 = PyList_AsTuple(r0) + r6 = PyObject_Call(func, r5, r2) + r7 = unbox(int, r6) + return r7 +def f(x): + x :: int +L0: + return x + From b3c328e403af101537725ac7972a069d0e1eadfb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 08:54:56 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/irbuild/mapper.py | 2 +- mypyc/test-data/irbuild-generics.test | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mypyc/irbuild/mapper.py b/mypyc/irbuild/mapper.py index 8130d9d0439c..9b55fd2b8a89 100644 --- a/mypyc/irbuild/mapper.py +++ b/mypyc/irbuild/mapper.py @@ -10,8 +10,8 @@ LiteralType, NoneTyp, Overloaded, - PartialType, ParamSpecType, + PartialType, TupleType, Type, TypedDictType, diff --git a/mypyc/test-data/irbuild-generics.test b/mypyc/test-data/irbuild-generics.test index 0f253e8bcadf..9d5c401ab46b 100644 --- a/mypyc/test-data/irbuild-generics.test +++ b/mypyc/test-data/irbuild-generics.test @@ -187,4 +187,3 @@ def f(x): x :: int L0: return x - From b27f70406fd05db21a0de34b912527aaba429596 Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Sat, 1 Jun 2024 03:10:44 -0700 Subject: [PATCH 3/3] . --- mypyc/irbuild/mapper.py | 7 ++----- mypyc/test-data/irbuild-generics.test | 4 +++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mypyc/irbuild/mapper.py b/mypyc/irbuild/mapper.py index 9b55fd2b8a89..90ce0e16c741 100644 --- a/mypyc/irbuild/mapper.py +++ b/mypyc/irbuild/mapper.py @@ -10,13 +10,12 @@ LiteralType, NoneTyp, Overloaded, - ParamSpecType, PartialType, TupleType, Type, TypedDictType, TypeType, - TypeVarType, + TypeVarLikeType, UnboundType, UninhabitedType, UnionType, @@ -124,8 +123,6 @@ def type_to_rtype(self, typ: Type | None) -> RType: return tuple_rprimitive elif isinstance(typ, CallableType): return object_rprimitive - elif isinstance(typ, ParamSpecType): - return object_rprimitive elif isinstance(typ, NoneTyp): return none_rprimitive elif isinstance(typ, UnionType): @@ -134,7 +131,7 @@ def type_to_rtype(self, typ: Type | None) -> RType: return object_rprimitive elif isinstance(typ, TypeType): return object_rprimitive - elif isinstance(typ, TypeVarType): + elif isinstance(typ, TypeVarLikeType): # Erase type variable to upper bound. # TODO: Erase to union if object has value restriction? return self.type_to_rtype(typ.upper_bound) diff --git a/mypyc/test-data/irbuild-generics.test b/mypyc/test-data/irbuild-generics.test index 9d5c401ab46b..910148f80dda 100644 --- a/mypyc/test-data/irbuild-generics.test +++ b/mypyc/test-data/irbuild-generics.test @@ -164,7 +164,9 @@ def f(x: int) -> int: execute(f, 1) [out] def execute(func, args, kwargs): - func, args, kwargs :: object + func :: object + args :: tuple + kwargs :: dict r0 :: list r1 :: object r2 :: dict