From bdead078d870fc0c79b441d89e6a4efbe62a4d36 Mon Sep 17 00:00:00 2001 From: Mark Spruiell Date: Wed, 7 Jun 2006 16:34:48 +0000 Subject: fixing bug 910: dumpdb does not handle object cycles --- cpp/src/FreezeScript/DumpDescriptors.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'cpp/src/FreezeScript/DumpDescriptors.cpp') diff --git a/cpp/src/FreezeScript/DumpDescriptors.cpp b/cpp/src/FreezeScript/DumpDescriptors.cpp index 4d2ad63bcc8..560b7f9df75 100644 --- a/cpp/src/FreezeScript/DumpDescriptors.cpp +++ b/cpp/src/FreezeScript/DumpDescriptors.cpp @@ -14,6 +14,7 @@ #include #include #include +#include using namespace std; @@ -118,6 +119,7 @@ private: Slice::UnitPtr _unit; ErrorReporterPtr _errorReporter; ExecuteInfo* _info; + set _objectHistory; }; } // End of namespace FreezeScript @@ -1867,11 +1869,16 @@ FreezeScript::DumpVisitor::visitObject(const ObjectRefPtr& data) ObjectDataPtr value = data->getValue(); if(value) { - DataMemberMap& members = value->getMembers(); - for(DataMemberMap::iterator p = members.begin(); p != members.end(); ++p) - { - p->second->visit(*this); - } + set::iterator p = _objectHistory.find(value.get()); + if(p == _objectHistory.end()) + { + _objectHistory.insert(value.get()); + DataMemberMap& members = value->getMembers(); + for(DataMemberMap::iterator q = members.begin(); q != members.end(); ++q) + { + q->second->visit(*this); + } + } } } } -- cgit v1.2.3