]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-131904: Fix Py_STACKREF_DEBUG build (GH-132022)
authorMark Shannon <mark@hotpy.org>
Thu, 3 Apr 2025 08:40:37 +0000 (09:40 +0100)
committerGitHub <noreply@github.com>
Thu, 3 Apr 2025 08:40:37 +0000 (09:40 +0100)
Include/internal/pycore_stackref.h
Python/stackrefs.c

index 6664a747e2e91b946a810189c5815896e1ff649a..e6772c96eeb79c8003cb83d79c8358cda8510607 100644 (file)
@@ -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))
index a7693ba75c5dbb3fcecd4da5298c36b287fd77ea..450dacde6d29e54147615877d4330c6262523f9a 100644 (file)
@@ -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);
 }