[Scummvm-cvs-logs] SF.net SVN: scummvm:[41818] tools/branches/gsoc2009-decompiler/decompiler

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Tue Jun 23 22:56:20 CEST 2009


Revision: 41818
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41818&view=rev
Author:   kjdf
Date:     2009-06-23 20:56:20 +0000 (Tue, 23 Jun 2009)

Log Message:
-----------
decompiler: fixed copy constructor bug, added main interface for derived graphs

Modified Paths:
--------------
    tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp
    tools/branches/gsoc2009-decompiler/decompiler/graph.h

Modified: tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-06-23 20:46:38 UTC (rev 41817)
+++ tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-06-23 20:56:20 UTC (rev 41818)
@@ -16,7 +16,8 @@
 		("help", "this message")
 		("disasm", "print disassembly and exit")
 		("blocks", "print basic blocks and exit")
-		("graph",  "print graph and exit");
+		("graph",  "print graph and exit")
+		("derive", value<int>(), "find nth derivative");
 	options_description options("Allowed options");
 	options.add(visible).add_options()
 		("inputfile", value<string>(), "input file");
@@ -35,6 +36,7 @@
 	return vars;
 }
 
+#include <sstream>
 
 int main(int argc, char **argv) {
 	variables_map vars = parseArgs(argc, argv);
@@ -53,8 +55,19 @@
 	// cfg.removeDeadBlocks();
 	cfg._graph.intervals();
 	if (vars.count("graph")) {
+		Graph<Block*> g = cfg._graph;
+		cfg._graph = g;
 		cfg.printDot(cout);
 		exit(0);
 	}
+	if (vars.count("derive")) {
+		Graph<Block*> g = cfg._graph;
+		for (int i = 0; i < vars["derive"].as<int>(); i++)
+			g = g.derive();
+		cfg._graph = g; // FIXME: evil
+		g.intervals();
+		cfg.printDot(cout);
+		exit(0);
+	}
 	return 0;
 }

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-06-23 20:46:38 UTC (rev 41817)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-06-23 20:56:20 UTC (rev 41818)
@@ -15,7 +15,9 @@
 #define foreach BOOST_FOREACH
 #endif
 
+#include <iostream>
 
+
 template<typename Data>
 struct Graph {
 
@@ -55,23 +57,41 @@
 	Graph() : _entry() {
 	}
 
-	Graph(const Graph &g) {
+	Graph(const Graph &g) : _entry() {
 		g.removeHiddenNodes();
 		std::map<Node*, Node*> trans;
 		trans[0] = 0;
 		foreach (Node *u, g._nodes)
 			trans[u] = addNode(u->_data);
 		foreach (Node *u, g._nodes) {
-			foreach (Node *v, u->_in)
-				trans[u]->_in.push_back(trans[v]);
 			foreach (Node *v, u->_out)
-				trans[u]->_in.push_back(trans[v]);
+				addEdge(trans[u], trans[v]);
 			trans[u]->_interval = trans[u->_interval];
 			trans[u]->_primitive = u->_primitive;
 		}
 		_entry = trans[g._entry];
 	}
 
+	// TODO cleanup
+	Graph &operator=(const Graph &g) {
+		foreach (Node *u, _nodes)
+			delete u;
+		_nodes.clear();
+		g.removeHiddenNodes();
+		std::map<Node*, Node*> trans;
+		trans[0] = 0;
+		foreach (Node *u, g._nodes)
+			trans[u] = addNode(u->_data);
+		foreach (Node *u, g._nodes) {
+			foreach (Node *v, u->_out)
+				addEdge(trans[u], trans[v]);
+			trans[u]->_interval = trans[u->_interval];
+			trans[u]->_primitive = u->_primitive;
+		}
+		_entry = trans[g._entry];
+		return *this;
+	}
+
 	~Graph() {
 		foreach (Node *u, _nodes)
 			delete u;


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