[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