From 9e1d85ebd26622d08641245c94cf9ff87e779a8f Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 22 Jan 2025 17:00:24 +0100 Subject: [PATCH] Gui: Use Py::SmartPtr instead of raw pointer Using the raw pointer may result into a crash in case the Python object is accessed by the interpreter after the NavigationStyle has been destroyed. --- src/Gui/Navigation/NavigationStyle.cpp | 16 ++++++++-------- src/Gui/Navigation/NavigationStyle.h | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Gui/Navigation/NavigationStyle.cpp b/src/Gui/Navigation/NavigationStyle.cpp index 38f170877c..ca3d7c3887 100644 --- a/src/Gui/Navigation/NavigationStyle.cpp +++ b/src/Gui/Navigation/NavigationStyle.cpp @@ -319,10 +319,10 @@ NavigationStyle::~NavigationStyle() finalize(); delete this->animator; - if (pythonObject) { + if (!pythonObject.is(nullptr)) { Base::PyGILStateLocker lock; - Py_DECREF(pythonObject); - pythonObject = nullptr; + Base::PyObjectBase* obj = static_cast(pythonObject.ptr()); + obj->setInvalid(); } } @@ -1914,11 +1914,11 @@ void NavigationStyle::openPopupMenu(const SbVec2s& position) PyObject* NavigationStyle::getPyObject() { - if (!pythonObject) - pythonObject = new NavigationStylePy(this); - - Py_INCREF(pythonObject); - return pythonObject; + if (pythonObject.is(nullptr)) { + // ref counter is set to 1 + pythonObject = Py::asObject(new NavigationStylePy(this)); + } + return Py::new_reference_to(pythonObject); } // ---------------------------------------------------------------------------------- diff --git a/src/Gui/Navigation/NavigationStyle.h b/src/Gui/Navigation/NavigationStyle.h index b3000728ab..be54296471 100644 --- a/src/Gui/Navigation/NavigationStyle.h +++ b/src/Gui/Navigation/NavigationStyle.h @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -283,7 +284,7 @@ protected: SbSphereSheetProjector * spinprojector; //@} - PyObject* pythonObject; + Py::SmartPtr pythonObject; private: friend class NavigationAnimator;