GeezerVison is showing github.com — [DRAFT] gh-105059: C99 avoids PyObject.ob_refcnt union by vstinner · Pull Request #105767 · python/cpython
Conversation
vstinner
commented
Jun 14, 2023
•
edited by bedevere-bot
Loading
Uh oh!
There was an error while loading. Please reload this page.
Only define PyObject.ob_refcnt as an anonymous union on C11 and newer, or when GCC is used. If GCC is used on C99 and older, add extension on the union. On C99 and older without GCC, Py_INCREF() and Py_DECREF() are implemented as function calls.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Only define PyObject.ob_refcnt as an anonymous union on C11 and
newer, or when GCC is used. If GCC is used on C99 and older, add
__extension__ on the union. On C99 and older without GCC, Py_INCREF()
and Py_DECREF() are implemented as function calls.
vstinner
commented
Jun 14, 2023
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
When the Python C API is used with GCC and clang, I'm pretty sure that __extension__ can be used to get an anonymous union, without emitting new compiler warnings or errors, even when -pedantic option is used. For now, I prefer to skip this code path to focus on C11 vs C99 code path, so I commented the code (you can uncomment it to test).
I don't know if MSC has pragma to turn off the compiler warning on "Compiler Warning (level 4) C4201": "nonstandard extension used: nameless struct/union".
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
For now, my PR implements Py_INCREF() and Py_DECREF() as opaque function calls on C99 and newer. Maybe later, this code path can still be optimized to inline the code. But a solution without anonymous union should be found for that.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
To test this PR, I added the following code to Modules/_testcapimodule.c and Programs/_testembed.c:
#ifdef _PYOBJECT_REFCNT_ANON_UNION
printf("PyObject.ob_refcnt is an union\n");
#else
printf("PyObject.ob_refcnt type is Py_ssize_t\n");
#endif
And I modified Makefile.pre.in to build Programs/_testembed.c with -std=c99: in this case, the union is not used, whereas _testcapi is built with the union (it's built with -std=c11).
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
This change can have a significant negative impact on performance, so I abandon it and instead try to get rid of the compiler warning: PR #107232.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Reviewers
ZeroIntensity
Awaiting requested review from ZeroIntensity
ZeroIntensity will be requested when the pull request is marked ready for review
ZeroIntensity is a code owner
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|