Skip to content

Commit 0fbf0d4

Browse files
committed
feat: new primitive for weakref.ref
1 parent 8ed16d1 commit 0fbf0d4

File tree

6 files changed

+90
-1
lines changed

6 files changed

+90
-1
lines changed

mypyc/primitives/registry.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,4 +371,5 @@ def load_address_op(name: str, type: RType, src: str) -> LoadAddressDescription:
371371
import mypyc.primitives.list_ops
372372
import mypyc.primitives.misc_ops
373373
import mypyc.primitives.str_ops
374-
import mypyc.primitives.tuple_ops # noqa: F401
374+
import mypyc.primitives.tuple_ops
375+
import mypyc.primitives.weakref_ops # noqa: F401

mypyc/primitives/weakref_ops.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from mypyc.ir.ops import ERR_MAGIC
2+
from mypyc.ir.rtypes import object_rprimitive
3+
from mypyc.primitives.registry import function_op
4+
5+
# Weakref operations
6+
7+
new_ref_op = function_op(
8+
name="weakref.ReferenceType",
9+
arg_types=[object_rprimitive, object_rprimitive],
10+
return_type=object_rprimitive,
11+
c_function_name="PyWeakref_NewRef",
12+
error_kind=ERR_MAGIC,
13+
)

mypyc/test-data/irbuild-weakref.test

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
[case testWeakrefRef]
2+
import weakref
3+
from typing import Any, Callable
4+
def f(x: object) -> object:
5+
return weakref.ref(x)
6+
7+
[out]
8+
def f(x):
9+
x, r0 :: object
10+
L0:
11+
r0 = PyWeakref_NewRef(x, NULL)
12+
return r0
13+
14+
[case testWeakrefRefCallback]
15+
import weakref
16+
from typing import Any, Callable
17+
def f(x: object, cb: Callable[[object], Any]) -> object:
18+
return weakref.ref(x, cb)
19+
20+
[out]
21+
def f(x, cb):
22+
x, cb, r0 :: object
23+
L0:
24+
r0 = PyWeakref_NewRef(x, cb)
25+
return r0
26+
27+
[case testFromWeakrefRef]
28+
from typing import Any, Callable
29+
from weakref import ref
30+
def f(x: object) -> object:
31+
return ref(x)
32+
33+
[out]
34+
def f(x):
35+
x, r0 :: object
36+
L0:
37+
r0 = PyWeakref_NewRef(x, NULL)
38+
return r0
39+
40+
[case testFromWeakrefRefCallback]
41+
from typing import Any, Callable
42+
from weakref import ref
43+
def f(x: object, cb: Callable[[object], Any]) -> object:
44+
return ref(x, cb)
45+
46+
[out]
47+
def f(x, cb):
48+
x, cb, r0 :: object
49+
L0:
50+
r0 = PyWeakref_NewRef(x, cb)
51+
return r0

mypyc/test-data/run-weakref.test

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Test cases for weakrefs (compile and run)
2+
3+
[case testWeakrefRef]
4+
import asyncio
5+
import pytest # type: ignore [import-not-found]
6+
from weakref import ref
7+
8+
def test_weakref_ref():
9+
# some random weakreffable object
10+
obj = asyncio.new_event_loop()
11+
r = ref(obj)
12+
assert r() is obj
13+
obj = None
14+
assert r() is None, r()
15+
16+
def test_weakref_ref_with_callback():
17+
# some random weakreffable object
18+
obj = asyncio.new_event_loop()
19+
r = ref(obj, lambda x: x)
20+
assert r() is obj
21+
obj = None
22+
assert r() is None, r()

mypyc/test/test_irbuild.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"irbuild-constant-fold.test",
5454
"irbuild-glue-methods.test",
5555
"irbuild-math.test",
56+
"irbuild-weakref.test",
5657
]
5758

5859
if sys.version_info >= (3, 10):

mypyc/test/test_run.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
"run-dunders-special.test",
7070
"run-singledispatch.test",
7171
"run-attrs.test",
72+
"run-weakref.test",
7273
"run-python37.test",
7374
"run-python38.test",
7475
]

0 commit comments

Comments
 (0)