From f874ebf57dcde57887ee29a4180f6b1abaf2b4bf Mon Sep 17 00:00:00 2001 From: nybblista <170842536+nybblista@users.noreply.github.com> Date: Tue, 6 May 2025 00:34:42 +0300 Subject: [PATCH 1/2] Assert with PyStackRef_IsTaggedInt function --- Include/internal/pycore_stackref.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h index a2acf311ff4c65..c9d2cafe9e2c7d 100644 --- a/Include/internal/pycore_stackref.h +++ b/Include/internal/pycore_stackref.h @@ -95,10 +95,16 @@ PyStackRef_IsNone(_PyStackRef ref) return _Py_stackref_get_object(ref) == Py_None; } +static inline bool +PyStackRef_IsTaggedInt(_PyStackRef ref) +{ + return (ref.index & 1) == 1; +} + static inline PyObject * _PyStackRef_AsPyObjectBorrow(_PyStackRef ref, const char *filename, int linenumber) { - assert((ref.index & 1) == 0); + assert(!PyStackRef_IsTaggedInt(ref)); _Py_stackref_record_borrow(ref, filename, linenumber); return _Py_stackref_get_object(ref); } @@ -135,12 +141,6 @@ _PyStackRef_FromPyObjectImmortal(PyObject *obj, const char *filename, int linenu } #define PyStackRef_FromPyObjectImmortal(obj) _PyStackRef_FromPyObjectImmortal(_PyObject_CAST(obj), __FILE__, __LINE__) -static inline bool -PyStackRef_IsTaggedInt(_PyStackRef ref) -{ - return (ref.index & 1) == 1; -} - static inline void _PyStackRef_CLOSE(_PyStackRef ref, const char *filename, int linenumber) { @@ -256,7 +256,7 @@ PyStackRef_TagInt(intptr_t i) static inline intptr_t PyStackRef_UntagInt(_PyStackRef i) { - assert((i.bits & Py_INT_TAG) == Py_INT_TAG); + assert(PyStackRef_IsTaggedInt(i)); intptr_t val = (intptr_t)i.bits; return Py_ARITHMETIC_RIGHT_SHIFT(intptr_t, val, 2); } From e742299445bd1560976126b2f4e9d2f2dc478530 Mon Sep 17 00:00:00 2001 From: nybblista <170842536+nybblista@users.noreply.github.com> Date: Wed, 7 May 2025 05:48:28 +0300 Subject: [PATCH 2/2] Assert PyStackRef_AsPyObjectBorrow is not a tagged integer --- Include/internal/pycore_stackref.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h index c9d2cafe9e2c7d..dc5e56102fa406 100644 --- a/Include/internal/pycore_stackref.h +++ b/Include/internal/pycore_stackref.h @@ -286,6 +286,7 @@ static const _PyStackRef PyStackRef_NULL = { .bits = Py_TAG_DEFERRED}; static inline PyObject * PyStackRef_AsPyObjectBorrow(_PyStackRef stackref) { + assert(!PyStackRef_IsTaggedInt(stackref)); PyObject *cleared = ((PyObject *)((stackref).bits & (~Py_TAG_BITS))); return cleared; }