From 0a60be92469d2264eeca1f03bd09770d163e2d17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 23 Jan 2021 14:16:11 +0100 Subject: [PATCH] Support for comma operator in switch case statements --- CHANGELOG.md | 2 + .../src/com/jpexs/decompiler/graph/Graph.java | 88 ++++++++++++++---- .../decompiler/flash/ActionScript3Test.java | 16 ++++ .../flashdevelop/bin/flashdevelop.swf | Bin 17701 -> 17972 bytes .../testdata/flashdevelop/src/Main.as | 3 +- .../flashdevelop/src/tests/TestSwitchComma.as | 27 ++++++ 6 files changed, 116 insertions(+), 20 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestSwitchComma.as diff --git a/CHANGELOG.md b/CHANGELOG.md index 6010545bb..5bf3eba4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to this project will be documented in this file. - Using new FFDec icon on Mac - AS3: get/set slot for global scope - AS3: Incorrect handling of strict equals operator in if vs switch resulting in §§pop +- Better goto detection/for continue +- Support for comma operator in switch case statements ### Changed - AS3 test methods separated to classes 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 6e261b927..44c285289 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -28,6 +28,7 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.model.AndItem; import com.jpexs.decompiler.graph.model.BranchStackResistant; import com.jpexs.decompiler.graph.model.BreakItem; +import com.jpexs.decompiler.graph.model.CommaExpressionItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DefaultItem; import com.jpexs.decompiler.graph.model.DoWhileItem; @@ -100,7 +101,6 @@ public class Graph { return new LinkedHashMap<>(); } - protected List filter(List list) { return new ArrayList<>(list); } @@ -747,7 +747,6 @@ public class Graph { //GraphPartDecision decision = prefix.isEmpty() ? null : prefix.get(prefix.size() - 1); //int removedCount = decisionToRemovedCount.containsKey(decision) ? decisionToRemovedCount.get(decision) : 0; - for (int i = 0; i < comparedPaths.size(); i++) { for (int j = prefix.size(); j < comparedPaths.get(i).size(); j++) { GraphPart partToClose = comparedPaths.get(i).get(j).part; @@ -877,7 +876,6 @@ public class Graph { } return null; }*/ - protected boolean isPartEmpty(GraphPart part) { return false; } @@ -2346,8 +2344,12 @@ public class Graph { if (part.nextParts.size() > 2) { GraphPart next = getMostCommonPart(localData, part.nextParts, loops, new ArrayList<>()); List vis = new ArrayList<>(); - GraphTargetItem switchedItem = stack.pop(); + GraphTargetItem originalSwitchedItem = stack.pop(); makeAllCommands(currentRet, stack); + GraphTargetItem switchedItem = originalSwitchedItem; + if ((switchedItem instanceof PopItem) && !currentRet.isEmpty() && (currentRet.get(currentRet.size() - 1) instanceof IfItem)) { + switchedItem = currentRet.get(currentRet.size() - 1); + } List caseValues = new ArrayList<>(); List> caseCommands = new ArrayList<>(); @@ -2365,26 +2367,68 @@ public class Graph { GraphTargetItem it = switchedItem; int defaultBranch = 0; boolean hasExpr = false; + List commaCommands = new ArrayList<>(); + Map> caseCommaCommands = new HashMap<>(); - while (it instanceof TernarOpItem) { - TernarOpItem to = (TernarOpItem) it; - if (to.expression instanceof EqualsTypeItem) { - if (to.onTrue instanceof IntegerValueTypeItem) { - int cpos = ((IntegerValueTypeItem) to.onTrue).intValue(); - caseExpressionLeftSides.put(cpos, ((EqualsTypeItem) to.expression).getLeftSide()); - caseExpressionRightSides.put(cpos, ((EqualsTypeItem) to.expression).getRightSide()); - it = to.onFalse; + while ((it instanceof TernarOpItem) || (it instanceof IfItem)) { + + if (it instanceof IfItem) { + IfItem ii = (IfItem) it; + if (ii.expression instanceof EqualsTypeItem) { + if (!ii.onFalse.isEmpty() && !ii.onTrue.isEmpty() + && ii.onTrue.get(ii.onTrue.size() - 1) instanceof PushItem + && ii.onTrue.get(ii.onTrue.size() - 1).value instanceof IntegerValueTypeItem) { + int cpos = ((IntegerValueTypeItem) ii.onTrue.get(ii.onTrue.size() - 1).value).intValue(); + caseCommaCommands.put(cpos, commaCommands); + caseExpressionLeftSides.put(cpos, ((EqualsTypeItem) ii.expression).getLeftSide()); + caseExpressionRightSides.put(cpos, ((EqualsTypeItem) ii.expression).getRightSide()); + commaCommands = new ArrayList<>(); + for (int f = 0; f < ii.onFalse.size() - 1; f++) { + commaCommands.add(ii.onFalse.get(f)); + } + it = ii.onFalse.get(ii.onFalse.size() - 1); + if (it instanceof PushItem) { + it = it.value; + } + } else { + break; + } + } else if (ii.expression instanceof FalseItem && !ii.onFalse.isEmpty()) { + it = ii.onFalse.get(ii.onFalse.size() - 1); + } else if (ii.expression instanceof TrueItem && !ii.onTrue.isEmpty()) { + it = ii.onTrue.get(ii.onTrue.size() - 1); + } else { + break; + } + } else if (it instanceof TernarOpItem) { + TernarOpItem to = (TernarOpItem) it; + if (to.expression instanceof EqualsTypeItem) { + if (to.onTrue instanceof IntegerValueTypeItem) { + int cpos = ((IntegerValueTypeItem) to.onTrue).intValue(); + caseExpressionLeftSides.put(cpos, ((EqualsTypeItem) to.expression).getLeftSide()); + caseExpressionRightSides.put(cpos, ((EqualsTypeItem) to.expression).getRightSide()); + caseCommaCommands.put(cpos, commaCommands); + commaCommands = new ArrayList<>(); + it = to.onFalse; + } else { + break; + } + } else if (to.expression instanceof FalseItem) { + it = to.onFalse; + } else if (to.expression instanceof TrueItem) { + it = to.onTrue; } else { break; } - } else if (to.expression instanceof FalseItem) { - it = to.onFalse; - } else if (to.expression instanceof TrueItem) { - it = to.onTrue; - } else { - break; } } + + if (switchedItem != originalSwitchedItem && !caseExpressionRightSides.isEmpty()) { + currentRet.remove(currentRet.size() - 1); + } else { + switchedItem = originalSwitchedItem; + } + //int ignoredBranch = -1; if (it instanceof IntegerValueTypeItem) { defaultBranch = ((IntegerValueTypeItem) it).intValue(); @@ -2432,7 +2476,13 @@ public class Graph { for (int i = 1; i < part.nextParts.size(); i++) { if (caseExpressions.containsKey(pos)) { - caseValues.add(caseExpressions.get(pos)); + GraphTargetItem expr = caseExpressions.get(pos); + if (caseCommaCommands.get(pos).size() > 0) { + List exprCommaCommands = new ArrayList<>(caseCommaCommands.get(pos)); + exprCommaCommands.add(expr); + expr = new CommaExpressionItem(null, expr.lineStartItem, exprCommaCommands); + } + caseValues.add(expr); } else if (part.nextParts.get(i) == defaultPart) { caseValues.add(new DefaultItem()); } else { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index 6cb3f954b..002bfd1ae 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -1162,6 +1162,22 @@ public class ActionScript3Test extends ActionScriptTestBase { false); } + @Test + public void testSwitchComma() { + decompileMethod("testSwitchComma", "var a:String = \"A\";\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case \"A\":\r\n" + + "trace(\"is A\");\r\n" + + "break;\r\n" + + "case \"B\":\r\n" + + "trace(\"is B\");\r\n" + + "case TestSwitchComma.X, \"C\":\r\n" + + "trace(\"is C\");\r\n" + + "}\r\n", + false); + } + @Test public void testSwitchDefault() { decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf index b5034f1bb0cb339c4be54194dd6690aadbe8d9a9..0544aa7585eb8b6f48410233f4383612e25cabce 100644 GIT binary patch delta 15623 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
    TP{ZN8cVanvFHYyj0XxqhJj{Tx#Xen4q42eQ4B| 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 delta 15331 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