From f8f4cd76cc7e44c8db28544a627be525bc9abe0b Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 25 Aug 2018 21:49:57 +0200 Subject: [PATCH] clear dict when invalidating Py object to fix possible cyclic references --- src/Base/PyObjectBase.cpp | 7 +++++++ src/Base/PyObjectBase.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/Base/PyObjectBase.cpp b/src/Base/PyObjectBase.cpp index 25b60eed28..1f3105524d 100644 --- a/src/Base/PyObjectBase.cpp +++ b/src/Base/PyObjectBase.cpp @@ -426,3 +426,10 @@ void PyObjectBase::untrackAttribute(const char* attr) PyDict_DelItemString(attrDict, attr); } } + +void PyObjectBase::clearAttributes() +{ + if (attrDict) { + PyDict_Clear(attrDict); + } +} diff --git a/src/Base/PyObjectBase.h b/src/Base/PyObjectBase.h index 680623b103..e72ecae03d 100644 --- a/src/Base/PyObjectBase.h +++ b/src/Base/PyObjectBase.h @@ -286,6 +286,7 @@ public: void setInvalid() { // first bit is not set, i.e. invalid StatusBits.reset(Valid); + clearAttributes(); _pcTwinPointer = 0; } @@ -320,6 +321,7 @@ private: PyObject* getTrackedAttribute(const char* attr); void trackAttribute(const char* attr, PyObject* obj); void untrackAttribute(const char* attr); + void clearAttributes(); protected: std::bitset<32> StatusBits;