[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