diff options
-rw-r--r-- | sources/shiboken2/libshiboken/sbkstring.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/sources/shiboken2/libshiboken/sbkstring.cpp b/sources/shiboken2/libshiboken/sbkstring.cpp index 7fb7d5730..092745d3d 100644 --- a/sources/shiboken2/libshiboken/sbkstring.cpp +++ b/sources/shiboken2/libshiboken/sbkstring.cpp @@ -41,7 +41,7 @@ #include "sbkstaticstrings_p.h" #include "autodecref.h" -#include <set> +#include <vector> namespace Shiboken { @@ -231,12 +231,10 @@ Py_ssize_t len(PyObject *str) // // PyObject *attr = PyObject_GetAttr(obj, name()); // -// Missing: -// There is no finalization for the string structures, yet. -// But this is a global fault in shiboken. We are missing a true -// finalization like in all other modules. -using StaticStrings = std::set<PyObject *>; +using StaticStrings = std::vector<PyObject *>; + +static void finalizeStaticStrings(); // forward static StaticStrings &staticStrings() { @@ -244,8 +242,21 @@ static StaticStrings &staticStrings() return result; } +static void finalizeStaticStrings() +{ + auto &list = staticStrings(); + for (PyObject *ob : list) + Py_DECREF(ob); + list.clear(); +} + PyObject *createStaticString(const char *str) { + static bool initialized = false; + if (!initialized) { + Py_AtExit(finalizeStaticStrings); + initialized = true; + } #if PY_VERSION_HEX >= 0x03000000 PyObject *result = PyUnicode_InternFromString(str); #else @@ -256,17 +267,9 @@ PyObject *createStaticString(const char *str) PyErr_Print(); Py_FatalError("unexpected error in createStaticString()"); } - staticStrings().insert(result); + staticStrings().push_back(result); return result; } -void finalizeStaticStrings() // Currently unused -{ - auto &list = staticStrings(); - for (auto s : list) - Py_DECREF(s); - list.clear(); -} - } // namespace String } // namespace Shiboken |