[Scummvm-cvs-logs] SF.net SVN: scummvm:[51774] tools/branches/gsoc2010-decompiler/decompiler
pidgeot at users.sourceforge.net
pidgeot at users.sourceforge.net
Fri Aug 6 02:11:28 CEST 2010
Revision: 51774
http://scummvm.svn.sourceforge.net/scummvm/?rev=51774&view=rev
Author: pidgeot
Date: 2010-08-06 00:11:27 +0000 (Fri, 06 Aug 2010)
Log Message:
-----------
Pass in instruction vector to disassemblers
Properly fix function detection
Modified Paths:
--------------
tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp
tools/branches/gsoc2010-decompiler/decompiler/decompiler.cpp
tools/branches/gsoc2010-decompiler/decompiler/disassembler.cpp
tools/branches/gsoc2010-decompiler/decompiler/disassembler.h
tools/branches/gsoc2010-decompiler/decompiler/engine.h
tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.cpp
tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.h
tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.cpp
tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.h
tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp
tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.h
tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.cpp
tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.h
tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.cpp
tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.h
tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h
tools/branches/gsoc2010-decompiler/decompiler/test/codegen.h
tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.cpp
tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.h
tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.cpp
tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.h
tools/branches/gsoc2010-decompiler/decompiler/test/disassembler_test.h
Modified: tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/control_flow.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -159,13 +159,27 @@
}
void ControlFlow::detectFunctions() {
+ uint32 nextFunc = 0;
for (ConstInstIterator it = _insts.begin(); it != _insts.end(); ++it) {
GraphVertex v = find(it);
GroupPtr gr = GET(v);
- if (_engine->_functions.find(it->_address) != _engine->_functions.end())
+ if (it->_address < nextFunc)
continue;
+ bool functionExists = false;
+ for (FuncMap::iterator fn = _engine->_functions.begin(); fn != _engine->_functions.end(); ++fn) {
+ if (fn->first == it->_address) {
+ if (fn->second._endIt == _insts.end())
+ return;
+ nextFunc = fn->second._endIt->_address;
+ functionExists = true;
+ }
+ }
+
+ if (functionExists)
+ continue;
+
InEdgeRange ier = boost::in_edges(v, _g);
bool isEntryPoint = true;
for (InEdgeIterator e = ier.first; e != ier.second; ++e) {
@@ -198,12 +212,15 @@
ConstInstIterator endInst;
if (endPoint->_next) {
endInst = endPoint->_next->_start;
+ nextFunc = endInst->_address;
} else {
endInst = _insts.end();
}
Function f(gr->_start, endInst);
f._v = find(it);
_engine->_functions[gr->_start->_address] = f;
+ if (!endPoint->_next)
+ return;
}
}
}
@@ -223,7 +240,6 @@
nextInst++;
int stackLevel = 0;
int expectedStackLevel = 0;
- //std::stack<uint32> s;
for (curInst = _insts.begin(); nextInst != _insts.end(); ++curInst, ++nextInst) {
GraphVertex cur = find(curInst);
GraphVertex next = find(nextInst);
@@ -232,17 +248,22 @@
GroupPtr grNext = GET(next);
// Don't process unreachable code
- if (grCur->_stackLevel == -1)
+ if (grCur->_stackLevel < 0) {
+ stackLevel = grNext->_stackLevel;
continue;
+ }
expectedStackLevel = grCur->_stackLevel;
- if (expectedStackLevel > grNext->_stackLevel && grNext->_stackLevel != -1)
+ if (expectedStackLevel > grNext->_stackLevel && grNext->_stackLevel >= 0)
expectedStackLevel = grNext->_stackLevel;
- grCur->_stackLevel = expectedStackLevel;
-
stackLevel += curInst->_stackChange;
+ if (curInst->_type == kStack) {
+ expectedStackLevel = stackLevel;
+ grNext->_stackLevel = stackLevel;
+ }
+
// Group ends after a jump
if (curInst->_type == kJump || curInst->_type == kJumpRel || curInst->_type == kCondJump || curInst->_type == kCondJumpRel) {
stackLevel = grNext->_stackLevel;
@@ -250,8 +271,10 @@
}
// Group ends with a return
- if (curInst->_type == kReturn)
+ if (curInst->_type == kReturn) {
+ stackLevel = grNext->_stackLevel;
continue;
+ }
// Group ends before target of a jump
if (in_degree(next, _g) != 1) {
Modified: tools/branches/gsoc2010-decompiler/decompiler/decompiler.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/decompiler.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/decompiler.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -103,10 +103,11 @@
std::string inputFile = vm["input-file"].as<std::string>();
// Disassembly
- Disassembler *disassembler = engine->getDisassembler();
+ std::vector<Instruction> insts;
+ Disassembler *disassembler = engine->getDisassembler(insts);
disassembler->open(inputFile.c_str());
- std::vector<Instruction> insts = disassembler->disassemble();
+ disassembler->disassemble();
if (vm.count("dump-disassembly")) {
std::streambuf *buf;
std::ofstream of;
Modified: tools/branches/gsoc2010-decompiler/decompiler/disassembler.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/disassembler.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/disassembler.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -22,7 +22,7 @@
#include "disassembler.h"
-Disassembler::Disassembler() {
+Disassembler::Disassembler(std::vector<Instruction> &insts) : _insts(insts) {
_addressBase = 0;
_disassemblyDone = false;
}
@@ -38,11 +38,10 @@
}
}
-const std::vector<Instruction> &Disassembler::disassemble() {
+void Disassembler::disassemble() {
if (!_disassemblyDone)
doDisassemble();
_disassemblyDone = true;
- return _insts;
}
void Disassembler::dumpDisassembly(std::ostream &output) {
Modified: tools/branches/gsoc2010-decompiler/decompiler/disassembler.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/disassembler.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/disassembler.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -35,10 +35,10 @@
*/
class Disassembler {
protected:
- Common::File _f; ///< Used to perform file I/O.
- std::vector<Instruction> _insts; ///< Container for disassembled instructions.
- uint32 _addressBase; ///< Base address where the script starts.
- bool _disassemblyDone; ///< Indicates whether or not disassembly has already been performed.
+ Common::File _f; ///< Used to perform file I/O.
+ std::vector<Instruction>& _insts; ///< Container for disassembled instructions.
+ uint32 _addressBase; ///< Base address where the script starts.
+ bool _disassemblyDone; ///< Indicates whether or not disassembly has already been performed.
/**
* Performs disassembly.
@@ -55,7 +55,7 @@
virtual void doDumpDisassembly(std::ostream &output);
public:
- Disassembler();
+ Disassembler(std::vector<Instruction> &insts);
virtual ~Disassembler() {}
/**
@@ -70,7 +70,7 @@
*
* @return An std::vector containing the disassembled instructions.
*/
- const std::vector<Instruction> &disassemble();
+ void disassemble();
/**
* Outputs the disassembled code. Disassembles code if this has not already been done.
Modified: tools/branches/gsoc2010-decompiler/decompiler/engine.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/engine.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/engine.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -35,11 +35,11 @@
public:
ConstInstIterator _startIt; ///< Iterator to of the first instruction in the function, if available.
ConstInstIterator _endIt; ///< Iterator to the instruction immediately after the function, similar to end() on STL containers, if available.
- std::string _name; ///< Function name.
- GraphVertex _v; ///< Graph vertex for the entry point to the function.
- uint32 _args; ///< Number of arguments to the function.
- bool _retVal; ///< Whether or not the function returns a value.
- std::string _metadata; ///< Metadata for code generation.
+ std::string _name; ///< Function name.
+ GraphVertex _v; ///< Graph vertex for the entry point to the function.
+ uint32 _args; ///< Number of arguments to the function.
+ bool _retVal; ///< Whether or not the function returns a value.
+ std::string _metadata; ///< Metadata for code generation.
/**
* Parameterless constructor for Function. Required for use with STL, should not be called manually.
@@ -73,9 +73,10 @@
/**
* Retrieve the disassembler for the engine.
*
+ * @param Reference to the std::vector to place the Instructions in.
* @return Pointer to a Disassembler for the engine.
*/
- virtual Disassembler *getDisassembler() = 0;
+ virtual Disassembler *getDisassembler(std::vector<Instruction> &insts) = 0;
/**
* Decode a jump instruction to get the destination address.
Modified: tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -130,7 +130,7 @@
{ "setSceneAnimPos2", "" },
{ "update", "" },
// 0x4c
- { "unk4c", "" },
+ { "unk4C", "" },
{ "fadeScenePal", "" },
{ "dummy4E", "" },
{ "dummy4F", "" },
@@ -151,7 +151,7 @@
{ "blockInWalkableRegion", "" },
// 0x5c
{ "blockOutWalkableRegion", "" },
- { "unk5d", "" },
+ { "unk5D", "" },
{ "setCauldronState", "" },
{ "showItemString", "" },
// 0x60
@@ -261,7 +261,7 @@
_data = NULL;
}
-Kyra::Disassembler::Disassembler(Engine *engine) : ::Disassembler(), _engine(engine) {
+Kyra::Disassembler::Disassembler(Engine *engine, std::vector<Instruction> &insts) : ::Disassembler(insts), _engine(engine) {
}
Kyra::Disassembler::~Disassembler() {
@@ -342,6 +342,7 @@
if (addr == (uint16)-1)
continue;
+ addr++;
addr <<= 1;
if (minFuncAddr > addr) {
Modified: tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/kyra/disassembler.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -63,7 +63,7 @@
*
* @param engine Pointer to the Kyra::Engine used for this script.
*/
- Disassembler(Engine *engine);
+ Disassembler(Engine *engine, std::vector<Instruction> &insts);
~Disassembler();
void doDisassemble() throw(UnknownOpcodeException);
};
Modified: tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -23,8 +23,8 @@
#include "engine.h"
#include "disassembler.h"
-::Disassembler *Kyra::Engine::getDisassembler() {
- return new Disassembler(this);
+::Disassembler *Kyra::Engine::getDisassembler(std::vector<Instruction> &insts) {
+ return new Disassembler(this, insts);
}
uint32 Kyra::Engine::getDestAddress(ConstInstIterator it) const {
Modified: tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/kyra/engine.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -35,7 +35,7 @@
*/
class Engine : public ::Engine {
public:
- ::Disassembler *getDisassembler();
+ ::Disassembler *getDisassembler(std::vector<Instruction> &insts);
uint32 getDestAddress(ConstInstIterator it) const;
::CodeGenerator *getCodeGenerator(std::ostream &output);
bool supportsCodeGen() { return false; }
Modified: tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -27,6 +27,9 @@
#include "disassembler.h"
+Scumm::v6::Disassembler::Disassembler(std::vector<Instruction> &insts) : ::SimpleDisassembler(insts) {
+}
+
void Scumm::v6::Disassembler::doDisassemble() throw(UnknownOpcodeException) {
std::string blockName;
for (int i = 0; i < 4; i++) {
Modified: tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -34,6 +34,8 @@
*/
class Disassembler : public SimpleDisassembler {
public:
+ Disassembler(std::vector<Instruction> &insts);
+
void doDisassemble() throw(UnknownOpcodeException);
void readParameter(Parameter *p, char type);
Modified: tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -24,8 +24,8 @@
#include "disassembler.h"
#include "codegen.h"
-::Disassembler *Scumm::v6::Engine::getDisassembler() {
- return new Disassembler();
+::Disassembler *Scumm::v6::Engine::getDisassembler(std::vector<Instruction> &insts) {
+ return new Disassembler(insts);
}
uint32 Scumm::v6::Engine::getDestAddress(ConstInstIterator it) const {
Modified: tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/scummv6/engine.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -34,7 +34,7 @@
*/
class Engine : public ::Engine {
public:
- ::Disassembler *getDisassembler();
+ ::Disassembler *getDisassembler(std::vector<Instruction> &insts);
uint32 getDestAddress(ConstInstIterator it) const;
::CodeGenerator *getCodeGenerator(std::ostream &output);
};
Modified: tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -22,6 +22,9 @@
#include "simple_disassembler.h"
+SimpleDisassembler::SimpleDisassembler(std::vector<Instruction> &insts) : ::Disassembler(insts) {
+}
+
void SimpleDisassembler::readParams(Instruction *inst, char *typeString) {
while (*typeString) {
Parameter p;
Modified: tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/simple_disassembler.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -47,6 +47,9 @@
* @param type Character describing the type of the parameter.
*/
virtual void readParameter(Parameter *p, char type);
+
+public:
+ SimpleDisassembler(std::vector<Instruction> &insts);
};
#define INC_ADDR _address++;
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/cfg_test.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -33,10 +33,11 @@
class CFGTestSuite : public CxxTest::TestSuite {
public:
void testUnreachable() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/unreachable.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
Graph g = c->getGraph();
@@ -66,10 +67,11 @@
};
void testBranching() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/branches.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
Graph g = c->getGraph();
@@ -99,10 +101,11 @@
}
void testGrouping() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/branches.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -113,7 +116,7 @@
GroupPtr gr = GET(*it);
switch (gr->_start->_address) {
case 0:
- TS_ASSERT(gr->_end->_address == 2);
+ TS_ASSERT(gr->_end->_address == 2);
TS_ASSERT(boost::in_degree(*it, g) == 0 && boost::out_degree(*it, g) == 2);
break;
case 5:
@@ -132,10 +135,11 @@
}
void testShortCircuitDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/short-circuit.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -146,10 +150,11 @@
}
void testWhileDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -165,10 +170,11 @@
}
void testDoWhileDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -184,10 +190,11 @@
}
void testBreakDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/break-while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -201,10 +208,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/break-do-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -218,10 +226,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/break-do-while2.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -237,10 +246,11 @@
}
void testContinueDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/continue-while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -256,10 +266,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/continue-do-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -273,10 +284,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/continue-do-while2.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -292,10 +304,11 @@
}
void testIfDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/if.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -309,10 +322,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/break-do-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -326,10 +340,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/break-do-while2.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -343,10 +358,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/continue-do-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -360,10 +376,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/continue-do-while2.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -379,10 +396,11 @@
}
void testElseDetection() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/if-else.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -398,10 +416,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/if-no-else.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -419,10 +438,11 @@
}
void testNestedLoops() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/do-while-in-while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -438,10 +458,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/nested-do-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -457,10 +478,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/nested-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -476,10 +498,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/nested-while2.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -495,10 +518,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/while-in-do-while.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -514,10 +538,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/while-in-do-while2.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
@@ -537,10 +562,11 @@
// This test requires script-30.dmp from Sam & Max: Hit The Road.
// 6e48faca13e1f6df9341567608962744 *script-30.dmp
void testSamAndMaxScript30() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/script-30.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -571,7 +597,7 @@
TS_ASSERT(gr->_endElse.size() == 1 && gr->_endElse[0]->_start->_address == 0x8B);
break;
case 0x91:
- TS_ASSERT(gr->_type == kNormal || gr->_type == kIfCond); // Allow inclusion of the pop instruction immediately before
+ TS_ASSERT(gr->_type == kNormal || gr->_type == kIfCond); // Allow inclusion of the pop instruction immediately before
TS_ASSERT(gr->_startElse);
TS_ASSERT(gr->_endElse.empty());
break;
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/codegen.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/codegen.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/codegen.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -72,10 +72,11 @@
class CodeGenTestSuite : public CxxTest::TestSuite {
public:
void testContinue() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/continue-do-while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -115,10 +116,11 @@
}
void testBreak() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/break-while.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -158,10 +160,11 @@
}
void testElse() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/if-else.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -203,10 +206,11 @@
// 6e48faca13e1f6df9341567608962744 *script-30.dmp
// afd7dc5d377894b3b9d0504927adf1b1 *script-48.dmp
void testCoalescing() {
+ std::vector<Instruction> insts;
Scumm::v6::Engine *engine = new Scumm::v6::Engine();
- Disassembler *d = engine->getDisassembler();
+ Disassembler *d = engine->getDisassembler(insts);
d->open("decompiler/test/script-30.dmp");
- std::vector<Instruction> insts = d->disassemble();
+ d->disassemble();
delete d;
ControlFlow *c = new ControlFlow(insts, engine);
c->createGroups();
@@ -232,10 +236,11 @@
delete c;
delete engine;
+ insts.clear();
engine = new Scumm::v6::Engine();
- d = engine->getDisassembler();
+ d = engine->getDisassembler(insts);
d->open("decompiler/test/script-48.dmp");
- insts = d->disassemble();
+ d->disassemble();
delete d;
c = new ControlFlow(insts, engine);
c->createGroups();
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -22,6 +22,9 @@
#include "pasc.h"
+PasCDisassembler::PasCDisassembler(std::vector<Instruction> &insts) : ::SimpleDisassembler(insts) {
+}
+
void PasCDisassembler::doDisassemble() throw(UnknownOpcodeException) {
START_OPCODES;
//Basic machine operations
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/pasc.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -27,6 +27,7 @@
class PasCDisassembler : public SimpleDisassembler {
public:
+ PasCDisassembler(std::vector<Instruction> &insts);
void doDisassemble() throw(UnknownOpcodeException);
};
#endif
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.cpp 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.cpp 2010-08-06 00:11:27 UTC (rev 51774)
@@ -22,6 +22,9 @@
#include "subopcode.h"
+SubOpcodeDisassembler::SubOpcodeDisassembler(std::vector<Instruction> &insts) : ::SimpleDisassembler(insts) {
+}
+
void SubOpcodeDisassembler::doDisassemble() throw(UnknownOpcodeException) {
START_OPCODES;
START_SUBOPCODE(0xFF)
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/disassembler/subopcode.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -27,6 +27,7 @@
class SubOpcodeDisassembler : public SimpleDisassembler {
public:
+ SubOpcodeDisassembler(std::vector<Instruction> &insts);
void doDisassemble() throw(UnknownOpcodeException);
};
#endif
Modified: tools/branches/gsoc2010-decompiler/decompiler/test/disassembler_test.h
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/test/disassembler_test.h 2010-08-05 23:59:34 UTC (rev 51773)
+++ tools/branches/gsoc2010-decompiler/decompiler/test/disassembler_test.h 2010-08-06 00:11:27 UTC (rev 51774)
@@ -30,9 +30,10 @@
public:
void testDisassembly() {
try {
- PasCDisassembler p;
+ std::vector<Instruction> insts;
+ PasCDisassembler p(insts);
p.open("decompiler/test/hanoi20.pasb");
- std::vector<Instruction> insts = p.disassemble();
+ p.disassemble();
TS_ASSERT(insts[0]._address == 0);
TS_ASSERT(insts[0]._opcode == 0x00);
TS_ASSERT(insts[0]._name == "PUSH");
@@ -50,9 +51,10 @@
void testSubOpcodeDisassembly() {
try {
- SubOpcodeDisassembler s;
+ std::vector<Instruction> insts;
+ SubOpcodeDisassembler s(insts);
s.open("decompiler/test/subopcode_test.bin");
- std::vector<Instruction> insts = s.disassemble();
+ s.disassemble();
TS_ASSERT(insts[0]._name == "FOO");
TS_ASSERT(insts[0]._opcode == 0xFFFF);
} catch (...) {
@@ -62,7 +64,8 @@
void testUnknownOpcodeException() {
try {
- SubOpcodeDisassembler s;
+ std::vector<Instruction> insts;
+ SubOpcodeDisassembler s(insts);
s.open("decompiler/test/unknownopcode_test.bin");
s.disassemble();
TS_ASSERT(false);
@@ -77,9 +80,10 @@
// 1ab08298c9c8fb4c77953756989c7449 *script-15.dmp
void testScummv6DisassemblerScript15() {
try {
- Scumm::v6::Disassembler s;
+ std::vector<Instruction> insts;
+ Scumm::v6::Disassembler s(insts);
s.open("decompiler/test/script-15.dmp");
- std::vector<Instruction> insts = s.disassemble();
+ s.disassemble();
TS_ASSERT(insts.size() == 11);
TS_ASSERT(insts[0]._address == 0);
TS_ASSERT(insts[0]._opcode == 0x03);
@@ -131,9 +135,10 @@
// f75f7ce110f378735d449f8eeb4a68e5 *script-31.dmp
void testScummv6DisassemblerScript31() {
try {
- Scumm::v6::Disassembler s;
+ std::vector<Instruction> insts;
+ Scumm::v6::Disassembler s(insts);
s.open("decompiler/test/script-31.dmp");
- std::vector<Instruction> insts = s.disassemble();
+ s.disassemble();
TS_ASSERT(insts.size() == 5);
TS_ASSERT(insts[0]._address == 0);
TS_ASSERT(insts[0]._opcode == 0x01);
@@ -163,9 +168,10 @@
// 9f09418bf34abbdec0ec54f388d8dca4 *script-33.dmp
void testScummv6DisassemblerScript33() {
try {
- Scumm::v6::Disassembler s;
+ std::vector<Instruction> insts;
+ Scumm::v6::Disassembler s(insts);
s.open("decompiler/test/script-33.dmp");
- std::vector<Instruction> insts = s.disassemble();
+ s.disassemble();
TS_ASSERT(insts.size() == 10);
TS_ASSERT(insts[0]._address == 0);
TS_ASSERT(insts[0]._opcode == 0x01);
@@ -214,9 +220,10 @@
// f010dc659264674a2b6da298acd0b88b *room-9-202.dmp
void testScummv6StackChangeFixRoom9202() {
try {
- Scumm::v6::Disassembler s;
+ std::vector<Instruction> insts;
+ Scumm::v6::Disassembler s(insts);
s.open("decompiler/test/room-9-202.dmp");
- std::vector<Instruction> insts = s.disassemble();
+ s.disassemble();
InstIterator it = insts.end();
it -= 8;
TS_ASSERT(it->_stackChange == -3);
@@ -229,9 +236,10 @@
// 6e48faca13e1f6df9341567608962744 *script-30.dmp
void testScummv6StackChangeFixScript30() {
try {
- Scumm::v6::Disassembler s;
+ std::vector<Instruction> insts;
+ Scumm::v6::Disassembler s(insts);
s.open("decompiler/test/script-30.dmp");
- std::vector<Instruction> insts = s.disassemble();
+ s.disassemble();
InstIterator it = insts.end();
it -= 3;
TS_ASSERT(it->_stackChange == -6);
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