diff --git a/CHANGELOG.md b/CHANGELOG.md index bbed18eac..5df4ec8e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - [#1669] FILLSTYLE color handling in DefineShape3/4 - [#1668] Not removing SymbolClass/ExportAssets entry on character remove - [#1670] Parent component/window of dialogs not properly set +- AS decompilation - Gotos handling vs and/or ## [14.3.1] - 2021-03-25 ### Fixed 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 1901a6df9..535a89634 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -2048,8 +2048,11 @@ public class Graph { boolean parseNext = true; //****************************DECOMPILING PART************* - GraphPartMarkedArrayList output = new GraphPartMarkedArrayList<>(); + if (stack.isEmpty() && (currentRet instanceof GraphPartMarkedArrayList)) { + ((GraphPartMarkedArrayList) currentRet).clearCurrentParts(); + } + GraphPartMarkedArrayList output = new GraphPartMarkedArrayList<>(); output.startPart(part); if (currentRet instanceof GraphPartMarkedArrayList) { ((GraphPartMarkedArrayList) currentRet).startPart(part); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPartMarkedArrayList.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPartMarkedArrayList.java index e007c710b..f1bcc119c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPartMarkedArrayList.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPartMarkedArrayList.java @@ -10,19 +10,19 @@ import java.util.List; */ public class GraphPartMarkedArrayList extends ArrayList { - private List listParts = new ArrayList<>(); - private GraphPart currentPart = null; + private List> listParts = new ArrayList<>(); + private List currentParts = new ArrayList<>(); public GraphPartMarkedArrayList(Collection collection) { super(collection); if (collection instanceof GraphPartMarkedArrayList) { for (int i = 0; i < collection.size(); i++) { - listParts.add((GraphPart) ((GraphPartMarkedArrayList) collection).listParts.get(i)); + listParts.add((List) ((GraphPartMarkedArrayList) collection).listParts.get(i)); } - currentPart = ((GraphPartMarkedArrayList) collection).currentPart; + currentParts = ((GraphPartMarkedArrayList) collection).currentParts; } else { for (int i = 0; i < collection.size(); i++) { - listParts.add(currentPart); + listParts.add(currentParts); } } } @@ -31,38 +31,48 @@ public class GraphPartMarkedArrayList extends ArrayList { } public void startPart(GraphPart part) { - currentPart = part; + currentParts.add(part); + } + + public void clearCurrentParts() { + currentParts = new ArrayList<>(); } @Override public boolean add(E e) { - listParts.add(currentPart); + listParts.add(currentParts); return super.add(e); } @Override public void add(int index, E element) { - listParts.add(index, currentPart); + listParts.add(index, currentParts); super.add(index, element); } - public GraphPart getPartAt(int index) { + public List getPartsAt(int index) { return listParts.get(index); } public int indexOfPart(GraphPart part) { - return listParts.indexOf(part); + for (int i = 0; i < listParts.size(); i++) { + List list = listParts.get(i); + if (list.indexOf(part) > -1) { + return i; + } + } + return -1; } @Override public boolean addAll(Collection c) { if (c instanceof GraphPartMarkedArrayList) { for (int i = 0; i < c.size(); i++) { - listParts.add((GraphPart) ((GraphPartMarkedArrayList) c).listParts.get(i)); + listParts.add((List) ((GraphPartMarkedArrayList) c).listParts.get(i)); } } else { for (int i = 0; i < c.size(); i++) { - listParts.add(currentPart); + listParts.add(currentParts); } } return super.addAll(c); @@ -72,11 +82,11 @@ public class GraphPartMarkedArrayList extends ArrayList { public boolean addAll(int index, Collection c) { if (c instanceof GraphPartMarkedArrayList) { for (int i = 0; i < c.size(); i++) { - listParts.add(index + i, (GraphPart) ((GraphPartMarkedArrayList) c).listParts.get(i)); + listParts.add(index + i, (List) ((GraphPartMarkedArrayList) c).listParts.get(i)); } } else { for (int i = 0; i < c.size(); i++) { - listParts.add(index + i, currentPart); + listParts.add(index + i, currentParts); } } return super.addAll(index, c);