[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