Skip to content

Commit e6e4a6b

Browse files
committed
feat: new primitive for weakref.__call__
1 parent 9eadb7e commit e6e4a6b

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

mypyc/ir/rtypes.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,11 @@ def __hash__(self) -> int:
512512
# Python range object.
513513
range_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

516521
def is_tagged(rtype: RType) -> bool:
517522
return rtype is int_rprimitive or rtype is short_int_rprimitive

mypyc/primitives/weakref_ops.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
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
44

55
# Weakref operations
66

@@ -16,7 +16,15 @@
1616
new_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+
)

mypyc/test-data/irbuild-weakref.test

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@ L0:
1515
import weakref
1616
from typing import Any, Callable
1717
def f(x: object, cb: Callable[[object], Any]) -> object:
18-
return weakref.ref(x, cb)
18+
return weakref.ref(x, cb)()
1919

2020
[out]
2121
def f(x, cb):
22-
x, cb, r0 :: object
22+
x, cb :: object
23+
r0 :: weakref.ReferenceType
24+
r1 :: object
2325
L0:
2426
r0 = PyWeakref_NewRef(x, cb)
25-
return r0
27+
r1 = PyWeakref_GetRef(r0)
28+
return r1
2629

2730
[case testFromWeakrefRef]
2831
from typing import Any, Callable
@@ -41,11 +44,14 @@ L0:
4144
from typing import Any, Callable
4245
from weakref import ref
4346
def f(x: object, cb: Callable[[object], Any]) -> object:
44-
return ref(x, cb)
47+
return ref(x, cb)()
4548

4649
[out]
4750
def f(x, cb):
48-
x, cb, r0 :: object
51+
x, cb :: object
52+
r0 :: weakref.ReferenceType
53+
r1 :: object
4954
L0:
5055
r0 = PyWeakref_NewRef(x, cb)
51-
return r0
56+
r1 = PyWeakref_GetRef(r0)
57+
return r1

0 commit comments

Comments
 (0)