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)
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