File tree Expand file tree Collapse file tree 3 files changed +28
-9
lines changed Expand file tree Collapse file tree 3 files changed +28
-9
lines changed Original file line number Diff line number Diff line change @@ -512,6 +512,11 @@ def __hash__(self) -> int:
512512# Python range object.
513513range_rprimitive : Final = RPrimitive ("builtins.range" , is_unboxed = False , is_refcounted = True )
514514
515+ # Python weak reference object
516+ weakref_rprimitive : Final = RPrimitive (
517+ "weakref.ReferenceType" , is_unboxed = False , is_refcounted = True
518+ )
519+
515520
516521def is_tagged (rtype : RType ) -> bool :
517522 return rtype is int_rprimitive or rtype is short_int_rprimitive
Original file line number Diff line number Diff line change 11from mypyc .ir .ops import ERR_MAGIC
2- from mypyc .ir .rtypes import object_rprimitive , pointer_rprimitive
3- from mypyc .primitives .registry import function_op
2+ from mypyc .ir .rtypes import object_rprimitive , pointer_rprimitive , weakref_rprimitive
3+ from mypyc .primitives .registry import ERR_NEG_INT , function_op , method_op
44
55# Weakref operations
66
1616new_ref__with_callback_op = function_op (
1717 name = "weakref.ReferenceType" ,
1818 arg_types = [object_rprimitive , object_rprimitive ],
19- return_type = object_rprimitive ,
19+ return_type = weakref_rprimitive ,
2020 c_function_name = "PyWeakref_NewRef" ,
2121 error_kind = ERR_MAGIC ,
2222)
23+
24+ deref_op = method_op (
25+ name = "__call__" ,
26+ arg_types = [weakref_rprimitive ],
27+ return_type = object_rprimitive ,
28+ c_function_name = "PyWeakref_GetRef" ,
29+ error_kind = ERR_NEG_INT ,
30+ )
Original file line number Diff line number Diff line change 1515import weakref
1616from typing import Any, Callable
1717def f(x: object, cb: Callable[[object], Any]) -> object:
18- return weakref.ref(x, cb)
18+ return weakref.ref(x, cb)()
1919
2020[out]
2121def f(x, cb):
22- x, cb, r0 :: object
22+ x, cb :: object
23+ r0 :: weakref.ReferenceType
24+ r1 :: object
2325L0:
2426 r0 = PyWeakref_NewRef(x, cb)
25- return r0
27+ r1 = PyWeakref_GetRef(r0)
28+ return r1
2629
2730[case testFromWeakrefRef]
2831from typing import Any, Callable
4144from typing import Any, Callable
4245from weakref import ref
4346def f(x: object, cb: Callable[[object], Any]) -> object:
44- return ref(x, cb)
47+ return ref(x, cb)()
4548
4649[out]
4750def f(x, cb):
48- x, cb, r0 :: object
51+ x, cb :: object
52+ r0 :: weakref.ReferenceType
53+ r1 :: object
4954L0:
5055 r0 = PyWeakref_NewRef(x, cb)
51- return r0
56+ r1 = PyWeakref_GetRef(r0)
57+ return r1
You can’t perform that action at this time.
0 commit comments