-
-
Notifications
You must be signed in to change notification settings - Fork 32k
GH-81061: Fix refcount issue when returning None
from a ctypes.py_object
callback
#13364
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
Changes from all commits
85026c5
2a5aeba
611f1b6
fb17c68
66ea175
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -97,5 +97,20 @@ def func(a, b): | |
f(1, 2) | ||
self.assertEqual(sys.getrefcount(ctypes.c_int), a) | ||
|
||
@support.refcount_test | ||
def test_callback_py_object_none_return(self): | ||
# bpo-36880: test that returning None from a py_object callback | ||
# does not decrement the refcount of None. | ||
|
||
for FUNCTYPE in (ctypes.CFUNCTYPE, ctypes.PYFUNCTYPE): | ||
with self.subTest(FUNCTYPE=FUNCTYPE): | ||
@FUNCTYPE(ctypes.py_object) | ||
def func(): | ||
return None | ||
|
||
# Check that calling func does not affect None's refcount. | ||
for _ in range(10000): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Single call should be enough to trigger the refleak checker. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately not... I tested again - apparently the refleak checker (with default settings: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I see, it is because of #74959. |
||
func() | ||
|
||
if __name__ == '__main__': | ||
unittest.main() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
Fix a reference counting issue when a :mod:`ctypes` callback with return | ||
type :class:`~ctypes.py_object` returns ``None``, which could cause crashes. |
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.
AFAICT, this test is rendered pointless in 3.12 due to the adoption of PEP 683 (Immortal Objects, Using a Fixed Refcount). Because
None
is immortal, executingPy_INCREF(Py_None)
andPy_DECREF(Py_None)
will no longer modify its refcount.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.
Ah, good to know. I assume this isn't implemented yet though, because as of the current state of
main
(447d061), this test still hard-crashes without the fix.