[Scummvm-cvs-logs] SF.net SVN: scummvm:[42004] tools/branches/gsoc2009-decompiler/decompiler
kjdf at users.sourceforge.net
kjdf at users.sourceforge.net
Wed Jul 1 19:19:12 CEST 2009
Revision: 42004
http://scummvm.svn.sourceforge.net/scummvm/?rev=42004&view=rev
Author: kjdf
Date: 2009-07-01 17:19:12 +0000 (Wed, 01 Jul 2009)
Log Message:
-----------
decompiler: updated tests to run with new Graph
Modified Paths:
--------------
tools/branches/gsoc2009-decompiler/decompiler/Makefile
tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h
tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h
Modified: tools/branches/gsoc2009-decompiler/decompiler/Makefile
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/Makefile 2009-07-01 17:18:54 UTC (rev 42003)
+++ tools/branches/gsoc2009-decompiler/decompiler/Makefile 2009-07-01 17:19:12 UTC (rev 42004)
@@ -68,7 +68,7 @@
test:
cxxtest/cxxtestgen.pl --error-printer --abort-on-fail --have-eh -o test_runner.cpp test/test_*.h
- g++ -g $(DEFINES) $(INCLUDES) -Icxxtest -o test_runner test_runner.cpp
+ g++ -g $(DEFINES) $(INCLUDES) -Icxxtest -o test_runner test_runner.cpp graph.cpp misc.cpp
./test_runner
Modified: tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h 2009-07-01 17:18:54 UTC (rev 42003)
+++ tools/branches/gsoc2009-decompiler/decompiler/test/data_graph.h 2009-07-01 17:19:12 UTC (rev 42004)
@@ -2,95 +2,78 @@
#define DATA_GRAPH_H
#include <boost/foreach.hpp>
+#include <list>
+#include <graph.h>
+#include <instruction.h>
-Graph<int>::Node *findNode(Graph<int> *g, int data) {
- BOOST_FOREACH (Graph<int>::Node *u, g->_nodes)
- if (u->_data == data)
+
+unsigned addr(Block *block) {
+ return block->_instructions.front()->_addr;
+}
+
+Block *node(ControlFlowGraph *g, unsigned addr) {
+ BOOST_FOREACH (Block *u, g->_blocks)
+ if (u->_instructions.front()->_addr == addr)
return u;
return 0;
}
-Graph<int> *makeGraph1() {
- Graph<int> *g = new Graph<int>;
- g->addNode(1);
- g->addNode(2);
- g->addNode(3);
- g->addNode(4);
- g->addNode(5);
- g->addNode(6);
- g->addEdge(findNode(g, 1), findNode(g, 2));
- g->addEdge(findNode(g, 2), findNode(g, 3));
- g->addEdge(findNode(g, 2), findNode(g, 5));
- g->addEdge(findNode(g, 3), findNode(g, 4));
- g->addEdge(findNode(g, 4), findNode(g, 2));
- g->addEdge(findNode(g, 5), findNode(g, 1));
- g->addEdge(findNode(g, 5), findNode(g, 6));
+ControlFlowGraph *makeGraph1() {
+ std::list<Instruction*> instructions;
+ instructions.push_back(new Jump("nop", 1, +1));
+ instructions.push_back(new CondJump("jumpif +3", 2, +3));
+ instructions.push_back(new Jump("nop", 3, +1));
+ instructions.push_back(new Jump("jump -2", 4, -2));
+ instructions.push_back(new CondJump("jumpif -4", 5, -4));
+ instructions.push_back(new Instruction("ret", 6 ));
+ ControlFlowGraph *g = new ControlFlowGraph;
+ g->addBlocksFromScript(instructions.begin(), instructions.end());
+ g->setEntry(1);
return g;
}
-Graph<int> *makeGraph2() {
- Graph<int> *g = new Graph<int>;
- g->addNode(15);
- g->addNode(14);
- g->addNode(13);
- g->addNode(12);
- g->addNode(11);
- g->addNode(10);
- g->addNode(9);
- g->addNode(8);
- g->addNode(7);
- g->addNode(6);
- g->addNode(5);
- g->addNode(4);
- g->addNode(3);
- g->addNode(2);
- g->addNode(1);
- g->setEntry(findNode(g, 1));
- g->addEdge(findNode(g, 1), findNode(g, 2));
- g->addEdge(findNode(g, 1), findNode(g, 5));
- g->addEdge(findNode(g, 2), findNode(g, 3));
- g->addEdge(findNode(g, 2), findNode(g, 4));
- g->addEdge(findNode(g, 3), findNode(g, 5));
- g->addEdge(findNode(g, 4), findNode(g, 5));
- g->addEdge(findNode(g, 5), findNode(g, 6));
- g->addEdge(findNode(g, 6), findNode(g, 7));
- g->addEdge(findNode(g, 6), findNode(g, 12));
- g->addEdge(findNode(g, 7), findNode(g, 8));
- g->addEdge(findNode(g, 7), findNode(g, 9));
- g->addEdge(findNode(g, 8), findNode(g, 9));
- g->addEdge(findNode(g, 8), findNode(g, 10));
- g->addEdge(findNode(g, 9), findNode(g, 10));
- g->addEdge(findNode(g, 10), findNode(g, 11));
- g->addEdge(findNode(g, 12), findNode(g, 13));
- g->addEdge(findNode(g, 13), findNode(g, 14));
- g->addEdge(findNode(g, 14), findNode(g, 13));
- g->addEdge(findNode(g, 14), findNode(g, 15));
- g->addEdge(findNode(g, 15), findNode(g, 6));
+ControlFlowGraph *makeGraph2() {
+ std::list<Instruction*> instructions;
+ instructions.push_back(new CondJump("jumpif +4", 1, +4));
+ instructions.push_back(new CondJump("jumpif +2", 2, +2));
+ instructions.push_back(new Jump("jump +2", 3, +2));
+ instructions.push_back(new Jump("nop", 4, +1));
+ instructions.push_back(new Jump("nop", 5, +1));
+ instructions.push_back(new CondJump("jumpif +5", 6, +5));
+ instructions.push_back(new Jump("nop", 7, +1));
+ instructions.push_back(new Jump("nop", 8, +1));
+ instructions.push_back(new CondJump("jumpif ", 9, -1));
+ instructions.push_back(new Jump("-4", 10, -4));
+ instructions.push_back(new CondJump("jumpif +2", 11, +2));
+ instructions.push_back(new Jump("nop", 12, +1));
+ instructions.push_back(new Jump("nop", 13, +1));
+ instructions.push_back(new Instruction("ret", 14 ));
+ ControlFlowGraph *g = new ControlFlowGraph;
+ g->addBlocksFromScript(instructions.begin(), instructions.end());
+ g->setEntry(1);
return g;
}
-Graph<int> *makeGraph3() {
- Graph<int> *g = new Graph<int>;
- g->addNode(1);
- g->addNode(2);
- g->addNode(3);
- g->addEdge(findNode(g, 1), findNode(g, 2));
- g->addEdge(findNode(g, 1), findNode(g, 3));
- g->addEdge(findNode(g, 2), findNode(g, 3));
- g->addEdge(findNode(g, 3), findNode(g, 2));
+ControlFlowGraph *makeGraph3() {
+ std::list<Instruction*> instructions;
+ instructions.push_back(new CondJump("jumpif +2", 1, +2));
+ instructions.push_back(new Jump("nop", 2, +1));
+ instructions.push_back(new Jump("jump -1", 3, -1));
+ ControlFlowGraph *g = new ControlFlowGraph;
+ g->addBlocksFromScript(instructions.begin(), instructions.end());
+ g->setEntry(1);
return g;
}
-Graph<int> *makeGraph4() {
- Graph<int> *g = new Graph<int>;
- g->addNode(1);
- g->addNode(2);
- g->addNode(3);
- g->addEdge(findNode(g, 1), findNode(g, 2));
- g->addEdge(findNode(g, 2), findNode(g, 2));
- g->addEdge(findNode(g, 2), findNode(g, 3));
- g->addEdge(findNode(g, 3), findNode(g, 1));
+ControlFlowGraph *makeGraph4() {
+ std::list<Instruction*> instructions;
+ instructions.push_back(new Jump("nop", 1, +1));
+ instructions.push_back(new CondJump("jumpif +0", 2, +0));
+ instructions.push_back(new Jump("jump -2", 3, -2));
+ ControlFlowGraph *g = new ControlFlowGraph;
+ g->addBlocksFromScript(instructions.begin(), instructions.end());
+ g->setEntry(1);
return g;
}
Modified: tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h 2009-07-01 17:18:54 UTC (rev 42003)
+++ tools/branches/gsoc2009-decompiler/decompiler/test/test_graph_internal.h 2009-07-01 17:19:12 UTC (rev 42004)
@@ -9,66 +9,78 @@
#include <cxxtest/TestSuite.h>
-class GraphTestSuite : public CxxTest::TestSuite {
+class GraphInternalTestSuite : public CxxTest::TestSuite {
- Graph<int> *g1, *g2, *g3, *g4;
+ ControlFlowGraph *ga, *gb, *gc, *gd;
public:
void setUp() {
- g1 = makeGraph1();
- g2 = makeGraph2();
- g3 = makeGraph3();
- g4 = makeGraph4();
+ ga = makeGraph1();
+ gb = makeGraph2();
+ gc = makeGraph3();
+ gd = makeGraph4();
}
- // this tests internal, intermediate results, not part of the api
+
void test_intervals() {
- g1->intervals();
- TS_ASSERT_EQUALS(findNode(g1, 1)->interval()->_data, findNode(g1, 1)->_data);
+ ga->intervals();
+ TS_ASSERT_EQUALS(addr(node(ga,1)->_interval), 1);
for (int i = 2; i <= 6; i++)
- TS_ASSERT_EQUALS(findNode(g1, i)->interval()->_data, findNode(g1, 2)->_data);
- g2->intervals();
+ TS_ASSERT_EQUALS(addr(node(ga,i)->_interval), 2);
+
+ gb->intervals();
for (int i = 1; i <= 5; i++)
- TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 1)->_data);
- for (int i = 6; i <= 12; i++)
- TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 6)->_data);
- for (int i = 13; i <= 15; i++)
- TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 13)->_data);
- g3->intervals();
- TS_ASSERT_EQUALS(findNode(g3, 1)->interval()->_data, findNode(g3, 1)->_data);
- TS_ASSERT_EQUALS(findNode(g3, 2)->interval()->_data, findNode(g3, 2)->_data);
- TS_ASSERT_EQUALS(findNode(g3, 3)->interval()->_data, findNode(g3, 3)->_data);
- g4->intervals();
- TS_ASSERT_EQUALS(findNode(g4, 1)->interval()->_data, findNode(g4, 1)->_data);
- TS_ASSERT_EQUALS(findNode(g4, 2)->interval()->_data, findNode(g4, 2)->_data);
- TS_ASSERT_EQUALS(findNode(g4, 3)->interval()->_data, findNode(g4, 2)->_data);
+ TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 1);
+ TS_ASSERT_EQUALS(addr(node(gb,6)->_interval), 6);
+ TS_ASSERT_EQUALS(addr(node(gb,7)->_interval), 6);
+ TS_ASSERT_EQUALS(addr(node(gb,8)->_interval), 8);
+ TS_ASSERT_EQUALS(addr(node(gb,9)->_interval), 8);
+ TS_ASSERT_EQUALS(addr(node(gb,10)->_interval), 8);
+ TS_ASSERT_EQUALS(addr(node(gb,11)->_interval), 6);
+ TS_ASSERT_EQUALS(addr(node(gb,12)->_interval), 6);
+ TS_ASSERT_EQUALS(addr(node(gb,13)->_interval), 6);
+ TS_ASSERT_EQUALS(addr(node(gb,14)->_interval), 6);
+
+ gc->intervals();
+ TS_ASSERT_EQUALS(addr(node(gc,1)->_interval), 1);
+ TS_ASSERT_EQUALS(addr(node(gc,2)->_interval), 2);
+ TS_ASSERT_EQUALS(addr(node(gc,3)->_interval), 3);
+
+ gd->intervals();
+ TS_ASSERT_EQUALS(addr(node(gd,1)->_interval), 1);
+ TS_ASSERT_EQUALS(addr(node(gd,2)->_interval), 2);
+ TS_ASSERT_EQUALS(addr(node(gd,3)->_interval), 2);
}
+
void test_extendIntervals() {
- g1->intervals();
- g1->extendIntervals();
+ ga->intervals();
+ ga->extendIntervals();
for (int i = 1; i <= 6; i++)
- TS_ASSERT_EQUALS(findNode(g1, i)->interval()->_data, findNode(g1, 1)->_data);
- g2->intervals();
- g2->extendIntervals();
+ TS_ASSERT_EQUALS(addr(node(ga,i)->_interval), 1);
+
+ gb->intervals();
+ gb->extendIntervals();
for (int i = 1; i <= 5; i++)
- TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 1)->_data);
- for (int i = 6; i <= 15; i++)
- TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 6)->_data);
- g2->extendIntervals();
- for (int i = 1; i <= 15; i++)
- TS_ASSERT_EQUALS(findNode(g2, i)->interval()->_data, findNode(g2, 1)->_data);
- g3->intervals();
- g3->extendIntervals();
- TS_ASSERT_EQUALS(findNode(g3, 1)->interval()->_data, findNode(g3, 1)->_data);
- TS_ASSERT_EQUALS(findNode(g3, 2)->interval()->_data, findNode(g3, 2)->_data);
- TS_ASSERT_EQUALS(findNode(g3, 3)->interval()->_data, findNode(g3, 3)->_data);
- g4->intervals();
- g4->extendIntervals();
- TS_ASSERT_EQUALS(findNode(g4, 1)->interval()->_data, findNode(g4, 1)->_data);
- TS_ASSERT_EQUALS(findNode(g4, 2)->interval()->_data, findNode(g4, 1)->_data);
- TS_ASSERT_EQUALS(findNode(g4, 3)->interval()->_data, findNode(g4, 1)->_data);
+ TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 1);
+ for (int i = 6; i <= 14; i++)
+ TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 6);
+ gb->extendIntervals();
+ for (int i = 1; i <= 14; i++)
+ TS_ASSERT_EQUALS(addr(node(gb,i)->_interval), 1);
+
+ gc->intervals();
+ gc->extendIntervals();
+ TS_ASSERT_EQUALS(addr(node(gc,1)->_interval), 1);
+ TS_ASSERT_EQUALS(addr(node(gc,2)->_interval), 2);
+ TS_ASSERT_EQUALS(addr(node(gc,3)->_interval), 3);
+
+ gd->intervals();
+ gd->extendIntervals();
+ TS_ASSERT_EQUALS(addr(node(gd,1)->_interval), 1);
+ TS_ASSERT_EQUALS(addr(node(gd,2)->_interval), 1);
+ TS_ASSERT_EQUALS(addr(node(gd,3)->_interval), 1);
}
};
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