diff options
author | Mark Shannon <mark@hotpy.org> | 2025-04-03 09:40:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-03 09:40:37 +0100 |
commit | 275056a7fdcbe36aaac494b4183ae59943a338eb (patch) | |
tree | 1ee82866eefadf81829037e2b9aa402e4f28d994 | |
parent | b3e3cc054c2c7718c0ad7c4690f76716649a2588 (diff) | |
download | cpython-275056a7fdcbe36aaac494b4183ae59943a338eb.tar.gz cpython-275056a7fdcbe36aaac494b4183ae59943a338eb.zip |
GH-131904: Fix Py_STACKREF_DEBUG build (GH-132022)
-rw-r--r-- | Include/internal/pycore_stackref.h | 23 | ||||
-rw-r--r-- | Python/stackrefs.c | 10 |
2 files changed, 27 insertions, 6 deletions
diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h index 6664a747e2e..e6772c96eeb 100644 --- a/Include/internal/pycore_stackref.h +++ b/Include/internal/pycore_stackref.h @@ -146,14 +146,15 @@ _PyStackRef_CLOSE(_PyStackRef ref, const char *filename, int linenumber) #define PyStackRef_CLOSE(REF) _PyStackRef_CLOSE((REF), __FILE__, __LINE__) static inline void -PyStackRef_XCLOSE(_PyStackRef ref) +_PyStackRef_XCLOSE(_PyStackRef ref, const char *filename, int linenumber) { if (PyStackRef_IsNull(ref)) { return; } - PyObject *obj = _Py_stackref_close(ref); + PyObject *obj = _Py_stackref_close(ref, filename, linenumber); Py_DECREF(obj); } +#define PyStackRef_XCLOSE(REF) _PyStackRef_XCLOSE((REF), __FILE__, __LINE__) static inline _PyStackRef _PyStackRef_DUP(_PyStackRef ref, const char *filename, int linenumber) @@ -164,7 +165,8 @@ _PyStackRef_DUP(_PyStackRef ref, const char *filename, int linenumber) } #define PyStackRef_DUP(REF) _PyStackRef_DUP(REF, __FILE__, __LINE__) -extern void PyStackRef_CLOSE_SPECIALIZED(_PyStackRef ref, destructor destruct); +extern void _PyStackRef_CLOSE_SPECIALIZED(_PyStackRef ref, destructor destruct, const char *filename, int linenumber); +#define PyStackRef_CLOSE_SPECIALIZED(REF, DESTRUCT) _PyStackRef_CLOSE_SPECIALIZED(REF, DESTRUCT, __FILE__, __LINE__) static inline _PyStackRef PyStackRef_MakeHeapSafe(_PyStackRef ref) @@ -175,7 +177,7 @@ PyStackRef_MakeHeapSafe(_PyStackRef ref) static inline _PyStackRef PyStackRef_Borrow(_PyStackRef ref) { - return PyStackRef_DUP(ref) + return PyStackRef_DUP(ref); } #define PyStackRef_CLEAR(REF) \ @@ -200,6 +202,18 @@ PyStackRef_IsHeapSafe(_PyStackRef ref) return true; } +static inline _PyStackRef +_PyStackRef_FromPyObjectNewMortal(PyObject *obj, const char *filename, int linenumber) +{ + assert(!_Py_IsStaticImmortal(obj)); + Py_INCREF(obj); + return _Py_stackref_create(obj, filename, linenumber); +} +#define PyStackRef_FromPyObjectNewMortal(obj) _PyStackRef_FromPyObjectNewMortal(_PyObject_CAST(obj), __FILE__, __LINE__) + +#define PyStackRef_RefcountOnObject(REF) 1 + +extern int PyStackRef_Is(_PyStackRef a, _PyStackRef b); #else @@ -616,6 +630,7 @@ PyStackRef_XCLOSE(_PyStackRef ref) #define PyStackRef_Is(a, b) (((a).bits & (~Py_TAG_BITS)) == ((b).bits & (~Py_TAG_BITS))) + #endif // !defined(Py_GIL_DISABLED) && defined(Py_STACKREF_DEBUG) #define PyStackRef_TYPE(stackref) Py_TYPE(PyStackRef_AsPyObjectBorrow(stackref)) diff --git a/Python/stackrefs.c b/Python/stackrefs.c index a7693ba75c5..450dacde6d2 100644 --- a/Python/stackrefs.c +++ b/Python/stackrefs.c @@ -55,6 +55,12 @@ _Py_stackref_get_object(_PyStackRef ref) return entry->obj; } +int +PyStackRef_Is(_PyStackRef a, _PyStackRef b) +{ + return _Py_stackref_get_object(a) == _Py_stackref_get_object(b); +} + PyObject * _Py_stackref_close(_PyStackRef ref, const char *filename, int linenumber) { @@ -182,9 +188,9 @@ _Py_stackref_report_leaks(PyInterpreterState *interp) } void -PyStackRef_CLOSE_SPECIALIZED(_PyStackRef ref, destructor destruct) +_PyStackRef_CLOSE_SPECIALIZED(_PyStackRef ref, destructor destruct, const char *filename, int linenumber) { - PyObject *obj = _Py_stackref_close(ref); + PyObject *obj = _Py_stackref_close(ref, filename, linenumber); _Py_DECREF_SPECIALIZED(obj, destruct); } |