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..ba2975526767 100644 --- a/mypyc/primitives/weakref_ops.py +++ b/mypyc/primitives/weakref_ops.py @@ -1,13 +1,13 @@ 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 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, @@ -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..9bec58f884e5 100644 --- a/mypyc/test-data/irbuild-weakref.test +++ b/mypyc/test-data/irbuild-weakref.test @@ -2,50 +2,62 @@ 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 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 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 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 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 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy