-
-
Notifications
You must be signed in to change notification settings - Fork 3k
feat: new mypyc primitive for weakref.ref #19099
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Done. This just needs tests now.
|
@JukkaL I've cleaned up the commit history and this is now ready for review. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR! Left a suggestion about how to make this more general.
name="weakref.ReferenceType", | ||
arg_types=[object_rprimitive, object_rprimitive], | ||
return_type=object_rprimitive, | ||
c_function_name="PyWeakref_NewRef", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you also support calls with a single argument, since this is probably quite common?
You'd need to add another function_op
with arg_types=[object_rprimitive],
and probably something like extra_int_constants=[(0, pointer_rprimitive)],
to add an implicit NULL argument.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This all makes sense to me, the pointer_rprimitive would become the NULL (i think?) but what does the 0
do in your above example?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Even though I don't understand it, it seems to be working. Is it an index? as in 'for extra int constant in slot 0, use pointer_rprimitive'?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
0
is the constant value of the argument (zero i.e. NULL).
Oh great, I was trying and trying different ways to do this and eventually
gave up. Will put that together sometime this week.
Any thoughts on how I might determine the correct fullname for
weakref.proxy so I can handle that with both cases (1- and 2-arg) at the
same time?
…On Mon, Jun 2, 2025 at 12:12 PM Jukka Lehtosalo ***@***.***> wrote:
***@***.**** commented on this pull request.
Thanks for the PR! Left a suggestion about how to make this more general.
------------------------------
In mypyc/primitives/weakref_ops.py
<#19099 (comment)>:
> @@ -0,0 +1,13 @@
+from mypyc.ir.ops import ERR_MAGIC
+from mypyc.ir.rtypes import object_rprimitive
+from mypyc.primitives.registry import function_op
+
+# Weakref operations
+
+new_ref_op = function_op(
+ name="weakref.ReferenceType",
+ arg_types=[object_rprimitive, object_rprimitive],
+ return_type=object_rprimitive,
+ c_function_name="PyWeakref_NewRef",
Can you also support calls with a single argument, since this is probably
quite common?
You'd need to add another function_op with arg_types=[object_rprimitive],
and probably something like extra_int_constants=[(0, pointer_rprimitive)],
to add an implicit NULL argument.
—
Reply to this email directly, view it on GitHub
<#19099 (review)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AQ3HIHXND656N5PHKHNLJZ33BRZVZAVCNFSM6AAAAAB5JUBQO2VHI2DSMVQWIX3LMV43YUDVNRWFEZLROVSXG5CSMV3GSZLXHMZDQOBZGEYDCMZSGQ>
.
You are receiving this because you authored the thread.Message ID:
***@***.***>
|
@JukkaL I know I said I'd do it later this week, but I've already finished. This is ready for review. |
You can look at how it's defined in |
hmm. It shows |
It didn't work. I'll keep working on proxy in #19217 , this one is ready to merge if you agree |
I got it to work for weakref.proxy on #19217. The C code generates correctly but I believe I've exposed a bug in mypyc's reference counting as my new pytest cases fail both with the new code and with the original builtin. The weakly-proxied object is being destroyed too early, while there should still be a strong reference to it. |
This PR adds a new mypyc primitive for
weakref.ref
I wasn't able to figure out what name mypyc expects for
weakref.proxy
, so I took that out and will keep that for a separate PR later on. ref is more commonly used than proxy anyway.for later, I tried:
no luck with those
also for later, I'll need to finish #19145 to add a primitive for
weakref.ref.__call__