gh-103082: Fix shifted field initialization in `instrumentation.c` by arhadthedev · Pull Request #103561 · python/cpython
If Py_TRACE_REFS is defined, PyObject initializers without field names like:
| static PyObject DISABLE = | |
| { | |
| _PyObject_IMMORTAL_REFCNT, | |
| &PyBaseObject_Type | |
| }; |
are compiled in a totally unusable way:
_ob_next = _PyObject_IMMORTAL_REFCNT (999999999)
_ob_prev = &PyBaseObject_Type
ob_refcnt = 0
ob_type = NULL
The reason is implicit insertion of two extra fields under #ifdef Py_TRACE_REFS:
| struct _object { | |
| _PyObject_HEAD_EXTRA | |
| Py_ssize_t ob_refcnt; | |
| PyTypeObject *ob_type; | |
| }; |
| #ifdef Py_TRACE_REFS | |
| /* Define pointers to support a doubly-linked list of all live heap objects. */ | |
| #define _PyObject_HEAD_EXTRA \ | |
| PyObject *_ob_next; \ | |
| PyObject *_ob_prev; | |
| #define _PyObject_EXTRA_INIT _Py_NULL, _Py_NULL, | |
| #else | |
| # define _PyObject_HEAD_EXTRA | |
| # define _PyObject_EXTRA_INIT | |
| #endif |
This commit fixes declarations that fail the (edit: all other places use AMD64 Arch Linux TraceRefs PR buildbot. Other declarations will be fixed in another, pending PR._PyObject_HEAD_EXTRA)
I desided to not use _PyObject_HEAD_EXTRA because it can be forgotten easily (unlike explicit field names) so we should phase it out from CPython codebase if possible.