From a2aaf0f6eb15a833685ce071d70e0712b43cafc8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 23 Feb 2015 11:28:23 +0100 Subject: [PATCH] Fix assert for m_objectInstanceHash The hash was not cleaned up in any case and sometimes a new object gets allocated at the exact same address. To avoid leaking hashes in m_objectInstanceHash and to avoid the assert, we remove any deleted QObject from the hash. Change-Id: I2697ab2b2430ad47932841fb9c0ef88ffa4cbbb1 Reviewed-by: Tim Jenssen --- .../qml2puppet/instances/nodeinstanceserver.cpp | 11 +++++++++++ .../qml2puppet/instances/nodeinstanceserver.h | 1 + .../qml2puppet/instances/objectnodeinstance.cpp | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 2c36c696fb8..c691d0b328b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1217,6 +1217,17 @@ void NodeInstanceServer::sendDebugOutput(DebugOutputCommand::Type type, const QS nodeInstanceClient()->debugOutput(command); } +void NodeInstanceServer::removeInstanceRelationsipForDeletedObject(QObject *object) +{ + if (m_objectInstanceHash.contains(object)) { + ServerNodeInstance instance = instanceForObject(object); + m_objectInstanceHash.remove(object); + + if (m_idInstanceHash.contains(instance.instanceId())) + m_idInstanceHash.remove(instance.instanceId()); + } +} + QStringList NodeInstanceServer::dummyDataDirectories(const QString& directoryPath) { QStringList dummyDataDirectoryList; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index 99edfdb9ac3..6273ec1013c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -131,6 +131,7 @@ public: void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, qint32 instanceId); void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, const QVector &instanceIds); + void removeInstanceRelationsipForDeletedObject(QObject *object); public slots: void refreshLocalFileProperty(const QString &path); void refreshDummyData(const QString &path); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index 6b1359c6fcd..bb0e26578ec 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -111,7 +111,15 @@ ObjectNodeInstance::ObjectNodeInstance(QObject *object) m_deleteHeldInstance(true), m_isInLayoutable(false) { + if (object) + QObject::connect(m_object.data(), &QObject::destroyed, [=] { + /*This lambda is save because m_nodeInstanceServer + is a smartpointer and object is a dangling pointer anyway.*/ + + if (m_nodeInstanceServer) + m_nodeInstanceServer->removeInstanceRelationsipForDeletedObject(object); + }); } ObjectNodeInstance::~ObjectNodeInstance()