libshiboken: Fix crashes with static strings in Python 3.11
authorFriedemann Kleint <Friedemann.Kleint@qt.io>
Fri, 24 Jun 2022 07:22:01 +0000 (09:22 +0200)
committerDmitry Shachnev <mitya57@debian.org>
Sun, 16 Jul 2023 14:49:14 +0000 (15:49 +0100)
In Python 3.11, some strings come with a refcount above decimal
1000000000, apparently indicating that they are interned. Replace the
mechanism by PyUnicode_InternFromString().

Task-number: PYSIDE-1960
Pick-to: 6.3 6.2 5.15
Change-Id: I6436afee351f89da5814b5d6bc76970b1b508168
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit a09a1db8391243e6bb290ee66bb6e3afbb114c61)

Gbp-Pq: Name libshiboken-Fix-crashes-with-static-strings-in-Python-3.11.patch

sources/shiboken2/libshiboken/sbkstring.cpp

index 077fb531b1235eded39c533d761e8a5294adace4..a9d451c6cffd7683605e96d33540990de5634ba4 100644 (file)
 #include "sbkstaticstrings_p.h"
 #include "autodecref.h"
 
-#include <vector>
-#include <unordered_set>
+#if PY_VERSION_HEX >= 0x030B0000 || defined(Py_LIMITED_API)
+#  define USE_INTERN_STRINGS
+#endif
+
+#ifndef USE_INTERN_STRINGS
+#  include <vector>
+#  include <unordered_set>
+#endif
 
 namespace Shiboken
 {
@@ -233,6 +239,13 @@ Py_ssize_t len(PyObject *str)
 //     PyObject *attr = PyObject_GetAttr(obj, name());
 //
 
+#ifdef USE_INTERN_STRINGS
+PyObject *createStaticString(const char *str)
+{
+     return PyUnicode_InternFromString(str);
+}
+#else
+
 using StaticStrings = std::unordered_set<PyObject *>;
 
 static void finalizeStaticStrings();    // forward
@@ -283,6 +296,8 @@ PyObject *createStaticString(const char *str)
     return result;
 }
 
+#endif // !USE_INTERN_STRINGS
+
 ///////////////////////////////////////////////////////////////////////
 //
 // PYSIDE-1019: Helper function for snake_case vs. camelCase names