| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
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.
|
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.
|
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.
|
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");
#endifAnd 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.
|
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.
| Back | FazBrowse Home | New Git URL |
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.