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:
512
512
# Python range object.
513
513
range_rprimitive : Final = RPrimitive ("builtins.range" , is_unboxed = False , is_refcounted = True )
514
514
515
+ # Python weak reference object
516
+ weakref_rprimitive : Final = RPrimitive (
517
+ "weakref.ReferenceType" , is_unboxed = False , is_refcounted = True
518
+ )
519
+
515
520
516
521
def is_tagged (rtype : RType ) -> bool :
517
522
return rtype is int_rprimitive or rtype is short_int_rprimitive
Original file line number Diff line number Diff line change 1
1
from 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
4
4
5
5
# Weakref operations
6
6
16
16
new_ref__with_callback_op = function_op (
17
17
name = "weakref.ReferenceType" ,
18
18
arg_types = [object_rprimitive , object_rprimitive ],
19
- return_type = object_rprimitive ,
19
+ return_type = weakref_rprimitive ,
20
20
c_function_name = "PyWeakref_NewRef" ,
21
21
error_kind = ERR_MAGIC ,
22
22
)
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 15
15
import weakref
16
16
from typing import Any, Callable
17
17
def f(x: object, cb: Callable[[object], Any]) -> object:
18
- return weakref.ref(x, cb)
18
+ return weakref.ref(x, cb)()
19
19
20
20
[out]
21
21
def f(x, cb):
22
- x, cb, r0 :: object
22
+ x, cb :: object
23
+ r0 :: weakref.ReferenceType
24
+ r1 :: object
23
25
L0:
24
26
r0 = PyWeakref_NewRef(x, cb)
25
- return r0
27
+ r1 = PyWeakref_GetRef(r0)
28
+ return r1
26
29
27
30
[case testFromWeakrefRef]
28
31
from typing import Any, Callable
41
44
from typing import Any, Callable
42
45
from weakref import ref
43
46
def f(x: object, cb: Callable[[object], Any]) -> object:
44
- return ref(x, cb)
47
+ return ref(x, cb)()
45
48
46
49
[out]
47
50
def f(x, cb):
48
- x, cb, r0 :: object
51
+ x, cb :: object
52
+ r0 :: weakref.ReferenceType
53
+ r1 :: object
49
54
L0:
50
55
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