summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2006-06-07 16:34:48 +0000
committerMark Spruiell <mes@zeroc.com>2006-06-07 16:34:48 +0000
commitbdead078d870fc0c79b441d89e6a4efbe62a4d36 (patch)
tree08cf89d467087824da908afd0fe57760a3c2a98b /cpp
parentFix (diff)
downloadice-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.cpp17
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);
+ }
+ }
}
}
}