GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — [DRAFT] gh-105059: C99 avoids PyObject.ob_refcnt union by vstinner · Pull Request #105767 · python/cpython

Conversation

@vstinner

@vstinner vstinner commented Jun 14, 2023 •
edited by bedevere-bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

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.

  • Issue: object.h uses an anonymous union in a struct (older C incompatible) #105059

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@vstinner
pythongh-105059: C99 avoids PyObject.ob_refcnt union
53cfe54
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.
@bedevere-bot bedevere-bot mentioned this pull request Jun 14, 2023
object.h uses an anonymous union in a struct (older C incompatible) #105059
Closed
@vstinner vstinner mentioned this pull request Jun 14, 2023
[DRAFT] gh-105059: In C++, Py_INCREF() uses a function call #105764
Closed
@vstinner

vstinner commented Jun 14, 2023 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member Author

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".

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner

vstinner commented Jun 14, 2023

Copy link
Copy Markdown
Member Author

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.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner

vstinner commented Jun 14, 2023

Copy link
Copy Markdown
Member Author

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).

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner

vstinner commented Jul 25, 2023

Copy link
Copy Markdown
Member Author

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.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@vstinner vstinner closed this Jul 25, 2023
@vstinner
vstinner deleted the incref_c11 branch September 13, 2023 16:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@ZeroIntensity 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

Labels

None yet

Projects

None yet

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.

1 participant

@vstinner
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.