diff options
author | Mark Spruiell <mes@zeroc.com> | 2006-06-07 16:34:48 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2006-06-07 16:34:48 +0000 |
commit | bdead078d870fc0c79b441d89e6a4efbe62a4d36 (patch) | |
tree | 08cf89d467087824da908afd0fe57760a3c2a98b /cpp | |
parent | Fix (diff) | |
download | ice-bdead078d870fc0c79b441d89e6a4efbe62a4d36.tar.bz2 ice-bdead078d870fc0c79b441d89e6a4efbe62a4d36.tar.xz ice-bdead078d870fc0c79b441d89e6a4efbe62a4d36.zip |
fixing bug 910: dumpdb does not handle object cycles
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/FreezeScript/DumpDescriptors.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
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 <FreezeScript/Exception.h> #include <FreezeScript/Util.h> #include <db_cxx.h> +#include <set> using namespace std; @@ -118,6 +119,7 @@ private: Slice::UnitPtr _unit; ErrorReporterPtr _errorReporter; ExecuteInfo* _info; + set<const ObjectData*> _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<const ObjectData*>::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); + } + } } } } |