From 5b87bdc23d0e7e5e10710b58f9ee3bd53b12a9a6 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 01/19] feat: new primitive for `weakref.__call__` --- mypyc/ir/rtypes.py | 5 +++++ mypyc/primitives/weakref_ops.py | 14 +++++++++++--- mypyc/test-data/irbuild-weakref.test | 18 ++++++++++++------ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/mypyc/ir/rtypes.py b/mypyc/ir/rtypes.py index c0871bba258c..d3fe657c725f 100644 --- a/mypyc/ir/rtypes.py +++ b/mypyc/ir/rtypes.py @@ -512,6 +512,11 @@ def __hash__(self) -> int: # Python range object. range_rprimitive: Final = RPrimitive("builtins.range", is_unboxed=False, is_refcounted=True) +# Python weak reference object +weakref_rprimitive: Final = RPrimitive( + "weakref.ReferenceType", is_unboxed=False, is_refcounted=True +) + def is_tagged(rtype: RType) -> bool: return rtype is int_rprimitive or rtype is short_int_rprimitive diff --git a/mypyc/primitives/weakref_ops.py b/mypyc/primitives/weakref_ops.py index a7ac035b22a4..49547b86714e 100644 --- a/mypyc/primitives/weakref_ops.py +++ b/mypyc/primitives/weakref_ops.py @@ -1,6 +1,6 @@ from mypyc.ir.ops import ERR_MAGIC -from mypyc.ir.rtypes import object_rprimitive, pointer_rprimitive -from mypyc.primitives.registry import function_op +from mypyc.ir.rtypes import object_rprimitive, pointer_rprimitive, weakref_rprimitive +from mypyc.primitives.registry import ERR_NEG_INT, function_op, method_op # Weakref operations @@ -16,7 +16,15 @@ new_ref__with_callback_op = function_op( name="weakref.ReferenceType", arg_types=[object_rprimitive, object_rprimitive], - return_type=object_rprimitive, + return_type=weakref_rprimitive, c_function_name="PyWeakref_NewRef", error_kind=ERR_MAGIC, ) + +deref_op = method_op( + name="__call__", + arg_types=[weakref_rprimitive], + return_type=object_rprimitive, + c_function_name="PyWeakref_GetRef", + error_kind=ERR_NEG_INT, +) diff --git a/mypyc/test-data/irbuild-weakref.test b/mypyc/test-data/irbuild-weakref.test index 58ac6417d297..bcc94cf8080d 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -15,14 +15,17 @@ L0: import weakref from typing import Any, Callable def f(x: object, cb: Callable[[object], Any]) -> object: - return weakref.ref(x, cb) + return weakref.ref(x, cb)() [out] def f(x, cb): - x, cb, r0 :: object + x, cb :: object + r0 :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, cb) - return r0 + r1 = PyWeakref_GetRef(r0) + return r1 [case testFromWeakrefRef] from typing import Any, Callable @@ -41,11 +44,14 @@ L0: from typing import Any, Callable from weakref import ref def f(x: object, cb: Callable[[object], Any]) -> object: - return ref(x, cb) + return ref(x, cb)() [out] def f(x, cb): - x, cb, r0 :: object + x, cb :: object + r0 :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, cb) - return r0 + r1 = PyWeakref_GetRef(r0) + return r1 From d0ee2f0c65e692b032525153c25b4a700e96b7e0 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 02/19] fix: error: "ReferenceType[object]" not callable --- test-data/unit/lib-stub/weakref.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/test-data/unit/lib-stub/weakref.pyi b/test-data/unit/lib-stub/weakref.pyi index 34e01f4d48f1..5e88a8d902df 100644 --- a/test-data/unit/lib-stub/weakref.pyi +++ b/test-data/unit/lib-stub/weakref.pyi @@ -7,5 +7,6 @@ _T = TypeVar("_T") class ReferenceType(Generic[_T]): # "weakref" __callback__: Callable[[Self], Any] def __new__(cls, o: _T, callback: Callable[[Self], Any] | None = ..., /) -> Self: ... + def __call__(self) -> _T: ... ref = ReferenceType From da46e55ace810fdfbc3c0bbe2939a8b7313afb55 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 03/19] fix: return type --- mypyc/primitives/weakref_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/primitives/weakref_ops.py b/mypyc/primitives/weakref_ops.py index 49547b86714e..ba2975526767 100644 --- a/mypyc/primitives/weakref_ops.py +++ b/mypyc/primitives/weakref_ops.py @@ -7,7 +7,7 @@ new_ref_op = function_op( name="weakref.ReferenceType", arg_types=[object_rprimitive], - return_type=object_rprimitive, + return_type=weakref_rprimitive, c_function_name="PyWeakref_NewRef", extra_int_constants=[(0, pointer_rprimitive)], error_kind=ERR_MAGIC, From 56a6ef5850009120e3c2bd55f792c9cc360eeceb Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 04/19] fix: testdata --- mypyc/test-data/irbuild-weakref.test | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mypyc/test-data/irbuild-weakref.test b/mypyc/test-data/irbuild-weakref.test index bcc94cf8080d..9bec58f884e5 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -2,14 +2,17 @@ import weakref from typing import Any, Callable def f(x: object) -> object: - return weakref.ref(x) + return weakref.ref(x)() [out] def f(x): - x, r0 :: object + x :: object + r0 :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, 0) - return r0 + r1 = PyWeakref_GetRef(r0) + return r1 [case testWeakrefRefCallback] import weakref @@ -31,14 +34,17 @@ L0: from typing import Any, Callable from weakref import ref def f(x: object) -> object: - return ref(x) + return ref(x)() [out] def f(x): - x, r0 :: object + x :: object + r0 :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, 0) - return r0 + r1 = PyWeakref_GetRef(r0) + return r1 [case testFromWeakrefRefCallback] from typing import Any, Callable From 6eb7b5a3ee393fc9c8b78575e2988370c1e109d5 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 05/19] fix: use custom_op --- mypyc/codegen/emit.py | 3 +- mypyc/ir/rtypes.py | 4 +++ mypyc/irbuild/specialize.py | 11 ++++++ mypyc/lib-rt/misc_ops.c | 15 ++++++++ mypyc/primitives/weakref_ops.py | 10 +++--- mypyc/test-data/irbuild-weakref.test | 53 +++++++++++++++++++--------- 6 files changed, 74 insertions(+), 22 deletions(-) diff --git a/mypyc/codegen/emit.py b/mypyc/codegen/emit.py index 8c4a69cfa3cb..f4053a2c8042 100644 --- a/mypyc/codegen/emit.py +++ b/mypyc/codegen/emit.py @@ -48,6 +48,7 @@ is_str_rprimitive, is_tuple_rprimitive, is_uint8_rprimitive, + is_weakref_rprimitive, object_rprimitive, optional_value_type, ) @@ -704,7 +705,7 @@ def emit_cast( self.emit_lines(f" {dest} = {src};", "else {") self.emit_cast_error_handler(error, src, dest, typ, raise_exception) self.emit_line("}") - elif is_object_rprimitive(typ): + elif is_object_rprimitive(typ) or is_weakref_rprimitive(typ): if declare_dest: self.emit_line(f"PyObject *{dest};") self.emit_arg_check(src, dest, typ, "", optional) diff --git a/mypyc/ir/rtypes.py b/mypyc/ir/rtypes.py index d3fe657c725f..c683268b4387 100644 --- a/mypyc/ir/rtypes.py +++ b/mypyc/ir/rtypes.py @@ -637,6 +637,10 @@ def is_sequence_rprimitive(rtype: RType) -> bool: ) +def is_weakref_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]: + return isinstance(rtype, RPrimitive) and rtype.name == "weakref.ReferenceType" + + class TupleNameVisitor(RTypeVisitor[str]): """Produce a tuple name based on the concrete representations of types.""" diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 3015640fb3fd..5b67def6adf6 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -31,6 +31,7 @@ RefExpr, StrExpr, TupleExpr, + Var, ) from mypy.types import AnyType, TypeOfAny from mypyc.ir.ops import ( @@ -103,6 +104,7 @@ str_encode_utf8_strict, ) from mypyc.primitives.tuple_ops import isinstance_tuple, new_tuple_set_item_op +from mypyc.primitives.weakref_ops import weakref_deref_op # Specializers are attempted before compiling the arguments to the # function. Specializers can return None to indicate that they failed @@ -140,6 +142,15 @@ def apply_function_specialization( builder: IRBuilder, expr: CallExpr, callee: RefExpr ) -> Value | None: """Invoke the Specializer callback for a function if one has been registered""" + if ( + isinstance(callee, NameExpr) + and isinstance(callee.node, Var) + # NOTE: why is this not a weakref rprimitive? + # TODO: fix to weakref rprimitive so _apply_specialization can use the custom_op + and str(callee.node.type).startswith("weakref.ReferenceType") + and len(expr.args) == 0 + ): + return builder.call_c(weakref_deref_op, [builder.accept(expr.callee)], expr.line) return _apply_specialization(builder, expr, callee, callee.fullname) diff --git a/mypyc/lib-rt/misc_ops.c b/mypyc/lib-rt/misc_ops.c index 3787ea553037..7c856f19e468 100644 --- a/mypyc/lib-rt/misc_ops.c +++ b/mypyc/lib-rt/misc_ops.c @@ -1098,3 +1098,18 @@ void CPy_SetImmortal(PyObject *obj) { } #endif + + +PyObject *CPyWeakref_GetRef(PyObject *ref) +{ + PyObject *obj = NULL; + int success = PyWeakref_GetRef(ref, &obj); + if (success == -1) { + return NULL; + } else if (obj == NULL) { + Py_INCREF(Py_None); + return Py_None; + } else { + return obj; + } +} \ No newline at end of file diff --git a/mypyc/primitives/weakref_ops.py b/mypyc/primitives/weakref_ops.py index ba2975526767..593dbca43093 100644 --- a/mypyc/primitives/weakref_ops.py +++ b/mypyc/primitives/weakref_ops.py @@ -1,6 +1,6 @@ from mypyc.ir.ops import ERR_MAGIC from mypyc.ir.rtypes import object_rprimitive, pointer_rprimitive, weakref_rprimitive -from mypyc.primitives.registry import ERR_NEG_INT, function_op, method_op +from mypyc.primitives.registry import custom_op, function_op # Weakref operations @@ -21,10 +21,10 @@ error_kind=ERR_MAGIC, ) -deref_op = method_op( - name="__call__", +# TODO: generate specialized versions of this that return the properr rtype +weakref_deref_op = custom_op( arg_types=[weakref_rprimitive], return_type=object_rprimitive, - c_function_name="PyWeakref_GetRef", - error_kind=ERR_NEG_INT, + c_function_name="CPyWeakref_GetRef", + error_kind=ERR_MAGIC, ) diff --git a/mypyc/test-data/irbuild-weakref.test b/mypyc/test-data/irbuild-weakref.test index 9bec58f884e5..0437ad7bab33 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -2,62 +2,83 @@ import weakref from typing import Any, Callable def f(x: object) -> object: - return weakref.ref(x)() + ref = weakref.ref(x) + return ref() [out] def f(x): x :: object r0 :: weakref.ReferenceType - r1 :: object + ref :: object + r1 :: weakref.ReferenceType + r2 :: object L0: r0 = PyWeakref_NewRef(x, 0) - r1 = PyWeakref_GetRef(r0) - return r1 + ref = r0 + r1 = cast(weakref.ReferenceType, ref) + r2 = CPyWeakref_GetRef(r1) + return r2 [case testWeakrefRefCallback] import weakref from typing import Any, Callable def f(x: object, cb: Callable[[object], Any]) -> object: - return weakref.ref(x, cb)() + ref = weakref.ref(x, cb) + return ref() [out] def f(x, cb): x, cb :: object r0 :: weakref.ReferenceType - r1 :: object + ref :: object + r1 :: weakref.ReferenceType + r2 :: object L0: r0 = PyWeakref_NewRef(x, cb) - r1 = PyWeakref_GetRef(r0) - return r1 + ref = r0 + r1 = cast(weakref.ReferenceType, ref) + r2 = CPyWeakref_GetRef(r1) + return r2 [case testFromWeakrefRef] from typing import Any, Callable from weakref import ref def f(x: object) -> object: - return ref(x)() + r = ref(x) + return r() [out] def f(x): x :: object r0 :: weakref.ReferenceType - r1 :: object + r :: object + r1 :: weakref.ReferenceType + r2 :: object L0: r0 = PyWeakref_NewRef(x, 0) - r1 = PyWeakref_GetRef(r0) - return r1 + r = r0 + r1 = cast(weakref.ReferenceType, r) + r2 = CPyWeakref_GetRef(r1) + return r2 [case testFromWeakrefRefCallback] from typing import Any, Callable from weakref import ref def f(x: object, cb: Callable[[object], Any]) -> object: - return ref(x, cb)() + r = ref(x, cb) + return r() [out] def f(x, cb): x, cb :: object r0 :: weakref.ReferenceType - r1 :: object + r :: object + r1 :: weakref.ReferenceType + r2 :: object L0: r0 = PyWeakref_NewRef(x, cb) - r1 = PyWeakref_GetRef(r0) - return r1 + r = r0 + r1 = cast(weakref.ReferenceType, r) + r2 = CPyWeakref_GetRef(r1) + return r2 + From 1de78bf01d49f865c9943080cddf23f09f2f1cbf Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 06/19] fix: add CPyWeakref_GetRef to headers --- mypyc/lib-rt/CPy.h | 1 + 1 file changed, 1 insertion(+) diff --git a/mypyc/lib-rt/CPy.h b/mypyc/lib-rt/CPy.h index 1881aa97f308..56eb2fcc79f1 100644 --- a/mypyc/lib-rt/CPy.h +++ b/mypyc/lib-rt/CPy.h @@ -928,6 +928,7 @@ PyObject *CPySingledispatch_RegisterFunction(PyObject *singledispatch_func, PyOb PyObject *CPy_GetAIter(PyObject *obj); PyObject *CPy_GetANext(PyObject *aiter); +PyObject *CPyWeakref_GetRef(PyObject *ref); void CPy_SetTypeAliasTypeComputeFunction(PyObject *alias, PyObject *compute_value); void CPyTrace_LogEvent(const char *location, const char *line, const char *op, const char *details); From e32043071ebdf0506e47e516aecb99f8ec1a72e0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 07/19] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/lib-rt/misc_ops.c | 2 +- mypyc/test-data/irbuild-weakref.test | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mypyc/lib-rt/misc_ops.c b/mypyc/lib-rt/misc_ops.c index 7c856f19e468..ec5fb1961114 100644 --- a/mypyc/lib-rt/misc_ops.c +++ b/mypyc/lib-rt/misc_ops.c @@ -1112,4 +1112,4 @@ PyObject *CPyWeakref_GetRef(PyObject *ref) } else { return obj; } -} \ No newline at end of file +} diff --git a/mypyc/test-data/irbuild-weakref.test b/mypyc/test-data/irbuild-weakref.test index 0437ad7bab33..2e097c904e47 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -81,4 +81,3 @@ L0: r1 = cast(weakref.ReferenceType, r) r2 = CPyWeakref_GetRef(r1) return r2 - From 47ab0d4a3990a4d9183229b9acc8e2c6926ad2c7 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Mon, 4 Aug 2025 02:19:00 +0000 Subject: [PATCH 08/19] Update weakref.pyi --- test-data/unit/lib-stub/weakref.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test-data/unit/lib-stub/weakref.pyi b/test-data/unit/lib-stub/weakref.pyi index 5e88a8d902df..81ee8de8cfdc 100644 --- a/test-data/unit/lib-stub/weakref.pyi +++ b/test-data/unit/lib-stub/weakref.pyi @@ -1,5 +1,5 @@ from collections.abc import Callable -from typing import Any, Generic, TypeVar +from typing import Any, Generic, Optional, TypeVar from typing_extensions import Self _T = TypeVar("_T") @@ -7,6 +7,6 @@ _T = TypeVar("_T") class ReferenceType(Generic[_T]): # "weakref" __callback__: Callable[[Self], Any] def __new__(cls, o: _T, callback: Callable[[Self], Any] | None = ..., /) -> Self: ... - def __call__(self) -> _T: ... + def __call__(self) -> Optional[_T]: ... ref = ReferenceType From 1f3d146702abf9c1a92dc2df347620d3b47827d6 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 5 Aug 2025 19:36:49 -0400 Subject: [PATCH 09/19] Update mapper.py --- mypyc/irbuild/mapper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mypyc/irbuild/mapper.py b/mypyc/irbuild/mapper.py index 815688d90fb6..145a297845b8 100644 --- a/mypyc/irbuild/mapper.py +++ b/mypyc/irbuild/mapper.py @@ -46,6 +46,7 @@ str_rprimitive, tuple_rprimitive, uint8_rprimitive, + weakref_rprimitive, ) @@ -102,6 +103,8 @@ def type_to_rtype(self, typ: Type | None) -> RType: return tuple_rprimitive # Varying-length tuple elif typ.type.fullname == "builtins.range": return range_rprimitive + elif typ.type.fullname == "weakref.ReferenceType": + return weakref_rprimitive elif typ.type in self.type_to_ir: inst = RInstance(self.type_to_ir[typ.type]) # Treat protocols as Union[protocol, object], so that we can do fast From c943f4f50e23475ca50d261c06e8743189a30bca Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Tue, 5 Aug 2025 23:50:18 +0000 Subject: [PATCH 10/19] fix IR for new mapping --- mypyc/test-data/irbuild-weakref.test | 45 +++++++++++----------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/mypyc/test-data/irbuild-weakref.test b/mypyc/test-data/irbuild-weakref.test index 2e097c904e47..109c681a843e 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -8,16 +8,13 @@ def f(x: object) -> object: [out] def f(x): x :: object - r0 :: weakref.ReferenceType - ref :: object - r1 :: weakref.ReferenceType - r2 :: object + r0, ref :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, 0) ref = r0 - r1 = cast(weakref.ReferenceType, ref) - r2 = CPyWeakref_GetRef(r1) - return r2 + r1 = CPyWeakref_GetRef(ref) + return r1 [case testWeakrefRefCallback] import weakref @@ -29,16 +26,13 @@ def f(x: object, cb: Callable[[object], Any]) -> object: [out] def f(x, cb): x, cb :: object - r0 :: weakref.ReferenceType - ref :: object - r1 :: weakref.ReferenceType - r2 :: object + r0, ref :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, cb) ref = r0 - r1 = cast(weakref.ReferenceType, ref) - r2 = CPyWeakref_GetRef(r1) - return r2 + r1 = CPyWeakref_GetRef(ref) + return r1 [case testFromWeakrefRef] from typing import Any, Callable @@ -50,16 +44,13 @@ def f(x: object) -> object: [out] def f(x): x :: object - r0 :: weakref.ReferenceType - r :: object - r1 :: weakref.ReferenceType - r2 :: object + r0, r :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, 0) r = r0 - r1 = cast(weakref.ReferenceType, r) - r2 = CPyWeakref_GetRef(r1) - return r2 + r1 = CPyWeakref_GetRef(r) + return r1 [case testFromWeakrefRefCallback] from typing import Any, Callable @@ -71,13 +62,11 @@ def f(x: object, cb: Callable[[object], Any]) -> object: [out] def f(x, cb): x, cb :: object - r0 :: weakref.ReferenceType - r :: object - r1 :: weakref.ReferenceType - r2 :: object + r0, r :: weakref.ReferenceType + r1 :: object L0: r0 = PyWeakref_NewRef(x, cb) r = r0 - r1 = cast(weakref.ReferenceType, r) - r2 = CPyWeakref_GetRef(r1) - return r2 + r1 = CPyWeakref_GetRef(r) + return r1 + From 9ead556ebb4d0101fe2390a5c582888b5dbd48a9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 23:52:12 +0000 Subject: [PATCH 11/19] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/test-data/irbuild-weakref.test | 1 - 1 file changed, 1 deletion(-) diff --git a/mypyc/test-data/irbuild-weakref.test b/mypyc/test-data/irbuild-weakref.test index 109c681a843e..fe380d1489a2 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -69,4 +69,3 @@ L0: r = r0 r1 = CPyWeakref_GetRef(r) return r1 - From 1a14d97948431b714eb1d1d0cada0f963a724096 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 5 Aug 2025 19:52:40 -0400 Subject: [PATCH 12/19] Update specialize.py --- mypyc/irbuild/specialize.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 5b67def6adf6..500a042ba866 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -144,10 +144,11 @@ def apply_function_specialization( """Invoke the Specializer callback for a function if one has been registered""" if ( isinstance(callee, NameExpr) - and isinstance(callee.node, Var) + # and isinstance(callee.node, Var) # NOTE: why is this not a weakref rprimitive? # TODO: fix to weakref rprimitive so _apply_specialization can use the custom_op - and str(callee.node.type).startswith("weakref.ReferenceType") + and is_weakref_rprimitive(builder.node_type(callee.node)) + # and str(callee.node.type).startswith("weakref.ReferenceType") and len(expr.args) == 0 ): return builder.call_c(weakref_deref_op, [builder.accept(expr.callee)], expr.line) From 82483ebd02e666af643d6eb49369d4f2c78e4354 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Aug 2025 23:55:12 +0000 Subject: [PATCH 13/19] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/irbuild/specialize.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 500a042ba866..95e62695c4fc 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -31,7 +31,6 @@ RefExpr, StrExpr, TupleExpr, - Var, ) from mypy.types import AnyType, TypeOfAny from mypyc.ir.ops import ( From 7c2d36b4a63c3974135b608dd439a6dd6fa4576b Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Wed, 6 Aug 2025 00:01:39 +0000 Subject: [PATCH 14/19] fix: missing import --- mypyc/irbuild/specialize.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 5b67def6adf6..6ef3dd052c3d 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -66,6 +66,7 @@ is_int_rprimitive, is_list_rprimitive, is_uint8_rprimitive, + is_weakref_rprimitive, list_rprimitive, set_rprimitive, str_rprimitive, From 6e8b738d01a5a3e94ce388486e4c5faf8416e0ee Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Wed, 6 Aug 2025 00:02:22 +0000 Subject: [PATCH 15/19] fix mypy err --- mypyc/irbuild/specialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 07e65d98c421..7757fc8d8dbd 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -147,7 +147,7 @@ def apply_function_specialization( # and isinstance(callee.node, Var) # NOTE: why is this not a weakref rprimitive? # TODO: fix to weakref rprimitive so _apply_specialization can use the custom_op - and is_weakref_rprimitive(builder.node_type(callee.node)) + and is_weakref_rprimitive(builder.node_type(callee)) # and str(callee.node.type).startswith("weakref.ReferenceType") and len(expr.args) == 0 ): From fe27d2cbc3a5d602007c409ae6e66255e0d8808a Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:14:46 -0400 Subject: [PATCH 16/19] Update specialize.py --- mypyc/irbuild/specialize.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 7757fc8d8dbd..1d863706a946 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -142,15 +142,7 @@ def apply_function_specialization( builder: IRBuilder, expr: CallExpr, callee: RefExpr ) -> Value | None: """Invoke the Specializer callback for a function if one has been registered""" - if ( - isinstance(callee, NameExpr) - # and isinstance(callee.node, Var) - # NOTE: why is this not a weakref rprimitive? - # TODO: fix to weakref rprimitive so _apply_specialization can use the custom_op - and is_weakref_rprimitive(builder.node_type(callee)) - # and str(callee.node.type).startswith("weakref.ReferenceType") - and len(expr.args) == 0 - ): + if is_weakref_rprimitive(builder.node_type(callee)) and len(expr.args) == 0: return builder.call_c(weakref_deref_op, [builder.accept(expr.callee)], expr.line) return _apply_specialization(builder, expr, callee, callee.fullname) From 533501f976332f156ee0f7c4b9d9ff4d7309378e Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:16:30 -0400 Subject: [PATCH 17/19] Update emit.py --- mypyc/codegen/emit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/codegen/emit.py b/mypyc/codegen/emit.py index f4053a2c8042..2877a20627a3 100644 --- a/mypyc/codegen/emit.py +++ b/mypyc/codegen/emit.py @@ -705,7 +705,7 @@ def emit_cast( self.emit_lines(f" {dest} = {src};", "else {") self.emit_cast_error_handler(error, src, dest, typ, raise_exception) self.emit_line("}") - elif is_object_rprimitive(typ) or is_weakref_rprimitive(typ): + elif is_object_rprimitive(typ): # or is_weakref_rprimitive(typ): if declare_dest: self.emit_line(f"PyObject *{dest};") self.emit_arg_check(src, dest, typ, "", optional) From 828447b8d890e5203ba82d6ad3320fd90aa3caa1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:19:28 +0000 Subject: [PATCH 18/19] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/codegen/emit.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mypyc/codegen/emit.py b/mypyc/codegen/emit.py index 2877a20627a3..7041b576229f 100644 --- a/mypyc/codegen/emit.py +++ b/mypyc/codegen/emit.py @@ -48,7 +48,6 @@ is_str_rprimitive, is_tuple_rprimitive, is_uint8_rprimitive, - is_weakref_rprimitive, object_rprimitive, optional_value_type, ) @@ -705,7 +704,7 @@ def emit_cast( self.emit_lines(f" {dest} = {src};", "else {") self.emit_cast_error_handler(error, src, dest, typ, raise_exception) self.emit_line("}") - elif is_object_rprimitive(typ): # or is_weakref_rprimitive(typ): + elif is_object_rprimitive(typ): # or is_weakref_rprimitive(typ): if declare_dest: self.emit_line(f"PyObject *{dest};") self.emit_arg_check(src, dest, typ, "", optional) From 3b51373bb61afc0d821b38d647eed1944b0464f5 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:29:43 -0400 Subject: [PATCH 19/19] Update emit.py --- mypyc/codegen/emit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/codegen/emit.py b/mypyc/codegen/emit.py index 7041b576229f..8c4a69cfa3cb 100644 --- a/mypyc/codegen/emit.py +++ b/mypyc/codegen/emit.py @@ -704,7 +704,7 @@ def emit_cast( self.emit_lines(f" {dest} = {src};", "else {") self.emit_cast_error_handler(error, src, dest, typ, raise_exception) self.emit_line("}") - elif is_object_rprimitive(typ): # or is_weakref_rprimitive(typ): + elif is_object_rprimitive(typ): if declare_dest: self.emit_line(f"PyObject *{dest};") self.emit_arg_check(src, dest, typ, "", optional)