/* * CreateWhileStatements (c) 1998 Jochen Hoenicke * * You may distribute under the terms of the GNU General Public License. * * IN NO EVENT SHALL JOCHEN HOENICKE BE LIABLE TO ANY PARTY FOR DIRECT, * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF JOCHEN HOENICKE * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JOCHEN HOENICKE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" * BASIS, AND JOCHEN HOENICKE HAS NO OBLIGATION TO PROVIDE MAINTENANCE, * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * $Id$ */ package jode; public class CreateWhileStatements extends FlowTransformation implements Transformation { public InstructionHeader transform(InstructionHeader gotoIH) { if (gotoIH.flowType == gotoIH.IFGOTO && gotoIH.successors[1] == gotoIH) /* This is an empty while loop */ return new WhileInstructionHeader(gotoIH, gotoIH); if (gotoIH.flowType != gotoIH.GOTO || gotoIH.nextInstruction == null || gotoIH.successors[0].addr < gotoIH.nextInstruction.addr || gotoIH.outer != gotoIH.successors[0].outer) return null; InstructionHeader ifgoto = gotoIH.successors[0]; if (ifgoto.getFlowType() != ifgoto.IFGOTO || ifgoto.outer != ifgoto.successors[1].outer) return null; InstructionHeader next = UnoptimizeWhileLoops(ifgoto.successors[1]); if (next != gotoIH.nextInstruction) return null; if (next != ifgoto.successors[1]) { ifgoto.successors[1].predecessors.removeElement(ifgoto); ifgoto.successors[1] = next; ifgoto.successors[1].predecessors.addElement(ifgoto); } if(Decompiler.isVerbose) System.err.print("w"); return new WhileInstructionHeader(gotoIH, ifgoto); } }