From 05d5fee4092812eed5b79e200483e181505f90eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 7 Sep 2023 23:15:11 +0200 Subject: [PATCH] Fixed #2052 Detection of switches based on notequal operator update license in header --- CHANGELOG.md | 1 + .../decompiler/flash/HarmanDecryption.java | 6 +- .../avm2/model/operations/NeqAVM2Item.java | 3 +- .../model/operations/StrictNeqAVM2Item.java | 3 +- .../abc/avm2/parser/pcode/Flasm3Lexer.java | 5 +- .../methodinfo_parser/MethodInfoLexer.java | 5 +- .../model/operations/NeqActionItem.java | 3 +- .../model/operations/StrictNeqActionItem.java | 3 +- .../script/graphviz/Flasm3Lexer.java | 4 +- .../src/com/jpexs/decompiler/graph/Graph.java | 48 ++++--- .../decompiler/graph/NotEqualsTypeItem.java | 26 ++++ .../com/jpexs/helpers/utf8/Utf8Helper.java | 6 +- .../ActionScript3AssembledDecompileTest.java | 19 +++ .../as3_assembled-0/as3_assembled-0.main.abc | Bin 7506 -> 7834 bytes .../as3_assembled-0.main.asasm | 1 + .../tests/TestMutatingSwitch.class.asasm | 118 ++++++++++++++++++ .../tests/TestMutatingSwitch.script.asasm | 29 +++++ .../as3_assembled/bin/as3_assembled.swf | Bin 4518 -> 4701 bytes .../flash/gui/tagtree/TagTreeContextMenu.java | 6 +- 19 files changed, 246 insertions(+), 40 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/NotEqualsTypeItem.java create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.class.asasm create mode 100644 libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.script.asasm diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c1058aa1..c2091df29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. - [#2052], [#2058] Adding new script placing class to incorrect DoABC tag - [#2072] AS3 direct editation - incorrectly using trait names of top level classes - [#2029] Simplify expressions stripping getlex and also ignoring some types of expressions +- [#2052] Detection of switches based on notequal operator ### Changed - [#2070] String values inside SWF to XML export are backslash escaped diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/HarmanDecryption.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/HarmanDecryption.java index 925774328..c6a4a379e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/HarmanDecryption.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/HarmanDecryption.java @@ -1,16 +1,16 @@ /* * Copyright (C) 2010-2023 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java index c05d8efb4..8efc82b22 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.NotEqualsTypeItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; @@ -34,7 +35,7 @@ import java.util.List; * * @author JPEXS */ -public class NeqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfCondition { +public class NeqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfCondition, NotEqualsTypeItem { public NeqAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem leftSide, GraphTargetItem rightSide) { super(instruction, lineStartIns, PRECEDENCE_EQUALITY, leftSide, rightSide, "!=", "", ""); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java index 037a27438..d28d2e530 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.NotEqualsTypeItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; @@ -34,7 +35,7 @@ import java.util.List; * * @author JPEXS */ -public class StrictNeqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfCondition { +public class StrictNeqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfCondition, NotEqualsTypeItem { public StrictNeqAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem leftSide, GraphTargetItem rightSide) { super(instruction, lineStartIns, PRECEDENCE_EQUALITY, leftSide, rightSide, "!==", "", ""); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/Flasm3Lexer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/Flasm3Lexer.java index 8d795d95b..b8636d048 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/Flasm3Lexer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/Flasm3Lexer.java @@ -1,7 +1,5 @@ -/* The following code was generated by JFlex 1.6.0 */ - /* - * Copyright (C) 2010-2021 JPEXS, All rights reserved. + * Copyright (C) 2010-2023 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,7 +14,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. */ -/* Flash assembler language lexer specification */ package com.jpexs.decompiler.flash.abc.avm2.parser.pcode; import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/methodinfo_parser/MethodInfoLexer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/methodinfo_parser/MethodInfoLexer.java index 5188b18f2..ba574d9a1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/methodinfo_parser/MethodInfoLexer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/methodinfo_parser/MethodInfoLexer.java @@ -1,7 +1,5 @@ -/* The following code was generated by JFlex 1.6.0 */ - /* - * Copyright (C) 2010-2016 JPEXS, All rights reserved. + * Copyright (C) 2010-2023 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,7 +14,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. */ -/* Method info lexer specification */ package com.jpexs.decompiler.flash.abc.methodinfo_parser; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java index 2259b453d..bce021c89 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.NotEqualsTypeItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; @@ -35,7 +36,7 @@ import java.util.List; * * @author JPEXS */ -public class NeqActionItem extends BinaryOpItem implements LogicalOpItem, Inverted { +public class NeqActionItem extends BinaryOpItem implements LogicalOpItem, Inverted, NotEqualsTypeItem { boolean version2; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java index 2ef36d297..051a2534f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.NotEqualsTypeItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; @@ -34,7 +35,7 @@ import java.util.List; * * @author JPEXS */ -public class StrictNeqActionItem extends BinaryOpItem implements LogicalOpItem, Inverted { +public class StrictNeqActionItem extends BinaryOpItem implements LogicalOpItem, Inverted, NotEqualsTypeItem { public StrictNeqActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem leftSide, GraphTargetItem rightSide) { super(instruction, lineStartIns, PRECEDENCE_EQUALITY, leftSide, rightSide, "!==", "", ""); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/graphviz/Flasm3Lexer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/graphviz/Flasm3Lexer.java index 88ca4cb0b..b44cb9a74 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/graphviz/Flasm3Lexer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/graphviz/Flasm3Lexer.java @@ -1,7 +1,5 @@ -/* The following code was generated by JFlex 1.6.0 */ - /* - * Copyright (C) 2010-2021 JPEXS, All rights reserved. + * Copyright (C) 2010-2023 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public 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 76c41a6e9..291587a30 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.action.swf7.ActionDefineFunction2; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.model.AndItem; +import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.BranchStackResistant; import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.CommaExpressionItem; @@ -2346,19 +2347,27 @@ public class Graph { 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(); + List iiOnTrue = ii.onTrue; + List iiOnFalse = ii.onFalse; + if ((ii.expression instanceof EqualsTypeItem) || (ii.expression instanceof NotEqualsTypeItem)) { + + if (ii.expression instanceof NotEqualsTypeItem) { + iiOnTrue = ii.onFalse; + iiOnFalse = ii.onTrue; + } + + if (!iiOnFalse.isEmpty() && !iiOnTrue.isEmpty() + && iiOnTrue.get(iiOnTrue.size() - 1) instanceof PushItem + && iiOnTrue.get(iiOnTrue.size() - 1).value instanceof IntegerValueTypeItem) { + int cpos = ((IntegerValueTypeItem) iiOnTrue.get(iiOnTrue.size() - 1).value).intValue(); caseCommaCommands.put(cpos, commaCommands); - caseExpressionLeftSides.put(cpos, ((EqualsTypeItem) ii.expression).getLeftSide()); - caseExpressionRightSides.put(cpos, ((EqualsTypeItem) ii.expression).getRightSide()); + caseExpressionLeftSides.put(cpos, ((BinaryOpItem) ii.expression).getLeftSide()); + caseExpressionRightSides.put(cpos, ((BinaryOpItem) ii.expression).getRightSide()); commaCommands = new ArrayList<>(); - for (int f = 0; f < ii.onFalse.size() - 1; f++) { - commaCommands.add(ii.onFalse.get(f)); + for (int f = 0; f < iiOnFalse.size() - 1; f++) { + commaCommands.add(iiOnFalse.get(f)); } - it = ii.onFalse.get(ii.onFalse.size() - 1); + it = iiOnFalse.get(iiOnFalse.size() - 1); if (it instanceof PushItem) { it = it.value; } @@ -2374,14 +2383,21 @@ public class Graph { } } 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()); + GraphTargetItem toOnTrue = to.onTrue; + GraphTargetItem toOnFalse = to.onFalse; + if ((to.expression instanceof EqualsTypeItem) || (to.expression instanceof NotEqualsTypeItem)) { + if (to.expression instanceof NotEqualsTypeItem) { + toOnTrue = to.onFalse; + toOnFalse = to.onTrue; + } + + if (toOnTrue instanceof IntegerValueTypeItem) { + int cpos = ((IntegerValueTypeItem) toOnTrue).intValue(); + caseExpressionLeftSides.put(cpos, ((BinaryOpItem) to.expression).getLeftSide()); + caseExpressionRightSides.put(cpos, ((BinaryOpItem) to.expression).getRightSide()); caseCommaCommands.put(cpos, commaCommands); commaCommands = new ArrayList<>(); - it = to.onFalse; + it = toOnFalse; if (it instanceof CommaExpressionItem) { commaCommands = new ArrayList<>(); CommaExpressionItem ce = (CommaExpressionItem) it; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/NotEqualsTypeItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/NotEqualsTypeItem.java new file mode 100644 index 000000000..ce1f8f396 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/NotEqualsTypeItem.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2010-2023 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph; + +import com.jpexs.decompiler.graph.model.BinaryOp; + +/** + * + * @author JPEXS + */ +public interface NotEqualsTypeItem extends BinaryOp { +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/utf8/Utf8Helper.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/utf8/Utf8Helper.java index fc453e505..55ccc7eb2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/helpers/utf8/Utf8Helper.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/utf8/Utf8Helper.java @@ -1,16 +1,16 @@ /* * Copyright (C) 2010-2023 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java index 2225b0699..9015f9d6a 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3AssembledDecompileTest.java @@ -154,6 +154,25 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT false); } + @Test + public void testMutatingSwitch() { + decompileMethod("assembled", "testMutatingSwitch", "switch(this.k)\r\n" + + "{\r\n" + + "case \"a\":\r\n" + + "trace(\"A\");\r\n" + + "return;\r\n" + + "case \"b\":\r\n" + + "trace(\"B\");\r\n" + + "return;\r\n" + + "case \"c\":\r\n" + + "trace(\"C\");\r\n" + + "return;\r\n" + + "default:\r\n" + + "return;\r\n" + + "}\r\n", + false); + } + @Test public void testPushWhile() { decompileMethod("assembled", "testPushWhile", "var _loc3_:int = 5;\r\n" diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.abc index 95ce67e5cd376cc83fd29a67ced6fb9a586f8c53..12597eff223d23978fc3845dcbd54f854a1ef08d 100644 GIT binary patch delta 3252 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 T8!nVLe8<`Fj1@QSI${40ZbJsg diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm index 19061f329..a5f471b2d 100644 --- a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/as3_assembled-0.main.asasm @@ -31,5 +31,6 @@ program #include "tests/TestPushWhile.script.asasm" #include "tests/TestActivationProps.script.asasm" #include "tests/TestSwapAssignment.script.asasm" + #include "tests/TestMutatingSwitch.script.asasm" ; place to add next end ; program diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.class.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.class.asasm new file mode 100644 index 000000000..a41076954 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.class.asasm @@ -0,0 +1,118 @@ +class + refid "tests:TestMutatingSwitch" + instance QName(PackageNamespace("tests"), "TestMutatingSwitch") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("tests:TestMutatingSwitch") + iinit + refid "tests:TestMutatingSwitch/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageNamespace(""), "run") + method + refid "tests:TestMutatingSwitch/instance/run" + returns QName(PackageNamespace(""), "void") + body + maxstack 2 + localcount 4 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + jump ofs0028 + ofs0006: + label + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("MyClass"),ProtectedNamespace("MyClass"),StaticProtectedNs("MyClass"),PrivateNamespace("MyClass.as$0")]) + pushstring "A" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("MyClass"),ProtectedNamespace("MyClass"),StaticProtectedNs("MyClass"),PrivateNamespace("MyClass.as$0")]), 1 + returnvoid + ofs000f: + label + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("MyClass"),ProtectedNamespace("MyClass"),StaticProtectedNs("MyClass"),PrivateNamespace("MyClass.as$0")]) + pushstring "B" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("MyClass"),ProtectedNamespace("MyClass"),StaticProtectedNs("MyClass"),PrivateNamespace("MyClass.as$0")]), 1 + returnvoid + ofs0018: + label + findpropstrict Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("MyClass"),ProtectedNamespace("MyClass"),StaticProtectedNs("MyClass"),PrivateNamespace("MyClass.as$0")]) + pushstring "C" + callpropvoid Multiname("trace",[PackageNamespace(""),Namespace("http://adobe.com/AS3/2006/builtin"),PackageInternalNs(""),PrivateNamespace("MyClass"),ProtectedNamespace("MyClass"),StaticProtectedNs("MyClass"),PrivateNamespace("MyClass.as$0")]), 1 + returnvoid + ofs0021: + label + returnvoid + ofs0023: + label + jump ofs0076 + ofs0028: + getlocal0 + getproperty QName(PackageInternalNs(""),"k") + setlocal1 + pushstring "a" + getlocal1 + ifstrictne ofs0039 + pushbyte 0 + jump ofs0063 + ofs0039: + pushstring "b" + getlocal1 + ifstricteq ofs0044 ; here is stricteq instead of neq + jump ofs004a + ofs0044: + pushbyte 1 + jump ofs0063 + ofs004a: + pushstring "c" + getlocal1 + ifstrictne ofs0057 + pushbyte 2 + jump ofs0063 + ofs0057: + jump ofs0061 + pushbyte 3 + jump ofs0061 + ofs0061: + pushbyte 3 + ofs0063: + kill 1 + lookupswitch ofs0023, [ofs0006, ofs000f, ofs0018, ofs0021] + ofs0076: + returnvoid + + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + refid "tests:TestMutatingSwitch/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.script.asasm b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.script.asasm new file mode 100644 index 000000000..8d62cb908 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_assembled/abc/as3_assembled-0/tests/TestMutatingSwitch.script.asasm @@ -0,0 +1,29 @@ +script + sinit + refid "tests:TestMutatingSwitch/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + findpropstrict Multiname("TestMutatingSwitch", [PackageNamespace("tests")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PrivateNamespace(null, "tests:TestMutatingSwitch"), PackageNamespace(""), PackageNamespace("tests"), PackageInternalNs("tests"), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "tests:TestMutatingSwitch" + popscope + initproperty QName(PackageNamespace("tests"), "TestMutatingSwitch") + + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("tests"), "TestMutatingSwitch") + #include "TestMutatingSwitch.class.asasm" + end ; trait +end ; script diff --git a/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf b/libsrc/ffdec_lib/testdata/as3_assembled/bin/as3_assembled.swf index a0b2c869d91c589aaa78a31fbcbae24e6ea05472..72ba7628195de53d6f918d7f378874563e8a94ac 100644 GIT binary patch literal 4701 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 literal 4518 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 Ex+U_jDF6Tf diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index ca95797dd..d236517e8 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -1,16 +1,16 @@ /* * Copyright (C) 2010-2023 JPEXS - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */