From 93e131c4f053a81a84a48195a1e38ff7adbdaaff Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 24 Oct 2024 09:19:44 -0400 Subject: [PATCH 1/2] MNT: account for CPython 314 changes https://github.com/python/cpython/pull/125251 renamed _PY_IMMORTAL_REFCNT -> _PY_IMMORTAL_INITIAL_REFCNT --- msgspec/_core.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/msgspec/_core.c b/msgspec/_core.c index a82b44c1..3c21780f 100644 --- a/msgspec/_core.c +++ b/msgspec/_core.c @@ -21,6 +21,7 @@ #define PY311_PLUS (PY_VERSION_HEX >= 0x030b0000) #define PY312_PLUS (PY_VERSION_HEX >= 0x030c0000) #define PY313_PLUS (PY_VERSION_HEX >= 0x030d0000) +#define PY314_PLUS (PY_VERSION_HEX >= 0x030e0000) /* Hint to the compiler not to store `x` in a register since it is likely to * change. Results in much higher performance on GCC, with smaller benefits on @@ -2152,7 +2153,13 @@ PyTypeObject NoDefault_Type = { .tp_basicsize = 0 }; -#if PY312_PLUS +#if PY314_PLUS +PyObject _NoDefault_Object = { + _PyObject_EXTRA_INIT + { _Py_IMMORTAL_INITIAL_REFCNT }, + &NoDefault_Type +}; +#elif PY312_PLUS PyObject _NoDefault_Object = { _PyObject_EXTRA_INIT { _Py_IMMORTAL_REFCNT }, @@ -2256,7 +2263,13 @@ PyTypeObject Unset_Type = { .tp_basicsize = 0 }; -#if PY312_PLUS +#if PY314_PLUS +PyObject _Unset_Object = { + _PyObject_EXTRA_INIT + { _Py_IMMORTAL_INITIAL_REFCNT }, + &NoDefault_Type +}; +#elif PY312_PLUS PyObject _Unset_Object = { _PyObject_EXTRA_INIT { _Py_IMMORTAL_REFCNT }, From f46c882c7ca395f4a8bd3b051d9026722ca771cd Mon Sep 17 00:00:00 2001 From: Jim Crist-Harif Date: Thu, 24 Oct 2024 09:00:44 -0500 Subject: [PATCH 2/2] Define new macro to reduce duplication --- msgspec/_core.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/msgspec/_core.c b/msgspec/_core.c index 3c21780f..32b16ff6 100644 --- a/msgspec/_core.c +++ b/msgspec/_core.c @@ -72,6 +72,12 @@ ms_popcount(uint64_t i) { \ #define MS_UNICODE_EQ(a, b) _PyUnicode_EQ(a, b) #endif +#if PY314_PLUS +#define MS_IMMORTAL_INITIAL_REFCNT _Py_IMMORTAL_INITIAL_REFCNT +#else +#define MS_IMMORTAL_INITIAL_REFCNT _Py_IMMORTAL_REFCNT +#endif + #define DIV_ROUND_CLOSEST(n, d) ((((n) < 0) == ((d) < 0)) ? (((n) + (d)/2)/(d)) : (((n) - (d)/2)/(d))) /* These macros are used to manually unroll some loops */ @@ -2153,16 +2159,10 @@ PyTypeObject NoDefault_Type = { .tp_basicsize = 0 }; -#if PY314_PLUS -PyObject _NoDefault_Object = { - _PyObject_EXTRA_INIT - { _Py_IMMORTAL_INITIAL_REFCNT }, - &NoDefault_Type -}; -#elif PY312_PLUS +#if PY312_PLUS PyObject _NoDefault_Object = { _PyObject_EXTRA_INIT - { _Py_IMMORTAL_REFCNT }, + { MS_IMMORTAL_INITIAL_REFCNT }, &NoDefault_Type }; #else @@ -2263,16 +2263,10 @@ PyTypeObject Unset_Type = { .tp_basicsize = 0 }; -#if PY314_PLUS -PyObject _Unset_Object = { - _PyObject_EXTRA_INIT - { _Py_IMMORTAL_INITIAL_REFCNT }, - &NoDefault_Type -}; -#elif PY312_PLUS +#if PY312_PLUS PyObject _Unset_Object = { _PyObject_EXTRA_INIT - { _Py_IMMORTAL_REFCNT }, + { MS_IMMORTAL_INITIAL_REFCNT }, &Unset_Type }; #else