[Scummvm-cvs-logs] SF.net SVN: scummvm:[51962] tools/branches/gsoc2010-decompiler/decompiler/ control_flow.cpp
pidgeot at users.sourceforge.net
pidgeot at users.sourceforge.net
Wed Aug 11 01:57:26 CEST 2010
Revision: 51962
http://scummvm.svn.sourceforge.net/scummvm/?rev=51962&view=rev
Author: pidgeot
Date: 2010-08-10 23:57:25 +0000 (Tue, 10 Aug 2010)
Log Message:
-----------
DECOMPILER: Use iteration to set stack level
Modified Paths:
--------------
tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp
Modified: tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp 2010-08-10 23:21:08 UTC (rev 51961)
+++ tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp 2010-08-10 23:57:25 UTC (rev 51962)
@@ -140,21 +140,31 @@
boost::remove_vertex(g2, _g);
}
+typedef std::pair<GraphVertex, int> LevelEntry;
+
void ControlFlow::setStackLevel(GraphVertex g, int level) {
- GroupPtr gr = GET(g);
- if (gr->_stackLevel != -1) {
- if (gr->_stackLevel != level)
- std::cerr << boost::format("WARNING: Inconsistency in expected stack level for instruction at address 0x%08x (current: %d, requested: %d)\n") % gr->_start->_address % gr->_stackLevel % level;
- return;
- }
- gr->_stackLevel = level;
+ Stack<LevelEntry> levelStack;
+ std::set<GraphVertex> seen;
+ levelStack.push(LevelEntry(g, level));
+ seen.insert(g);
+ while (!levelStack.empty()) {
+ LevelEntry e = levelStack.pop();
+ GroupPtr gr = GET(e.first);
+ if (gr->_stackLevel != -1) {
+ if (gr->_stackLevel != e.second)
+ std::cerr << boost::format("WARNING: Inconsistency in expected stack level for instruction at address 0x%08x (current: %d, requested: %d)\n") % gr->_start->_address % gr->_stackLevel % e.second;
+ continue;
+ }
+ gr->_stackLevel = e.second;
- if (boost::out_degree(g, _g) == 0)
- return;
-
- OutEdgeRange r = boost::out_edges(g, _g);
- for (OutEdgeIterator e = r.first; e != r.second; ++e) {
- setStackLevel(boost::target(*e, _g), level + gr->_start->_stackChange);
+ OutEdgeRange r = boost::out_edges(e.first, _g);
+ for (OutEdgeIterator oe = r.first; oe != r.second; ++oe) {
+ GraphVertex target = boost::target(*oe, _g);
+ if (seen.find(target) == seen.end()) {
+ levelStack.push(LevelEntry(target, e.second + gr->_start->_stackChange));
+ seen.insert(target);
+ }
+ }
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list