diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index a28f7b585..a9bcffe39 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -1692,10 +1692,9 @@ public class Graph { //makeAllCommands(currentRet, stack); stack = (TranslateStack) stack.clone(); stack.clear(); - loopItem = new UniversalLoopItem(null, localData.lineStartInstruction, currentLoop); + loopItem = new UniversalLoopItem(null, localData.lineStartInstruction, currentLoop, new ArrayList<>()); //loopItem.commands=printGraph(visited, localData, stack, allParts, parent, part, stopPart, loops); currentRet.add(loopItem); - loopItem.commands = new ArrayList<>(); currentRet = loopItem.commands; //return ret; } @@ -2073,6 +2072,7 @@ public class Graph { List bodyBranch = null; boolean inverted = false; boolean breakpos2 = false; + BreakItem addBreakItem = null; if ((ifi.onTrue.size() == 1) && (ifi.onTrue.get(0) instanceof BreakItem)) { BreakItem bi = (BreakItem) ifi.onTrue.get(0); if (bi.loopId == currentLoop.id) { @@ -2086,12 +2086,13 @@ public class Graph { } } else if (loopItem.commands.size() == 2 && (loopItem.commands.get(1) instanceof BreakItem)) { BreakItem bi = (BreakItem) loopItem.commands.get(1); - if (bi.loopId == currentLoop.id) { - if (ifi.onTrue.isEmpty()) { - inverted = true; - } - bodyBranch = inverted ? ifi.onFalse : ifi.onTrue; - breakpos2 = true; + if (ifi.onTrue.isEmpty()) { + inverted = true; + } + bodyBranch = inverted ? ifi.onFalse : ifi.onTrue; + breakpos2 = true; + if (bi.loopId != currentLoop.id) { //it's break of another parent loop + addBreakItem = bi; //we must add it after the loop } } if (bodyBranch != null) { @@ -2130,6 +2131,9 @@ public class Graph { } else { ret.add(index, li = new WhileItem(expr.getSrc(), expr.getLineStartItem(), currentLoop, exprList, commands)); } + if (addBreakItem != null) { + ret.add(index + 1, addBreakItem); + } loopTypeFound = true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java index c20546d59..6dd9e4b2e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java @@ -12,17 +12,14 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; -import com.jpexs.decompiler.flash.helpers.LoopWithType; -import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.graph.Block; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; -import com.jpexs.decompiler.graph.TypeItem; import java.util.ArrayList; import java.util.List; @@ -30,72 +27,15 @@ import java.util.List; * * @author JPEXS */ -public class UniversalLoopItem extends LoopItem implements Block { +public class UniversalLoopItem extends WhileItem implements Block { - public List commands; + static final List TRUE_EXPRESSION = new ArrayList<>(); - private boolean labelUsed; - - public UniversalLoopItem(GraphSourceItem src, GraphSourceItem lineStartIns, Loop loop) { - super(src, lineStartIns, loop); + static { + TRUE_EXPRESSION.add(new TrueItem(null, null)); } - @Override - public boolean needsSemicolon() { - return false; - } - - @Override - public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - if (writer instanceof NulWriter) { - ((NulWriter) writer).startLoop(loop.id, LoopWithType.LOOP_TYPE_LOOP); - } - if (labelUsed) { - writer.append("loop").append(loop.id).append(":").newLine(); - } - writer.append("while"); - if (writer.getFormatting().spaceBeforeParenthesesWhileParentheses) { - writer.append(" "); - } - writer.append("(true)"); - appendBlock(null, writer, localData, commands); - if (writer instanceof NulWriter) { - LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); - labelUsed = loopOjb.used; - } - return writer; - } - - @Override - public List getContinues() { - List ret = new ArrayList<>(); - for (GraphTargetItem ti : commands) { - if (ti instanceof ContinueItem) { - ret.add((ContinueItem) ti); - } - if (ti instanceof Block) { - ret.addAll(((Block) ti).getContinues()); - } - } - return ret; - } - - @Override - public List> getSubs() { - List> ret = new ArrayList<>(); - if (commands != null) { - ret.add(commands); - } - return ret; - } - - @Override - public boolean hasReturnValue() { - return false; - } - - @Override - public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + public UniversalLoopItem(GraphSourceItem src, GraphSourceItem lineStartIns, Loop loop, List commands) { + super(src, lineStartIns, loop, TRUE_EXPRESSION, commands); } }