diff options
author | Tobias Hunger <tobias.hunger@digia.com> | 2013-01-16 18:25:01 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@digia.com> | 2013-01-24 15:11:22 +0100 |
commit | eba5dbb9e1a2ad373aa94f7e3d5a2910559aab8f (patch) | |
tree | b7510c35323cb46d614969108006af14ff80bca4 | |
parent | 3e05e52f5c7fe0772a8d4366ce8f10380da56f9a (diff) | |
download | qt-creator-eba5dbb9e1a2ad373aa94f7e3d5a2910559aab8f.tar.gz |
Qbs: Fix possible crash when reparsing the project
Change-Id: I61a1ca5745639681e3dda879414dfeca9101f64c
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.cpp | 22 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsnodes.h | 2 |
2 files changed, 20 insertions, 4 deletions
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index cdc775b93c..f26df774f1 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -223,6 +223,16 @@ bool QbsProductNode::isEnabled() const return product->isEnabled(); } +void QbsProductNode::updateProductData(const qbs::ProductData *prd) +{ + product = prd; + + for (int i = 0; i < subProjectNodes().count(); ++i) { + QbsGroupNode *gn = static_cast<QbsGroupNode *>(subProjectNodes().at(i)); + gn->group = &(prd->groups().at(i)); + } +} + // -------------------------------------------------------------------- // QbsProjectNode: // -------------------------------------------------------------------- @@ -248,12 +258,11 @@ void QbsProjectNode::update(const qbs::Project *prj) QList<ProjectExplorer::ProjectNode *> oldNodeList = subProjectNodes(); - delete m_projectData; - m_projectData = 0; + qbs::ProjectData *newData = 0; if (prj) { - m_projectData = new qbs::ProjectData(prj->projectData()); - foreach (const qbs::ProductData &prd, m_projectData->products()) { + newData = new qbs::ProjectData(prj->projectData()); + foreach (const qbs::ProductData &prd, newData->products()) { QbsProductNode *qn = findProductNode(prd.name()); if (!qn) { toAdd << new QbsProductNode(&prd); @@ -263,12 +272,17 @@ void QbsProjectNode::update(const qbs::Project *prj) if (*qn->product != prd) { toRemove << qn; toAdd << new QbsProductNode(&prd); + } else { + qn->updateProductData(&prd); } } } } toRemove.append(oldNodeList); + delete m_projectData; + m_projectData = newData; + if (m_project) { delete m_project; m_project = 0; diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index b921f8a104..acde5a31ad 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -122,6 +122,8 @@ public: bool isEnabled() const; + void updateProductData(const qbs::ProductData *prd); + const qbs::ProductData *product; }; |