Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.1k
GH-104142: Fix_Py_RefcntAdd
to respect immortality#104143
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 ourterms of service andprivacy 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.
Conversation
bedevere-bot commentedMay 3, 2023
🤖 New build scheduled with the buildbot fleet by@brandtbucher for commitbe3b103 🤖 If you want to schedule another build, you need to add the🔨 test-with-buildbots label again. |
(Not sure why buildbots aren't running...) |
corona10 commentedMay 4, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@brandtbucher cpython/Modules/_testcapi/immortal.c Lines 34 to 38 in9885677
cpython/Modules/_testcapi/immortal.c Lines 5 to 10 in9885677
|
corona10 commentedMay 4, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Ah sorry please ignore#104143 (comment) |
if (_Py_IsImmortal(op)) { | ||
return; | ||
} |
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.
One quick comment here is that if this were to be in a hot path, I would recommend using the same technique that we use forPy_INCREF
to minimize the number of generated instructions to do the check and add:https://github.com/python/cpython/blob/main/Include/object.h#L620-L634
Now, given that it's only in use forsq_repeat
in tuple and list, I don't think this is perf sensitive so keeping the code as you have it here should be good.
self.assertEqual(sys.getrefcount(immortal), self.IMMORTAL_REFCOUNT) | ||
def test_immortals(self): | ||
for immortal in self.IMMORTALS: |
eduardo-elizondoMay 4, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
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.
Small nit: I generally prefer rolling out assertions in unit tests to make it easier to isolate by line-number in the place where the test failed. But I don't think there's a standard in the code base so I'm fine either way
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.
Yeah, I'd like comprehensive testing of these immortals though, and I don't want to roll out ~250 different assertions for each test.
I figured making each one asubTest
inassert_immortal
is a pretty good compromise.
eduardo-elizondo commentedMay 4, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Nice catch, I could have sworn that I had added the check to Thanks for the fix! |
LGTM, all increments to |
There is a USan failure:
Not sure what that means, but the line is in _Py_IsImmortal (https://github.com/brandtbucher/cpython/blob/py-refcnt-add-immortal/Include/object.h#L227), so it may be real. |
bedevere-bot commentedMay 4, 2023
🤖 New build scheduled with the buildbot fleet by@JelleZijlstra for commit1471b39 🤖 If you want to schedule another build, you need to add the🔨 test-with-buildbots label again. |
(Trying again just in case it was something flaky.) |
Grrr... it failed again. |
I honestly don't know what to do here. Itfeels like a bug in USan, since I honestly don't get how the new code could cause that failure. But it's reproducible, and indeed seems to indeed be related to my change here. |
Ah, wait, the same buildbot is also failing on So it's an existing issue (but one that probably should still be looked into). |
See#104190 |
Nice catch! |
* main: (61 commits)pythongh-64595: Argument Clinic: Touch source file if any output file changed (python#104152)pythongh-64631: Test exception messages in cloned Argument Clinic funcs (python#104167)pythongh-68395: Avoid naming conflicts by mangling variable names in Argument Clinic (python#104065)pythongh-64658: Expand Argument Clinic return converter docs (python#104175)pythonGH-103092: port `_asyncio` freelist to module state (python#104196)pythongh-104051: fix crash in test_xxtestfuzz with -We (python#104052)pythongh-104190: fix ubsan crash (python#104191)pythongh-104106: Add gcc fallback of mkfifoat/mknodat for macOS (pythongh-104129)pythonGH-104142: Fix _Py_RefcntAdd to respect immortality (pythonGH-104143)pythongh-104112: link from cached_property docs to method-caching FAQ (python#104113)pythongh-68968: Correcting message display issue with assertEqual (python#103937)pythonGH-103899: Provide a hint when accidentally calling a module (pythonGH-103900)pythongh-103963: fix 'make regen-opcode' in out-of-tree builds (python#104177)pythongh-102500: Add PEP 688 and 698 to the 3.12 release highlights (python#104174)pythonGH-81079: Add case_sensitive argument to `pathlib.Path.glob()` (pythonGH-102710)pythongh-91896: Deprecate collections.abc.ByteString (python#102096)pythongh-99593: Add tests for Unicode C API (part 2) (python#99868)pythongh-102500: Document PEP 688 (python#102571)pythongh-102500: Implement PEP 688 (python#102521)pythongh-96534: socketmodule: support FreeBSD divert(4) socket (python#96536) ...
Uh oh!
There was an error while loading.Please reload this page.
Also, make the existing immortality tests a bit stricter and more comprehensive.
_Py_RefcntAdd
doesn't respect immortality #104142