From dedbc2eb27ff74674cd6098061eb155c1657c645 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 14 Jan 2020 00:14:05 +0100 Subject: [PATCH] data: Fixed endless recursion on cyclic inheritance edges Fixed an endless recursion that happenes when the index contains cyclic inheritance relationships, which might accidentally appear due to name collisions. --- src/lib/data/HierarchyCache.cpp | 24 ++++++++++++------------ src/lib/data/HierarchyCache.h | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib/data/HierarchyCache.cpp b/src/lib/data/HierarchyCache.cpp index 06373945..6eedf7fc 100644 --- a/src/lib/data/HierarchyCache.cpp +++ b/src/lib/data/HierarchyCache.cpp @@ -1,5 +1,7 @@ #include "HierarchyCache.h" +#include "utility.h" + HierarchyCache::HierarchyNode::HierarchyNode(Id nodeId) : m_nodeId(nodeId), m_edgeId(0), m_parent(nullptr), m_isVisible(true), m_isImplicit(false) { @@ -114,26 +116,26 @@ void HierarchyCache::HierarchyNode::setIsImplicit(bool isImplicit) void HierarchyCache::HierarchyNode::addInheritanceEdgesRecursive( Id startId, - std::vector inheritanceEdgeIds, + const std::set& inheritanceEdgeIds, const std::set& nodeIds, std::vector>>* inheritanceEdges) { for (size_t i = 0; i < m_bases.size(); i++) { + if (inheritanceEdgeIds.find(m_baseEdgeIds[i]) != inheritanceEdgeIds.end()) + { + continue; + } + HierarchyNode* base = m_bases[i]; Id baseId = base->getNodeId(); - std::vector inheritanceEdgeIds2 = inheritanceEdgeIds; - inheritanceEdgeIds2.push_back(m_baseEdgeIds[i]); + std::set inheritanceEdgeIds2 = inheritanceEdgeIds; + inheritanceEdgeIds2.insert(m_baseEdgeIds[i]); if (nodeIds.find(baseId) != nodeIds.end()) { - std::vector inheritanceEdgeIds3 = inheritanceEdgeIds2; - - inheritanceEdges->push_back(std::make_tuple>( - std::forward(startId), - std::forward(baseId), - std::forward>(inheritanceEdgeIds3))); + inheritanceEdges->push_back({startId, baseId, utility::toVector(inheritanceEdgeIds2)}); } base->addInheritanceEdgesRecursive(startId, inheritanceEdgeIds2, nodeIds, inheritanceEdges); @@ -346,9 +348,7 @@ std::vector>> HierarchyCache::getInheritanceE HierarchyNode* node = getNode(nodeId); if (node) { - std::vector inheritanceEdgeIds; - node->addInheritanceEdgesRecursive( - node->getNodeId(), inheritanceEdgeIds, nodeIds, &inheritanceEdges); + node->addInheritanceEdgesRecursive(node->getNodeId(), {}, nodeIds, &inheritanceEdges); } return inheritanceEdges; diff --git a/src/lib/data/HierarchyCache.h b/src/lib/data/HierarchyCache.h index de1a382a..6d1230e3 100644 --- a/src/lib/data/HierarchyCache.h +++ b/src/lib/data/HierarchyCache.h @@ -69,7 +69,7 @@ private: void addInheritanceEdgesRecursive( Id startId, - std::vector inheritanceEdgeIds, + const std::set& inheritanceEdgeIds, const std::set& nodeIds, std::vector>>* inheritanceEdges);