[Scummvm-cvs-logs] SF.net SVN: scummvm:[51630] tools/branches/gsoc2010-decompiler/decompiler/ codegen.cpp

pidgeot at users.sourceforge.net pidgeot at users.sourceforge.net
Mon Aug 2 19:04:46 CEST 2010


Revision: 51630
          http://scummvm.svn.sourceforge.net/scummvm/?rev=51630&view=rev
Author:   pidgeot
Date:     2010-08-02 17:04:46 +0000 (Mon, 02 Aug 2010)

Log Message:
-----------
Tighten up else coalescing criteria

Modified Paths:
--------------
    tools/branches/gsoc2010-decompiler/decompiler/codegen.cpp

Modified: tools/branches/gsoc2010-decompiler/decompiler/codegen.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/codegen.cpp	2010-08-02 17:04:14 UTC (rev 51629)
+++ tools/branches/gsoc2010-decompiler/decompiler/codegen.cpp	2010-08-02 17:04:46 UTC (rev 51630)
@@ -23,6 +23,7 @@
 #include "codegen.h"
 #include "engine.h"
 
+#include <algorithm>
 #include <iostream>
 #include <set>
 
@@ -248,9 +249,18 @@
 					switch (_curGroup->_type) {
 					case kIfCond:
 						if (_curGroup->_startElse && _curGroup->_code.size() == 1) {
-							_curGroup->_code.clear();
-							_curGroup->_coalescedElse = true;
-							s << "} else ";
+							OutEdgeRange oer = boost::out_edges(v, _g);
+							bool coalesceElse = false;
+							for (OutEdgeIterator oe = oer.first; oe != oer.second; ++oe) {
+								GroupPtr oGr = GET(boost::target(*oe, _g))->_prev;
+								if (std::find(oGr->_endElse.begin(), oGr->_endElse.end(), _curGroup.get()) != oGr->_endElse.end())
+									coalesceElse = true;
+							}
+							if (coalesceElse) {
+								_curGroup->_code.clear();
+								_curGroup->_coalescedElse = true;
+								s << "} else ";
+							}
 						}
 						s << "if (" << _stack.pop() << ") {";
 						addOutputLine(s.str(), _curGroup->_coalescedElse, true);
@@ -333,7 +343,7 @@
 	} while (it++ != _curGroup->_end);
 
 	// Add else end if necessary
-	for(ElseEndIterator elseIt = _curGroup->_endElse.begin(); elseIt != _curGroup->_endElse.end(); ++elseIt)
+	for (ElseEndIterator elseIt = _curGroup->_endElse.begin(); elseIt != _curGroup->_endElse.end(); ++elseIt)
 	{
 		if (!(*elseIt)->_coalescedElse)
 			addOutputLine("}", true, false);


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