Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 34k
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
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
85026c52a5aeba611f1b6fb17c6866ea175File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
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): | ||
Contributor 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. ContributorAuthor 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: Member 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 Contributor 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
Noneis 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.