From 4e528c181c88f82ae36c66a8f2173b9b59a1ba21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 17 Aug 2024 01:59:54 +0200 Subject: [PATCH] Fixed: Script/Class initializers order of assignment Changed: Compound script has slot/const traits inside main script initializer --- .gitignore | 1 + CHANGELOG.md | 5 + .../decompiler/flash/abc/ScriptPack.java | 68 ++--- .../decompiler/flash/abc/avm2/AVM2Code.java | 213 ++++++++++++++-- .../decompiler/flash/abc/avm2/CodeStats.java | 3 +- .../construction/NewClassIns.java | 3 +- .../abc/avm2/model/FullMultinameAVM2Item.java | 5 +- .../flash/abc/avm2/model/PackageAVM2Item.java | 88 +++++++ .../avm2/model/TraitSlotConstAVM2Item.java | 146 +++++++++++ .../parser/script/AVM2SourceGenerator.java | 158 ++++++++++-- .../parser/script/ActionScript3Parser.java | 158 +++++++++--- .../abc/avm2/parser/script/NameAVM2Item.java | 16 +- .../parser/script/UnresolvedAVM2Item.java | 6 +- .../flash/abc/types/AssignedValue.java | 9 +- .../flash/abc/types/MethodBody.java | 4 +- .../flash/abc/types/ScriptInfo.java | 4 + .../flash/abc/types/traits/Trait.java | 11 +- .../flash/abc/types/traits/TraitClass.java | 10 +- .../flash/abc/types/traits/TraitFunction.java | 2 +- .../types/traits/TraitMethodGetterSetter.java | 2 +- .../abc/types/traits/TraitSlotConst.java | 13 +- .../flash/abc/types/traits/Traits.java | 15 +- .../src/com/jpexs/decompiler/graph/Graph.java | 11 +- .../decompiler/graph/GraphTargetItem.java | 8 + .../decompiler/graph/model/LocalData.java | 10 +- .../flash/ActionScript2CompilerTest.java | 1 + .../ActionScript3AssembledDecompileTest.java | 58 ++--- .../as3decompile/ActionScript3ClassTest.java | 82 ++++++ .../ActionScript3ClassicAirDecompileTest.java | 238 +++++++++--------- .../ActionScript3ClassicDecompileTest.java | 238 +++++++++--------- ...ctionScript3CrossCompileDecompileTest.java | 62 ++--- ...ipt3CrossCompileSwfToolsDecompileTest.java | 62 ++--- .../testdata/as3_new/bin/as3_new.air.swf | Bin 30162 -> 30648 bytes .../testdata/as3_new/bin/as3_new.flex.swf | Bin 39982 -> 40744 bytes libsrc/ffdec_lib/testdata/as3_new/src/Main.as | 3 + .../tests_classes/TestScriptInitializer.as | 61 +++++ .../testdata/compound/bin/compound.abc | Bin 0 -> 1097 bytes .../testdata/compound/bin/compound.cpp | 74 ++++++ .../testdata/compound/bin/compound.h | 13 + .../testdata/compound/build_flex.bat | 2 + .../ffdec_lib/testdata/compound/src/Main.as | 27 ++ .../ffdec_lib/testdata/compound/src/Number.as | 4 + .../ffdec_lib/testdata/compound/src/Object.as | 6 + .../testdata/compound/src/Toplevel.as | 9 + .../compound/src/__AS3__/vec/Vector.as | 5 + .../testdata/compound/src/compound.as | 43 ++++ libsrc/ffdec_lib/testdata/compound/src/int.as | 4 + .../testdata/compound/src/mypkg/MyClass.as | 10 + .../testdata/compound/src/mypkg/MyClass2.as | 10 + .../ffdec_lib/testdata/compound/src/stubs.as | 5 + 50 files changed, 1521 insertions(+), 465 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java create mode 100644 libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestScriptInitializer.as create mode 100644 libsrc/ffdec_lib/testdata/compound/bin/compound.abc create mode 100644 libsrc/ffdec_lib/testdata/compound/bin/compound.cpp create mode 100644 libsrc/ffdec_lib/testdata/compound/bin/compound.h create mode 100644 libsrc/ffdec_lib/testdata/compound/build_flex.bat create mode 100644 libsrc/ffdec_lib/testdata/compound/src/Main.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/Number.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/Object.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/Toplevel.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/__AS3__/vec/Vector.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/compound.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/int.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass2.as create mode 100644 libsrc/ffdec_lib/testdata/compound/src/stubs.as diff --git a/.gitignore b/.gitignore index 64d0077d8..bedbc66cc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ *.identcache *.recompiled.swf *(Selective Sync Conflict* +~ffdec*.* buildlog.*.txt run_test_*.swf Thumbs.db diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f6c64132..c12f63aba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ All notable changes to this project will be documented in this file. - [#2275] Export to FlashDevelop - framerate setting - [#2276] Protected namespaces do not use fully qualified names - Target flash player version in FlashDevelop and IDEA projects +- Script/Class initializers order of assignment + + +### Changed +- Compound script has slot/const traits inside main script initializer ## [21.0.2] - 2024-08-12 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index b79bcab0a..9da95b296 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -35,6 +35,7 @@ import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.exporters.settings.ScriptExportSettings; @@ -258,7 +259,7 @@ public class ScriptPack extends AS3ClassTreeItem { int sinit_index = abc.script_info.get(scriptIndex).init_index; int sinit_bodyIndex = abc.findBodyIndex(sinit_index); - if (sinit_bodyIndex != -1) { + if (sinit_bodyIndex != -1 && (isSimple || traitIndices.isEmpty())) { //initialize all classes traits /*for (Trait t : traits) { if (t instanceof TraitClass) { @@ -306,42 +307,28 @@ public class ScriptPack extends AS3ClassTreeItem { if (!isSimple && traitIndices.isEmpty()) { for (Trait t : abc.script_info.get(scriptIndex).traits.traits) { + + if (t instanceof TraitSlotConst) { + continue; + } + String fullName = t.getName(abc).getNameWithNamespace(abc.constants, false).toPrintableString(true); writer.appendNoHilight("include \"" + fullName.replace(".", "/") + ".as\";").newLine(); } writer.newLine(); - } - - if (bodyIndex != -1 && (isSimple || traitIndices.isEmpty())) { - //Note: There must be trait/method highlight even if the initializer is empty to TraitList in GUI to work correctly - writer.startTrait(GraphTextWriter.TRAIT_SCRIPT_INITIALIZER); - writer.startMethod(script_init, null); - if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { - if (!scriptInitializerIsEmpty) { - writer.startBlock(); - List callStack = new ArrayList<>(); - callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).toString(callStack, abcIndex, path + "/.scriptinitializer", exportMode, abc, null, writer, new ArrayList<>(), new HashSet<>()); - writer.endBlock(); - } else { - writer.append(""); - } - } - writer.endMethod(); - writer.endTrait(); - if (!scriptInitializerIsEmpty) { - writer.newLine(); - first = false; - } - } - + } + for (int t : traitIndices) { + + Trait trait = traits.get(t); + + if ((trait instanceof TraitSlotConst) && convertData.assignedValues.containsKey((TraitSlotConst) trait)) { + continue; + } + if (!first) { writer.newLine(); } - - Trait trait = traits.get(t); - //if (!(trait instanceof TraitClass)) { writer.startTrait(t); //} @@ -357,6 +344,29 @@ public class ScriptPack extends AS3ClassTreeItem { } first = false; } + + if (bodyIndex != -1 && (isSimple || traitIndices.isEmpty())) { + //Note: There must be trait/method highlight even if the initializer is empty to TraitList in GUI to work correctly + writer.startTrait(GraphTextWriter.TRAIT_SCRIPT_INITIALIZER); + writer.startMethod(script_init, null); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + if (!scriptInitializerIsEmpty) { + //writer.startBlock(); + List callStack = new ArrayList<>(); + callStack.add(abc.bodies.get(bodyIndex)); + abc.bodies.get(bodyIndex).toString(callStack, abcIndex, path + "/.scriptinitializer", exportMode, abc, null, writer, new ArrayList<>(), new HashSet<>()); + //writer.endBlock(); + } else { + writer.append(""); + } + } + writer.endMethod(); + writer.endTrait(); + if (!scriptInitializerIsEmpty) { + writer.newLine(); + first = false; + } + } } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 36c07e1d9..ccde64c87 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -261,12 +261,15 @@ import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewFunctionAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.PackageAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.ReturnValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ReturnVoidAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.StoreNewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.TraitSlotConstAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.UndefinedAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.clauses.ForEachInAVM2Item; @@ -278,6 +281,7 @@ import com.jpexs.decompiler.flash.abc.types.ConvertData; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; @@ -296,6 +300,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphPart; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.decompiler.graph.SecondPassException; import com.jpexs.decompiler.graph.SimpleValue; @@ -312,8 +317,10 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -1905,6 +1912,34 @@ public class AVM2Code implements Cloneable { } } } + + if (ins.definition instanceof KillIns) { + int killedReg = ins.operands[0]; + if (output.size() >= 2 && !stack.isEmpty()) { + if ((stack.peek() instanceof LocalRegAVM2Item) && (((LocalRegAVM2Item) stack.peek()).regIndex == killedReg)) { + if (output.get(output.size() - 1) instanceof SetPropertyAVM2Item) { + SetPropertyAVM2Item setProp = (SetPropertyAVM2Item) output.get(output.size() - 1); + if ((output.get(output.size() - 2) instanceof SetLocalAVM2Item) && (((SetLocalAVM2Item) output.get(output.size() - 2)).regIndex == killedReg)) { + SetLocalAVM2Item setLoc = (SetLocalAVM2Item) output.get(output.size() - 2); + AVM2Instruction insAfter = ip + 1 < code.size() ? code.get(ip + 1) : null; + if (insAfter != null && (insAfter.definition instanceof PopIns)) { + if (setProp.value instanceof LocalRegAVM2Item) { + LocalRegAVM2Item locReg = (LocalRegAVM2Item) setProp.value; + if (locReg.regIndex == killedReg) { + setProp.value = setLoc.value; + output.remove(output.size() - 2); + stack.pop(); + ip += 2; + continue; + } + } + + } + } + } + } + } + } /* if (ins.definition instanceof DupIns) { int nextPos; @@ -2480,6 +2515,10 @@ public class AVM2Code implements Cloneable { } }*/ } + + private static interface BlockVisitor { + public void visitBlock(List items); + } /** * Converts code to source - list of GraphTargetItems. @@ -2541,10 +2580,10 @@ public class AVM2Code implements Cloneable { NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true); } - AssignedValue av = new AssignedValue(value, initializerType, methodIndex); + AssignedValue av = new AssignedValue(ti, value, initializerType, methodIndex); convertData.assignedValues.put(tsc, av); - list.remove(i); - i--; + //list.remove(i); + //i--; continue loopi; } } @@ -2609,10 +2648,10 @@ public class AVM2Code implements Cloneable { NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; f.functionName = tsc.getName(abc).getName(abc.constants, fullyQualifiedNames, true, true); } - AssignedValue av = new AssignedValue(value, initializerType, methodIndex); + AssignedValue av = new AssignedValue(ti, value, initializerType, methodIndex); convertData.assignedValues.put(tsc, av); - list.remove(i); - i--; + //list.remove(i); + //i--; continue loopi; } } @@ -2626,7 +2665,153 @@ public class AVM2Code implements Cloneable { } } } + + + int lastPos = list.size() - 1; + if (lastPos < 0) { + lastPos = 0; + } + if ((list.size() > lastPos) && (list.get(lastPos) instanceof ScriptEndItem)) { + lastPos--; + } + if (lastPos < 0) { + lastPos = 0; + } + if ((list.size() > lastPos) && (list.get(lastPos) instanceof ReturnVoidAVM2Item)) { + list.remove(lastPos); + } + if (initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) { + if ((list.size() > lastPos) && (list.get(lastPos) instanceof ReturnValueAVM2Item)) { + ReturnValueAVM2Item rv = (ReturnValueAVM2Item) list.get(lastPos); + if (rv.value instanceof LocalRegAVM2Item) { + list.remove(lastPos); + } else { + list.set(lastPos, rv.value); + } + + } + } + if (initializerType == GraphTextWriter.TRAIT_CLASS_INITIALIZER || initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) { + Map commandToAssigned = new IdentityHashMap<>(); + Map commandToTrait = new IdentityHashMap<>(); + for (TraitSlotConst tsc : convertData.assignedValues.keySet()) { + AssignedValue asv = convertData.assignedValues.get(tsc); + commandToAssigned.put(asv.command, asv); + commandToTrait.put(asv.command, tsc); + } + + for (int i = 0; i < list.size(); i++) { + GraphTargetItem ti = list.get(i); + if (commandToAssigned.containsKey(ti)) { + AssignedValue asv = commandToAssigned.get(ti); + TraitSlotConst tsc = commandToTrait.get(ti); + TraitSlotConstAVM2Item item = new TraitSlotConstAVM2Item( + ti.getSrc(), + ti.getLineStartItem(), + tsc, + asv.value, + isStatic, + scriptIndex, + classIndex, + initializerType, + methodIndex, + initTraits.traits.indexOf(tsc) + ); + list.set(i, item); + } + } + + if (initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) { + + //Eliminate all setlocals, can sometimes happen + BlockVisitor bv = new BlockVisitor() { + @Override + public void visitBlock(List items) { + + for (int i = 0; i < items.size(); i++) { + GraphTargetItem item = items.get(i); + if (item instanceof SetLocalAVM2Item) { + items.set(i, item.value); + } + + if (item instanceof Block) { + Block b = (Block) item; + for (List list : b.getSubs()) { + visitBlock(list); + } + } + } + } + }; + bv.visitBlock(list); + + PackageAVM2Item currentPkg = null; + for (int i = 0; i < list.size(); i++) { + GraphTargetItem ti = list.get(i); + if (ti instanceof TraitSlotConstAVM2Item) { + TraitSlotConstAVM2Item tsci = (TraitSlotConstAVM2Item) ti; + Namespace ns = tsci.getTrait().getName(abc).getNamespace(abc.constants); + if (ns.kind == Namespace.KIND_PACKAGE || ns.kind == Namespace.KIND_PACKAGE_INTERNAL) { + String newPkgName = ns.getName(abc.constants).toRawString(); + if (currentPkg == null) { + currentPkg = new PackageAVM2Item(new ArrayList<>(), newPkgName); + currentPkg.addItem(tsci); + list.set(i, currentPkg); + } else if (currentPkg.getPackageName().equals(newPkgName)){ + currentPkg.addItem(tsci); + list.remove(i); + i--; + } else { + currentPkg = new PackageAVM2Item(new ArrayList<>(), newPkgName); + currentPkg.addItem(tsci); + list.set(i, currentPkg); + } + } + } else if (currentPkg != null) { + final String currentPkgName = currentPkg.getPackageName(); + Reference insidePackage = new Reference<>(true); + + //Check whether the command references internal traits of other package + ti.visitRecursively(new AbstractGraphTargetVisitor() { + @Override + public void visit(GraphTargetItem item) { + if (item instanceof GetSlotAVM2Item) { + GetSlotAVM2Item gs = (GetSlotAVM2Item) item; + if ((gs.slotObject instanceof GlobalAVM2Item) && (initializerType == GraphTextWriter.TRAIT_SCRIPT_INITIALIZER)) { + for (Trait t : initTraits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst) t; + if (tsc.slot_id == gs.slotIndex) { + int nsKind = tsc.getName(abc).getNamespace(abc.constants).kind; + if ( + ( + nsKind == Namespace.KIND_PACKAGE_INTERNAL + && !currentPkgName.equals(tsc.getName(abc).getNamespace(abc.constants).getRawName(abc.constants)) + ) + || (nsKind == Namespace.KIND_PRIVATE) + ) { + insidePackage.setVal(false); + } + } + } + } + } + } + } + }); + + if (insidePackage.getVal()) { + currentPkg.addItem(ti); + list.remove(i); + i--; + } else { + currentPkg = null; + } + } + } + } + List newList = new ArrayList<>(); for (GraphTargetItem ti : list) { if (!(ti instanceof ReturnVoidAVM2Item)) { @@ -2678,21 +2863,7 @@ public class AVM2Code implements Cloneable { for (int ir = 0; ir < r; ir++) { paramNamesList.add(AVM2Item.localRegName(localRegNames, ir)); } - injectDeclarations(0, paramNamesList, list, 1, d, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), abc, body); - - int lastPos = list.size() - 1; - if (lastPos < 0) { - lastPos = 0; - } - if ((list.size() > lastPos) && (list.get(lastPos) instanceof ScriptEndItem)) { - lastPos--; - } - if (lastPos < 0) { - lastPos = 0; - } - if ((list.size() > lastPos) && (list.get(lastPos) instanceof ReturnVoidAVM2Item)) { - list.remove(lastPos); - } + injectDeclarations(0, paramNamesList, list, 1, d, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), abc, body); return list; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java index 0e9886404..b6ed09353 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.abc.avm2; import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.model.LocalData; @@ -83,7 +84,7 @@ public class CodeStats { if (stats.stackpos > ms) { ms = stats.stackpos; } - writer.appendNoHilight(i + ":" + stats.stackpos + (deltastack >= 0 ? "+" + deltastack : deltastack) + "," + stats.scopepos + " " + stats.ins.toString(writer, LocalData.create(new ArrayList<>(), null, abc, null, fullyQualifiedNames, new HashSet<>()))).newLine(); + writer.appendNoHilight(i + ":" + stats.stackpos + (deltastack >= 0 ? "+" + deltastack : deltastack) + "," + stats.scopepos + " " + stats.ins.toString(writer, LocalData.create(new ArrayList<>(), null, abc, null, fullyQualifiedNames, new HashSet<>(), ScriptExportMode.AS))).newLine(); i++; } return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java index c8d28dfe1..0dd2d897e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.UnparsedAVM2Item; import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; @@ -48,7 +49,7 @@ public class NewClassIns extends InstructionDefinition { public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) throws InterruptedException { int clsIndex = ins.operands[0]; HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); - stack.pop().toString(writer, LocalData.create(localData.callStack /*??*/, localData.abcIndex, localData.abc, localData.localRegNames, localData.fullyQualifiedNames, new HashSet<>())); + stack.pop().toString(writer, LocalData.create(localData.callStack /*??*/, localData.abcIndex, localData.abc, localData.localRegNames, localData.fullyQualifiedNames, new HashSet<>(), ScriptExportMode.AS)); writer.finishHilights(); String baseType = writer.toString(); ABC abc = localData.abc; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index fc4f65a96..a291dd300 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.types.Namespace; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -150,13 +151,13 @@ public class FullMultinameAVM2Item extends AVM2Item { public boolean isTopLevel(String tname, ABC abc, HashMap localRegNames, List fullyQualifiedNames, Set seenMethods) throws InterruptedException { String cname; if (name != null) { - cname = name.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods)); + cname = name.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods, ScriptExportMode.AS)); } else { cname = (abc.constants.getMultiname(multinameIndex).getName(abc.constants, fullyQualifiedNames, true, true)); } String cns = ""; if (namespace != null) { - cns = namespace.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods)); + cns = namespace.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods, ScriptExportMode.AS)); } else { Namespace ns = abc.constants.getMultiname(multinameIndex).getNamespace(abc.constants); if ((ns != null) && (ns.name_index != 0)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java new file mode 100644 index 000000000..4762c9d69 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2010-2024 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.flash.abc.avm2.model; + +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.DottedChain; +import com.jpexs.decompiler.graph.Graph; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.GraphTargetVisitorInterface; +import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class PackageAVM2Item extends AVM2Item { + + private final List items; + private final String packageName; + + public PackageAVM2Item(List items, String packageName) { + super(null, null, PRECEDENCE_PRIMARY); + this.items = items; + this.packageName = packageName; + } + + public String getPackageName() { + return packageName; + } + + public void addItem(GraphTargetItem item) { + items.add(item); + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + writer.appendNoHilight("package"); + if (!packageName.isEmpty()) { + writer.appendNoHilight(" " + DottedChain.parseWithSuffix(packageName).toPrintableString(true)); + } + writer.startBlock(); + Graph.graphToString(items, writer, localData); + writer.endBlock(); + writer.newLine(); + return writer; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return null; + } + + @Override + public boolean needsSemicolon() { + return false; + } + + @Override + public void visit(GraphTargetVisitorInterface visitor) { + visitor.visitAll(items); + } + + @Override + public void visitNoBlock(GraphTargetVisitorInterface visitor) { + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java new file mode 100644 index 000000000..502c5f581 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2010-2024 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.flash.abc.avm2.model; + +import com.jpexs.decompiler.flash.abc.types.AssignedValue; +import com.jpexs.decompiler.flash.abc.types.ConvertData; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; +import com.jpexs.decompiler.flash.abc.types.traits.TraitType; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.model.LocalData; + +/** + * + * @author JPEXS + */ +public class TraitSlotConstAVM2Item extends AVM2Item { + + private final TraitSlotConst trait; + private final GraphTargetItem assignedValue; + private final boolean isStatic; + private final int scriptIndex; + private final int classIndex; + private final int initializer; + private final int methodIndex; + private final int traitIndex; + + + /** + * + * @param instruction + * @param lineStartIns + * @param trait + * @param isStatic + * @param assignedValue + * @param classIndex + * @param scriptIndex + * @param initializer + * @param methodIndex + * @param traitIndex + */ + public TraitSlotConstAVM2Item( + GraphSourceItem instruction, + GraphSourceItem lineStartIns, + TraitSlotConst trait, + GraphTargetItem assignedValue, + boolean isStatic, + int scriptIndex, + int classIndex, + int initializer, + int methodIndex, + int traitIndex + ) { + super(instruction, lineStartIns, PRECEDENCE_PRIMARY); + this.trait = trait; + this.assignedValue = assignedValue; + this.isStatic = isStatic; + this.scriptIndex = scriptIndex; + this.classIndex = classIndex; + this.initializer = initializer; + this.methodIndex = methodIndex; + this.traitIndex = traitIndex; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + + writer.endMethod(); + writer.endTrait(); + + int h = traitIndex; + if (initializer != GraphTextWriter.TRAIT_SCRIPT_INITIALIZER) { + h = localData.abc.getGlobalTraitId(TraitType.METHOD , isStatic, classIndex, traitIndex); + } + writer.startTrait(h); + ConvertData cd = new ConvertData(); + cd.assignedValues.put(trait, new AssignedValue(null, assignedValue, initializer, methodIndex)); + boolean insideInterface = classIndex > -1 ? localData.abc.instance_info.get(classIndex).isInterface() : false; + trait.toString( + localData.abcIndex, + + null, + cd, + "trait " + trait.getName(localData.abc), + localData.abc, + isStatic, + localData.exportMode, + scriptIndex, + classIndex, + writer, + localData.fullyQualifiedNames, + false, + insideInterface + ); + writer.endTrait(); + + writer.startTrait(initializer); + writer.startMethod(methodIndex, null); + return writer; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return null; + } + + @Override + public boolean needsSemicolon() { + return false; + } + + @Override + public boolean hasSingleNewLineAround() { + return true; + } + + @Override + public boolean handlesNewLine() { + return true; + } + + public TraitSlotConst getTrait() { + return trait; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 6661ef11a..bd66acd51 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -620,12 +620,25 @@ public class AVM2SourceGenerator implements SourceGenerator { * @param iinit Instance initializer * @param iinitVariables Instance initializer variables * @param iinitNeedsActivation Instance initializer needs activation - * @param traitItems Trait items + * @param commands Trait items * @param class_index Class index * @throws AVM2ParseException On parse error * @throws CompilationException On compilation error */ - public void generateClass(List importedClasses, List cinitVariables, boolean cinitNeedsActivation, List cinit, List openedNamespaces, int namespace, int initScope, DottedChain pkg, ClassInfo classInfo, InstanceInfo instanceInfo, SourceGeneratorLocalData localData, boolean isInterface, String baseClassName, String superName, GraphTargetItem extendsVal, List implementsStr, GraphTargetItem iinit, List iinitVariables, boolean iinitNeedsActivation, List traitItems, Reference class_index) throws AVM2ParseException, CompilationException { + public void generateClass(List importedClasses, List cinitVariables, boolean cinitNeedsActivation, List cinit, List openedNamespaces, int namespace, int initScope, DottedChain pkg, ClassInfo classInfo, InstanceInfo instanceInfo, SourceGeneratorLocalData localData, boolean isInterface, String baseClassName, String superName, GraphTargetItem extendsVal, List implementsStr, GraphTargetItem iinit, List iinitVariables, boolean iinitNeedsActivation, List commands, Reference class_index) throws AVM2ParseException, CompilationException { + List traitItems = new ArrayList<>(); + for (GraphTargetItem it : commands) { + if ((it instanceof SlotAVM2Item) + || (it instanceof ConstAVM2Item) + || (it instanceof ClassAVM2Item) + || (it instanceof InterfaceAVM2Item) + || (it instanceof MethodAVM2Item) + || (it instanceof GetterAVM2Item) + || (it instanceof SetterAVM2Item) + ) { + traitItems.add(it); + } + } localData.currentClassBaseName = baseClassName; localData.pkg = pkg; localData.privateNs = abcIndex.getSelectedAbc().constants.getNamespaceId(Namespace.KIND_PRIVATE, pkg.toRawString().isEmpty() ? baseClassName : pkg.toRawString() + ":" + baseClassName, 0, true); @@ -634,7 +647,8 @@ public class AVM2SourceGenerator implements SourceGenerator { extendsVal = new TypeItem(DottedChain.OBJECT); } ParsedSymbol s = null; - + + if (Configuration.handleSkinPartsAutomatically.get()) { Map skinParts = new HashMap<>(); @@ -772,9 +786,29 @@ public class AVM2SourceGenerator implements SourceGenerator { int cinit_index = method(true, str(""), false, false, false, new ArrayList<>(), pkg, cinitNeedsActivation, cinitVariables, initScope + (implementsStr.isEmpty() ? 0 : 1), false, 0, isInterface ? null : baseClassName, superName, false, localData, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), cinit, TypeItem.UNBOUNDED); MethodBody cinitBody = abcIndex.getSelectedAbc().findBody(cinit_index); - List sinitcode = new ArrayList<>(); + + for (int i = 0; i < cinitVariables.size(); i++) { + AssignableAVM2Item an = cinitVariables.get(i); + if (an instanceof UnresolvedAVM2Item) { + UnresolvedAVM2Item n = (UnresolvedAVM2Item) an; + if (n.resolved == null) { + String fullClass = localData.getFullClass(); + List callStack = new ArrayList<>(); + callStack.add(cinitBody); + GraphTargetItem res = n.resolve(localData, fullClass, new TypeItem(fullClass), new ArrayList<>(), new ArrayList<>(), abcIndex, callStack, cinitVariables); + if (res instanceof AssignableAVM2Item) { + cinitVariables.set(i, (AssignableAVM2Item) res); + } else { + cinitVariables.remove(i); + i--; + } + } + } + } + + List cinitcode = new ArrayList<>(); List initcode = new ArrayList<>(); - for (GraphTargetItem ti : traitItems) { + for (GraphTargetItem ti : commands) { if ((ti instanceof SlotAVM2Item) || (ti instanceof ConstAVM2Item)) { GraphTargetItem val = null; boolean isStatic = false; @@ -798,10 +832,10 @@ public class AVM2SourceGenerator implements SourceGenerator { } } if (isStatic && val != null) { - sinitcode.add(ins(AVM2Instructions.FindProperty, traitName(ns, tname))); + cinitcode.add(ins(AVM2Instructions.FindProperty, traitName(ns, tname))); localData.isStatic = true; - sinitcode.addAll(toInsList(val.toSource(localData, this))); - sinitcode.add(ins(isConst ? AVM2Instructions.InitProperty : AVM2Instructions.SetProperty, traitName(ns, tname))); + cinitcode.addAll(toInsList(val.toSource(localData, this))); + cinitcode.add(ins(isConst ? AVM2Instructions.InitProperty : AVM2Instructions.SetProperty, traitName(ns, tname))); } if (!isStatic && val != null) { //do not init basic values, that can be stored in trait @@ -812,15 +846,23 @@ public class AVM2SourceGenerator implements SourceGenerator { initcode.add(ins(isConst ? AVM2Instructions.InitProperty : AVM2Instructions.SetProperty, traitName(ns, tname))); } } + } else if (ti instanceof MethodAVM2Item) { + //ignore + } else { + localData.isStatic = true; + List srcs = ti.toSourceIgnoreReturnValue(localData, this); + for (GraphSourceItem src : srcs) { + cinitcode.add((AVM2Instruction)src); + } } } MethodBody initBody = null; if (!isInterface) { initBody = abcIndex.getSelectedAbc().findBody(init); - initBody.insertAll(iinit == null ? 0 : 2, initcode); //after getlocal0,pushscope + initBody.getCode().code.addAll(iinit == null ? 0 : 2, initcode); //after getlocal0,pushscope if (cinitBody.getCode().code.get(cinitBody.getCode().code.size() - 1).definition instanceof ReturnVoidIns) { - cinitBody.insertAll(2, sinitcode); //after getlocal0,pushscope + cinitBody.getCode().code.addAll(2, cinitcode); //after getlocal0,pushscope } } cinitBody.markOffsets(); @@ -1305,7 +1347,7 @@ public class AVM2SourceGenerator implements SourceGenerator { continue; } - NameAVM2Item d = new NameAVM2Item(n.type, n.line, n.isAttribute(), n.getVariableName(), n.getNamespaceSuffix(), null /*NameAVM2Item.getDefaultValue("" + n.type)*/, true, n.openedNamespaces, abcIndex); + NameAVM2Item d = new NameAVM2Item(n.type, n.line, n.isAttribute(), n.getVariableName(), n.getNamespaceSuffix(), null /*NameAVM2Item.getDefaultValue("" + n.type)*/, true, n.openedNamespaces, abcIndex, n.isConst()); //no index if (needsActivation) { if (d.getSlotNumber() <= 0) { @@ -1367,9 +1409,9 @@ public class AVM2SourceGenerator implements SourceGenerator { mbody.traits.traits.add(tsc); } for (int i = 1; i < paramRegCount; i++) { - NameAVM2Item param = new NameAVM2Item(registerTypes.get(i), 0, false, registerNames.get(i), "", null, false, new ArrayList<>(), abcIndex); + NameAVM2Item param = new NameAVM2Item(registerTypes.get(i), 0, false, registerNames.get(i), "", null, false, new ArrayList<>(), abcIndex, false); param.setRegNumber(i); - NameAVM2Item d = new NameAVM2Item(registerTypes.get(i), 0, false, registerNames.get(i), "", param, true, new ArrayList<>(), abcIndex); + NameAVM2Item d = new NameAVM2Item(registerTypes.get(i), 0, false, registerNames.get(i), "", param, true, new ArrayList<>(), abcIndex, false); d.setSlotScope(slotScope); d.setSlotNumber(slotNames.indexOf(registerNames.get(i))); declarations.add(d); @@ -2099,6 +2141,10 @@ public class AVM2SourceGenerator implements SourceGenerator { /** * Generates script info. + * @param sinitVariables Script initializer variables + * @param sinitNeedsActivation Script initializer needs activation + * @param importedClasses Imported classes + * @param openedNamespaces Opened namespaces * @param scriptIndex Script index * @param scriptInfo Script info * @param allOpenedNamespaces All opened namespaces @@ -2108,14 +2154,27 @@ public class AVM2SourceGenerator implements SourceGenerator { * @throws AVM2ParseException On parse error * @throws CompilationException On compilation error */ - public void generateScriptInfo(int scriptIndex, ScriptInfo scriptInfo, List> allOpenedNamespaces, SourceGeneratorLocalData localData, List commands, int classPos) throws AVM2ParseException, CompilationException { + public void generateScriptInfo(List sinitVariables, boolean sinitNeedsActivation, List importedClasses, List openedNamespaces, int scriptIndex, ScriptInfo scriptInfo, List> allOpenedNamespaces, SourceGeneratorLocalData localData, List commands, int classPos) throws AVM2ParseException, CompilationException { + List traitsList = new ArrayList<>(); + for (GraphTargetItem it : commands) { + if ((it instanceof SlotAVM2Item) + || (it instanceof ConstAVM2Item) + || (it instanceof ClassAVM2Item) + || (it instanceof InterfaceAVM2Item) + || (it instanceof MethodAVM2Item) + || (it instanceof GetterAVM2Item) + || (it instanceof SetterAVM2Item) + ) { + traitsList.add(it); + } + } Reference class_index = new Reference<>(classPos); localData.currentScript = scriptInfo; localData.scriptIndex = scriptIndex; - Trait[] traitArr = generateTraitsPhase1(new ArrayList<>(), new ArrayList<>(), null, null, true, localData, commands, scriptInfo.traits, class_index, true); - generateTraitsPhase2(new ArrayList<>(), null/*FIXME*/, commands, traitArr, new ArrayList<>(), localData); + Trait[] traitArr = generateTraitsPhase1(new ArrayList<>(), new ArrayList<>(), null, null, true, localData, traitsList, scriptInfo.traits, class_index, true); + generateTraitsPhase2(new ArrayList<>(), null/*FIXME*/, traitsList, traitArr, new ArrayList<>(), localData); abcIndex.refreshSelected(); - generateTraitsPhase3(commands, traitArr, localData); + generateTraitsPhase3(traitsList, traitArr, localData); abcIndex.refreshSelected(); ABC abc = abcIndex.getSelectedAbc(); @@ -2194,9 +2253,67 @@ public class AVM2SourceGenerator implements SourceGenerator { abc.addMethodBody(mb); scriptInfo.init_index = mb.method_info; localData.pkg = DottedChain.EMPTY; - generateTraitsPhase4(new ArrayList<>(), new ArrayList<>(), 1/*??*/, false, null, null, true, localData, commands, scriptInfo.traits, traitArr, initScopes, class_index, true); + localData.registerVars.put("this", 0); + generateTraitsPhase4(new ArrayList<>(), new ArrayList<>(), 1/*??*/, false, null, null, true, localData, traitsList, scriptInfo.traits, traitArr, initScopes, class_index, true); - int maxSlotId = 0; + List sinitcode = new ArrayList<>(); + for (int i = 0; i < sinitVariables.size(); i++) { + AssignableAVM2Item an = sinitVariables.get(i); + if (an instanceof UnresolvedAVM2Item) { + UnresolvedAVM2Item n = (UnresolvedAVM2Item) an; + if (n.resolved == null) { + String fullClass = localData.getFullClass(); + List callStack = new ArrayList<>(); + callStack.add(mb); + GraphTargetItem res = n.resolve(localData, fullClass, new TypeItem(fullClass), new ArrayList<>(), new ArrayList<>(), abcIndex, callStack, sinitVariables); + if (res instanceof AssignableAVM2Item) { + sinitVariables.set(i, (AssignableAVM2Item) res); + } else { + sinitVariables.remove(i); + i--; + } + } + } + } + for (GraphTargetItem ti : commands) { + if ((ti instanceof SlotAVM2Item) || (ti instanceof ConstAVM2Item)) { + GraphTargetItem val = null; + int ns = -1; + String tname = null; + boolean isConst = false; + NamespaceItem pkg = null; + if (ti instanceof SlotAVM2Item) { + val = ((SlotAVM2Item) ti).value; + pkg = ((SlotAVM2Item) ti).pkg; + ns = genNs(importedClasses, pkg.name, ((SlotAVM2Item) ti).pkg, openedNamespaces, localData, ((SlotAVM2Item) ti).line); + tname = ((SlotAVM2Item) ti).var; + } + if (ti instanceof ConstAVM2Item) { + val = ((ConstAVM2Item) ti).value; + pkg = ((ConstAVM2Item) ti).pkg; + ns = genNs(importedClasses, pkg.name, ((ConstAVM2Item) ti).pkg, openedNamespaces, localData, ((ConstAVM2Item) ti).line); + tname = ((ConstAVM2Item) ti).var; + isConst = true; + if (((ConstAVM2Item) ti).type.toString().equals("Namespace")) { + continue; + } + } + if (val != null) { + sinitcode.add(ins(AVM2Instructions.FindProperty, traitName(ns, tname))); + localData.isStatic = true; + sinitcode.addAll(toInsList(val.toSource(localData, this))); + sinitcode.add(ins(isConst ? AVM2Instructions.InitProperty : AVM2Instructions.SetProperty, traitName(ns, tname))); + } + } else { + List srcs = ti.toSourceIgnoreReturnValue(localData, this); + for (GraphSourceItem src : srcs) { + sinitcode.add((AVM2Instruction)src); + } + } + } + mbCode.addAll(sinitcode); + + /*int maxSlotId = 0; for (int k = 0; k < scriptInfo.traits.traits.size(); k++) { if (scriptInfo.traits.traits.get(k) instanceof TraitSlotConst) { TraitSlotConst ti = (TraitSlotConst) scriptInfo.traits.traits.get(k); @@ -2225,9 +2342,10 @@ public class AVM2SourceGenerator implements SourceGenerator { mbCode.add(ins(AVM2Instructions.InitProperty, nts.name_index)); } } - } + }*/ mbCode.add(ins(AVM2Instructions.ReturnVoid)); + mb.markOffsets(); mb.autoFillStats(abc, 1, false); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index 4698e2aff..fcbdfa8c3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -561,14 +561,14 @@ public class ActionScript3Parser { } List body = null; List subvariables = new ArrayList<>(); - subvariables.add(new NameAVM2Item(thisType, lexer.yyline(), false, "this", "", null, true, openedNamespaces, abcIndex)); + subvariables.add(new NameAVM2Item(thisType, lexer.yyline(), false, "this", "", null, true, openedNamespaces, abcIndex, false)); for (int i = 0; i < paramNames.size() - (hasRest ? 1 : 0); i++) { - subvariables.add(new NameAVM2Item(paramTypes.get(i), lexer.yyline(), false, paramNames.get(i), "", null, true, openedNamespaces, abcIndex)); + subvariables.add(new NameAVM2Item(paramTypes.get(i), lexer.yyline(), false, paramNames.get(i), "", null, true, openedNamespaces, abcIndex, false)); } if (hasRest) { - subvariables.add(new NameAVM2Item(TypeItem.UNBOUNDED, lexer.yyline(), false, paramNames.get(paramNames.size() - 1), "", null, true, openedNamespaces, abcIndex)); + subvariables.add(new NameAVM2Item(TypeItem.UNBOUNDED, lexer.yyline(), false, paramNames.get(paramNames.size() - 1), "", null, true, openedNamespaces, abcIndex, false)); } - subvariables.add(new NameAVM2Item(thisType, lexer.yyline(), false, "arguments", "", null, true, openedNamespaces, abcIndex)); + subvariables.add(new NameAVM2Item(thisType, lexer.yyline(), false, "arguments", "", null, true, openedNamespaces, abcIndex, false)); int parCnt = subvariables.size(); Reference needsActivation2 = new Reference<>(false); if (!isInterface && !isNative) { @@ -650,6 +650,10 @@ public class ActionScript3Parser { openedNamespaces.add(privateNs); openedNamespaces.add(protectedNs); openedNamespaces.add(staticProtectedNs); + + Stack cinitLoops = new Stack<>(); + Map cinitLoopLabels = new HashMap<>(); + HashMap cinitRegisterVars = new HashMap<>(); looptraits: while (true) { @@ -667,14 +671,14 @@ public class ActionScript3Parser { NamespaceItem namespace = null; ParsedSymbol s = lex(); //static class initializer - if (s.type == SymbolType.CURLY_OPEN) { + /*if (s.type == SymbolType.CURLY_OPEN) { cinit.addAll(commands(allOpenedNamespaces, thisType, pkg, cinitNeedsActivation, importedClasses, openedNamespaces, new Stack<>(), new HashMap<>(), new HashMap<>(), true, false, 0, cinitVariables, abc)); expectedType(SymbolType.CURLY_CLOSE); } else { lexer.pushback(s); - } + }*/ List>> metadata = parseMetadata(); - s = lex(); + //s = lex(); while (s.isType(SymbolType.NATIVE, SymbolType.STATIC, SymbolType.PUBLIC, SymbolType.PRIVATE, SymbolType.PROTECTED, SymbolType.OVERRIDE, SymbolType.FINAL, SymbolType.DYNAMIC, SymbolGroup.IDENTIFIER, SymbolType.INTERNAL, SymbolType.PREPROCESSOR)) { if (s.type == SymbolType.FINAL) { @@ -939,23 +943,77 @@ public class ActionScript3Parser { break; default: lexer.pushback(s); - break looptraits; + + GraphTargetItem cmd = command(allOpenedNamespaces, null, publicNs, cinitNeedsActivation, importedClasses, openedNamespaces, cinitLoops, cinitLoopLabels, cinitRegisterVars, true, false, 0, false, cinitVariables, abc); + if (cmd != null) { + traits.add(cmd); + } else { + break looptraits; + } } } } - private void scriptTraits(List> allOpenedNamespaces, int scriptIndex, String scriptName, List traits, Reference numberUsageRef, Reference numberRoundingRef, Reference numberPrecisionRef, ABC abc) throws AVM2ParseException, IOException, CompilationException, InterruptedException { + private void scriptTraits( + List importedClasses, + List openedNamespaces, + List> allOpenedNamespaces, + int scriptIndex, + String scriptName, + List traits, + Reference numberUsageRef, + Reference numberRoundingRef, + Reference numberPrecisionRef, + ABC abc, + Reference sinitNeedsActivation, + List sinitVariables + ) throws AVM2ParseException, IOException, CompilationException, InterruptedException { - while (scriptTraitsBlock(allOpenedNamespaces, scriptIndex, scriptName, traits, numberUsageRef, numberRoundingRef, numberPrecisionRef, abc)) { + Stack sinitLoops = new Stack<>(); + Map sinitLoopLabels = new HashMap<>(); + + HashMap sinitRegisterVars = new HashMap<>(); + while (scriptTraitsBlock( + importedClasses, + openedNamespaces, + allOpenedNamespaces, + scriptIndex, + scriptName, + traits, + numberUsageRef, + numberRoundingRef, + numberPrecisionRef, + abc, + sinitNeedsActivation, + sinitLoops, + sinitLoopLabels, + sinitRegisterVars, + sinitVariables + )) { //empty } } - private boolean scriptTraitsBlock(List> allOpenedNamespaces, int scriptIndex, String scriptName, List traits, Reference numberUsageRef, Reference numberRoundingRef, Reference numberPrecisionRef, ABC abc) throws AVM2ParseException, IOException, CompilationException, InterruptedException { + private boolean scriptTraitsBlock( + List importedClasses, + List openedNamespaces, + List> allOpenedNamespaces, + int scriptIndex, + String scriptName, + List traits, + Reference numberUsageRef, + Reference numberRoundingRef, + Reference numberPrecisionRef, + ABC abc, + Reference sinitNeedsActivation, + Stack sinitLoops, + Map sinitLoopLabels, + HashMap sinitRegisterVars, + List sinitVariables + ) throws AVM2ParseException, IOException, CompilationException, InterruptedException { ParsedSymbol s; boolean inPackage = false; s = lex(); - List sinitVariables = new ArrayList<>(); NamespaceItem publicNs; NamespaceItem packageInternalNs; DottedChain pkgName = DottedChain.TOPLEVEL; @@ -983,7 +1041,6 @@ public class ActionScript3Parser { } lexer.pushback(s); - List openedNamespaces = new ArrayList<>(); allOpenedNamespaces.add(openedNamespaces); NamespaceItem emptyNs = new NamespaceItem("", Namespace.KIND_PACKAGE); openedNamespaces.add(emptyNs); @@ -1000,7 +1057,7 @@ public class ActionScript3Parser { } } - List importedClasses = parseImportsUsages(openedNamespaces, numberUsageRef, numberPrecisionRef, numberRoundingRef, abc); + parseImportsUsages(importedClasses, openedNamespaces, numberUsageRef, numberPrecisionRef, numberRoundingRef, abc); boolean isEmpty = true; @@ -1206,7 +1263,13 @@ public class ActionScript3Parser { traits.add(new ConstAVM2Item(metadata, ns, null, true, nname, new TypeItem(DottedChain.NAMESPACE), new StringAVM2Item(null, null, nval), lexer.yyline(), generatedNs)); break; default: - lexer.pushback(s); + lexer.pushback(s); + parseImportsUsages(importedClasses, openedNamespaces, numberUsageRef, numberPrecisionRef, numberRoundingRef, abc); + GraphTargetItem cmd = command(allOpenedNamespaces, null, publicNs, sinitNeedsActivation, importedClasses, openedNamespaces, sinitLoops, sinitLoopLabels, sinitRegisterVars, true, false, 0, false, sinitVariables, abc); + if (cmd != null) { + traits.add(cmd); + isEmpty = false; + } break looptrait; } @@ -1532,6 +1595,8 @@ public class ActionScript3Parser { ret = (function(allOpenedNamespaces, new ArrayList<>(), pkg, false, false, needsActivation, importedClasses, thisType, openedNamespaces, s.value.toString(), false, variables, abc)); break; case VAR: + case CONST: + boolean isConst = s.type == SymbolType.CONST; s = lex(); expected(s, lexer.yyline(), SymbolGroup.IDENTIFIER); String varIdentifier = s.value.toString(); @@ -1546,10 +1611,10 @@ public class ActionScript3Parser { if (s.type == SymbolType.ASSIGN) { GraphTargetItem varval = (expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables, false, abc)); - ret = new NameAVM2Item(type, lexer.yyline(), false, varIdentifier, "", varval, true, openedNamespaces, abcIndex); + ret = new NameAVM2Item(type, lexer.yyline(), false, varIdentifier, "", varval, true, openedNamespaces, abcIndex, isConst); variables.add((NameAVM2Item) ret); } else { - ret = new NameAVM2Item(type, lexer.yyline(), false, varIdentifier, "", null, true, openedNamespaces, abcIndex); + ret = new NameAVM2Item(type, lexer.yyline(), false, varIdentifier, "", null, true, openedNamespaces, abcIndex, isConst); variables.add((NameAVM2Item) ret); lexer.pushback(s); } @@ -1817,7 +1882,7 @@ public class ActionScript3Parser { String enamestr = s.value.toString(); expectedType(SymbolType.COLON); GraphTargetItem etype = type(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, variables, abc); - NameAVM2Item e = new NameAVM2Item(etype, lexer.yyline(), false, enamestr, "", new ExceptionAVM2Item(null)/*?*/, true/*?*/, openedNamespaces, abcIndex); + NameAVM2Item e = new NameAVM2Item(etype, lexer.yyline(), false, enamestr, "", new ExceptionAVM2Item(null)/*?*/, true/*?*/, openedNamespaces, abcIndex, false); //variables.add(e); catchExceptions.add(e); e.setSlotNumber(1); @@ -2607,10 +2672,9 @@ public class ActionScript3Parser { private List constantPool; - private List parseImportsUsages(List openedNamespaces, Reference numberUsageRef, Reference numberPrecisionRef, Reference numberRoundingRef, ABC abc) throws IOException, AVM2ParseException, InterruptedException { + private void parseImportsUsages(List importedClasses, List openedNamespaces, Reference numberUsageRef, Reference numberPrecisionRef, Reference numberRoundingRef, ABC abc) throws IOException, AVM2ParseException, InterruptedException { - ParsedSymbol s; - List importedClasses = new ArrayList<>(); + ParsedSymbol s; s = lex(); while (s.isType(SymbolType.IMPORT, SymbolType.USE)) { @@ -2747,10 +2811,19 @@ public class ActionScript3Parser { s = lex(); } lexer.pushback(s); - return importedClasses; } - private List parseScript(List> allOpenedNamespaces, int scriptIndex, String fileName, Reference numberContextRef, ABC abc) throws IOException, AVM2ParseException, CompilationException, InterruptedException { + private List parseScript( + List importedClasses, + List openedNamespaces, + List> allOpenedNamespaces, + int scriptIndex, + String fileName, + Reference numberContextRef, + ABC abc, + Reference sinitNeedsActivation, + List sinitVariables + ) throws IOException, AVM2ParseException, CompilationException, InterruptedException { //int scriptPrivateNs; if (fileName.contains("/")) { @@ -2763,7 +2836,7 @@ public class ActionScript3Parser { Reference numberUsageRef = new Reference<>(NumberContext.USE_NUMBER); Reference numberRoundingRef = new Reference<>(NumberContext.ROUND_HALF_EVEN); Reference numberPrecisionRef = new Reference<>(34); - scriptTraits(allOpenedNamespaces, scriptIndex, fileName, items, numberUsageRef, numberRoundingRef, numberPrecisionRef, abc); + scriptTraits(importedClasses, openedNamespaces, allOpenedNamespaces, scriptIndex, fileName, items, numberUsageRef, numberRoundingRef, numberPrecisionRef, abc, sinitNeedsActivation, sinitVariables); NumberContext nc = new NumberContext(numberUsageRef.getVal(), numberPrecisionRef.getVal(), numberRoundingRef.getVal()); if (!nc.isDefault()) { @@ -2774,22 +2847,37 @@ public class ActionScript3Parser { /** * Converts string to script traits. + * @param importedClasses Imported classes + * @param openedNamespaces Opened namespaces * @param allOpenedNamespaces All opened namespaces * @param str String to parse * @param fileName File name * @param scriptIndex Script index * @param numberContextRef Number context reference * @param abc ABC + * @param sinitNeedsActivation Script initializer needs activation + * @param sinitVariables Script initializer variables * @return List of script traits * @throws AVM2ParseException On parsing error * @throws IOException On I/O error * @throws CompilationException On compilation error * @throws InterruptedException On interrupt */ - public List scriptTraitsFromString(List> allOpenedNamespaces, String str, String fileName, int scriptIndex, Reference numberContextRef, ABC abc) throws AVM2ParseException, IOException, CompilationException, InterruptedException { + public List scriptTraitsFromString( + List importedClasses, + List openedNamespaces, + List> allOpenedNamespaces, + String str, + String fileName, + int scriptIndex, + Reference numberContextRef, + ABC abc, + Reference sinitNeedsActivation, + List sinitVariables + ) throws AVM2ParseException, IOException, CompilationException, InterruptedException { lexer = new ActionScriptLexer(str); - List ret = parseScript(allOpenedNamespaces, scriptIndex, fileName, numberContextRef, abc); + List ret = parseScript(importedClasses, openedNamespaces, allOpenedNamespaces, scriptIndex, fileName, numberContextRef, abc, sinitNeedsActivation, sinitVariables); if (lexer.lex().type != SymbolType.EOF) { throw new AVM2ParseException("Parsing finisned before end of the file", lexer.yyline()); } @@ -2798,14 +2886,19 @@ public class ActionScript3Parser { /** * Adds script from tree. + * @param sinitVariables Script initializer variables + * @param sinitNeedsActivation Script initializer needs activation + * @param importedClasses Imported classes + * @param openedNamespaces Opened namespaces * @param allOpenedNamespaces All opened namespaces * @param items Items * @param classPos Class position * @param documentClass Document class + * @param numberContext Number context * @throws AVM2ParseException On parsing error * @throws CompilationException On compilation error */ - public void addScriptFromTree(List> allOpenedNamespaces, List items, int classPos, String documentClass, Integer numberContext) throws AVM2ParseException, CompilationException { + public void addScriptFromTree(List sinitVariables, boolean sinitNeedsActivation, List importedClasses, List openedNamespaces, List> allOpenedNamespaces, List items, int classPos, String documentClass, Integer numberContext) throws AVM2ParseException, CompilationException { AVM2SourceGenerator gen = new AVM2SourceGenerator(abcIndex); SourceGeneratorLocalData localData = new SourceGeneratorLocalData( new HashMap<>(), 0, Boolean.FALSE, 0); @@ -2815,8 +2908,9 @@ public class ActionScript3Parser { int scriptIndex = abcIndex.getSelectedAbc().script_info.size(); abcIndex.getSelectedAbc().script_info.add(si); try { - gen.generateScriptInfo(scriptIndex, si, allOpenedNamespaces, localData, items, classPos); + gen.generateScriptInfo(sinitVariables, sinitNeedsActivation, importedClasses, openedNamespaces, scriptIndex, si, allOpenedNamespaces, localData, items, classPos); } catch (Exception ex) { + ex.printStackTrace(); // FIXME abcIndex.getSelectedAbc().script_info.remove(si); throw ex; } @@ -2840,8 +2934,12 @@ public class ActionScript3Parser { public void addScript(String s, String fileName, int classPos, int scriptIndex, String documentClass, ABC abc) throws AVM2ParseException, IOException, CompilationException, InterruptedException { List> allOpenedNamespaces = new ArrayList<>(); Reference numberContextRef = new Reference<>(null); - List traits = scriptTraitsFromString(allOpenedNamespaces, s, fileName, scriptIndex, numberContextRef, abc); - addScriptFromTree(allOpenedNamespaces, traits, classPos, documentClass, numberContextRef.getVal()); + Reference sinitNeedsActivation = new Reference<>(false); + List sinitVariables = new ArrayList<>(); + List importedClasses = new ArrayList<>(); + List openedNamespaces = new ArrayList<>(); + List traits = scriptTraitsFromString(importedClasses, openedNamespaces, allOpenedNamespaces, s, fileName, scriptIndex, numberContextRef, abc, sinitNeedsActivation, sinitVariables); + addScriptFromTree(sinitVariables, sinitNeedsActivation.getVal(), importedClasses, openedNamespaces, allOpenedNamespaces, traits, classPos, documentClass, numberContextRef.getVal()); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index 03a53a6bc..e29bdba38 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -93,16 +93,26 @@ public class NameAVM2Item extends AssignableAVM2Item { private AbcIndexing abcIndex; private String namespaceSuffix; + + private final boolean isConst; @Override public AssignableAVM2Item copy() { - NameAVM2Item c = new NameAVM2Item(type, line, attribute, variableName, namespaceSuffix, assignedValue, definition, openedNamespaces, abcIndex); + NameAVM2Item c = new NameAVM2Item(type, line, attribute, variableName, namespaceSuffix, assignedValue, definition, openedNamespaces, abcIndex, isConst); c.setNs(ns); c.regNumber = regNumber; c.unresolved = unresolved; c.nsKind = nsKind; return c; } + + /** + * Checks whether this name is const. + * @return Whether this name is const + */ + public boolean isConst() { + return isConst; + } /** * Is attribute. @@ -235,8 +245,9 @@ public class NameAVM2Item extends AssignableAVM2Item { * @param definition Is definition * @param openedNamespaces Opened namespaces * @param abcIndex ABC index + * @param isConst Is const */ - public NameAVM2Item(GraphTargetItem type, int line, boolean attribute, String variableName, String namespaceSuffix, GraphTargetItem storeValue, boolean definition, List openedNamespaces, AbcIndexing abcIndex) { + public NameAVM2Item(GraphTargetItem type, int line, boolean attribute, String variableName, String namespaceSuffix, GraphTargetItem storeValue, boolean definition, List openedNamespaces, AbcIndexing abcIndex, boolean isConst) { super(storeValue); this.attribute = attribute; this.variableName = variableName; @@ -247,6 +258,7 @@ public class NameAVM2Item extends AssignableAVM2Item { this.type = type; this.openedNamespaces = openedNamespaces; this.abcIndex = abcIndex; + this.isConst = isConst; } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java index bb0510402..f9f3db543 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java @@ -411,7 +411,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { if (a instanceof NameAVM2Item) { NameAVM2Item n = (NameAVM2Item) a; if (n.isDefinition() && name.get(0).equals(n.getVariableName())) { - NameAVM2Item ret = new NameAVM2Item(n.type, n.line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex); + NameAVM2Item ret = new NameAVM2Item(n.type, n.line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex, n.isConst()); ret.setSlotScope(n.getSlotScope()); ret.setSlotNumber(n.getSlotNumber()); ret.setRegNumber(n.getRegNumber()); @@ -441,7 +441,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { t = paramTypes.get(ind); } //else rest parameter - GraphTargetItem ret = new NameAVM2Item(t, line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex); + GraphTargetItem ret = new NameAVM2Item(t, line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex, false); resolved = ret; for (int i = 1; i < name.size(); i++) { resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>()); @@ -627,7 +627,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { } } - NameAVM2Item ret = new NameAVM2Item(ntype, line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex); + NameAVM2Item ret = new NameAVM2Item(ntype, line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex, false); resolved = ret; for (int i = 1; i < name.size(); i++) { resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/AssignedValue.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/AssignedValue.java index cd7351d6c..88057d292 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/AssignedValue.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/AssignedValue.java @@ -25,6 +25,11 @@ import com.jpexs.decompiler.graph.GraphTargetItem; */ public class AssignedValue { + /** + * Command + */ + public GraphTargetItem command; + /** * Value */ @@ -43,11 +48,13 @@ public class AssignedValue { /** * Constructs a new assigned value. * + * @param command Command * @param value Value * @param initializer Initializer type * @param method Method index */ - public AssignedValue(GraphTargetItem value, int initializer, int method) { + public AssignedValue(GraphTargetItem command, GraphTargetItem value, int initializer, int method) { + this.command = command; this.value = value; this.initializer = initializer; this.method = method; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index dec1c3852..39cf7bcec 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -474,7 +474,7 @@ public final class MethodBody implements Cloneable { convertedItems1 = converted.getCode().toGraphTargetItems(callStack, abcIndex, convertData.thisHasDefaultToPrimitive, convertData, path, methodIndex, isStatic, scriptIndex, classIndex, abc, converted, localRegNames, scopeStack, initializerType, fullyQualifiedNames, initTraits, 0, new HashMap<>()); //converted.getCode().visitCode(converted) } try (Statistics s = new Statistics("Graph.graphToString")) { - Graph.graphToString(convertedItems1, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames, seenMethods)); + Graph.graphToString(convertedItems1, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames, seenMethods, exportMode)); } convertedItems = convertedItems1; } @@ -565,7 +565,7 @@ public final class MethodBody implements Cloneable { fullyQualifiedNames2.remove(tname); } - Graph.graphToString(convertedItems, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames2, seenMethods)); + Graph.graphToString(convertedItems, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames2, seenMethods, exportMode)); //writer.endMethod(); } else if (convertException instanceof TimeoutException) { // exception was logged in convert method diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java index 22ae95957..6ad9ac11e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.ClassPath; import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.DottedChain; @@ -171,6 +172,9 @@ public class ScriptInfo { for (int j = 0; j < traits.traits.size(); j++) { Trait t = traits.traits.get(j); + if (!isSimple && (t instanceof TraitSlotConst)) { + continue; + } Multiname name = t.getName(abc); int nskind = name.getSimpleNamespaceKind(abc.constants); if ((nskind == Namespace.KIND_PACKAGE_INTERNAL) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index 908aa4ce8..314ac0baf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -644,13 +644,16 @@ public abstract class Trait implements Cloneable, Serializable { } } } - String nsPrefix = Namespace.getPrefix(nskind); - if (nsPrefix != null && !nsPrefix.isEmpty()) { - writer.appendNoHilight(nsPrefix).appendNoHilight(" "); + + if (!(classIndex == -1 && nskind == Namespace.KIND_PACKAGE_INTERNAL)) { + String nsPrefix = Namespace.getPrefix(nskind); + if (nsPrefix != null && !nsPrefix.isEmpty()) { + writer.appendNoHilight(nsPrefix).appendNoHilight(" "); + } } } } - if (isStatic) { + if (isStatic && classIndex > -1) { if ((this instanceof TraitSlotConst) && ((TraitSlotConst) this).isNamespace()) { //static is automatic } else { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index 66d8d43a8..a9b4497b9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -234,7 +234,7 @@ public class TraitClass extends Trait implements TraitWithSlot { String instanceInfoName = instanceInfoMultiname.getName(abc.constants, fullyQualifiedNames, false, true); - getMetaData(parent, convertData, abc, writer); + getMetaData(this, convertData, abc, writer); boolean allowEmbed = true; @@ -284,11 +284,11 @@ public class TraitClass extends Trait implements TraitWithSlot { writer.startMethod(classInfo.cinit_index, "cinit"); if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { if (!classInitializerIsEmpty) { - writer.startBlock(); + //writer.startBlock(); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); abc.bodies.get(bodyIndex).toString(callStack, abcIndex, path + "/" + instanceInfoName + ".staticinitializer", exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); - writer.endBlock(); + //writer.endBlock(); } else { //Note: There must be trait/method highlight even if the initializer is empty to TraitList in GUI to work correctly //TODO: handle this better in GUI(?) @@ -297,9 +297,9 @@ public class TraitClass extends Trait implements TraitWithSlot { } writer.endMethod(); writer.endTrait(); - if (!classInitializerIsEmpty) { + /*if (!classInitializerIsEmpty) { writer.newLine(); - } + }*/ } else { //"/*classInitializer*/"; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index 25399f105..e44c15230 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -162,7 +162,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { @Override public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { writeImports(abcIndex, scriptIndex, classIndex, false, abc, writer, getPackage(abc), fullyQualifiedNames); - getMetaData(parent, convertData, abc, writer); + getMetaData(this, convertData, abc, writer); writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false)); toStringHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index ce40768e6..96abd55eb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -240,7 +240,7 @@ public class TraitMethodGetterSetter extends Trait { if (classIndex < 0) { writeImports(abcIndex, scriptIndex, classIndex, isStatic, abc, writer, getPackage(abc), fullyQualifiedNames); } - getMetaData(parent, convertData, abc, writer); + getMetaData(this, convertData, abc, writer); writer.startMethod(method_info, getName(abc).getName(abc.constants, new ArrayList<>(), true, false)); path = path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames, false, true); toStringHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java index f40cb4185..d7d282a2b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java @@ -166,14 +166,13 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { * * @param abcIndex ABC indexing * @param exportMode Export mode - * @param parent Parent * @param convertData Convert data * @param writer Writer * @param abc ABC * @param fullyQualifiedNames Fully qualified names * @throws InterruptedException On interrupt */ - public void getValueStr(AbcIndexing abcIndex, ScriptExportMode exportMode, Trait parent, ConvertData convertData, GraphTextWriter writer, ABC abc, List fullyQualifiedNames) throws InterruptedException { + public void getValueStr(AbcIndexing abcIndex, ScriptExportMode exportMode, ConvertData convertData, GraphTextWriter writer, ABC abc, List fullyQualifiedNames) throws InterruptedException { if (convertData.assignedValues.containsKey(this)) { AssignedValue assignment = convertData.assignedValues.get(this); @@ -189,7 +188,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(abc.findBodyIndex(assignment.method))); - assignment.value.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>())); + assignment.value.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>(), exportMode)); } writer.endMethod(); writer.endTrait(); @@ -252,7 +251,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { */ @Override public GraphTextWriter toString(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { - getMetaData(parent, convertData, abc, writer); + getMetaData(this, convertData, abc, writer); Multiname n = getName(abc); boolean showModifier = true; if ((classIndex == -1) && (n != null)) { @@ -272,13 +271,13 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { List callStack = new ArrayList<>(); AssignedValue assignment = convertData.assignedValues.get(this); callStack.add(abc.bodies.get(abc.findBodyIndex(assignment.method))); - return val.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>())); + return val.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>(), exportMode)); } } getNameStr(writer, abc, fullyQualifiedNames); if (hasValueStr(abc, convertData)) { writer.appendNoHilight(" = "); - getValueStr(abcIndex, exportMode, parent, convertData, writer, abc, fullyQualifiedNames); + getValueStr(abcIndex, exportMode, convertData, writer, abc, fullyQualifiedNames); } return writer.appendNoHilight(";").newLine(); } @@ -305,7 +304,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { public void convert(AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { getNameStr(writer, abc, fullyQualifiedNames); if (hasValueStr(abc, convertData)) { - getValueStr(abcIndex, exportMode, parent, convertData, writer, abc, fullyQualifiedNames); + getValueStr(abcIndex, exportMode, convertData, writer, abc, fullyQualifiedNames); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java index 634c51a92..e53742566 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java @@ -316,7 +316,7 @@ public class Traits implements Cloneable, Serializable { */ public GraphTextWriter toString(AbcIndexing abcIndex, Class[] traitTypes, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, List ignoredTraitNames, boolean insideInterface) throws InterruptedException { - List ordered = new ArrayList<>(traits); + /*List ordered = new ArrayList<>(traits); loopi: for (int i = 0; i < ordered.size(); i++) { for (int j = i + 1; j < ordered.size(); j++) { @@ -356,7 +356,9 @@ public class Traits implements Cloneable, Serializable { } } } - +*/ + List ordered = traits; + for (Trait trait : ordered) { int t = traits.indexOf(trait); if (traitTypes != null) { @@ -377,8 +379,13 @@ public class Traits implements Cloneable, Serializable { if (ignoredTraitNames.contains(trait.getName(abc).getName(abc.constants, new ArrayList<>(), false, false))) { continue; } - writer.newLine(); - int h = abc.getGlobalTraitId(TraitType.METHOD /*non-initializer*/, isStatic, classIndex, t); + + if ((trait instanceof TraitSlotConst) && convertData.assignedValues.containsKey((TraitSlotConst) trait)) { + continue; + } + + writer.newLine(); + int h = abc.getGlobalTraitId(TraitType.METHOD , isStatic, classIndex, t); writer.startTrait(h); if (makePackages) { trait.toStringPackaged(abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); 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 a0532d714..3445442bc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -3872,12 +3872,21 @@ public class Graph { * @throws InterruptedException On interrupt */ public static GraphTextWriter graphToString(List tree, GraphTextWriter writer, LocalData localData) throws InterruptedException { + boolean lastNewLine = false; for (GraphTargetItem ti : tree) { if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData); + if (ti.hasSingleNewLineAround() && !lastNewLine) { + writer.newLine(); + } + ti.toStringSemicoloned(writer, localData); if (!ti.handlesNewLine()) { writer.newLine(); } + lastNewLine = false; + if (ti.hasSingleNewLineAround()) { + writer.newLine(); + lastNewLine = true; + } } } return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java index 73764e1a7..968b632db 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -767,6 +767,14 @@ public abstract class GraphTargetItem implements Serializable, Cloneable { public boolean handlesNewLine() { return false; } + + /** + * Checks whether this item needs single newline before and after. + * @return True if needs + */ + public boolean hasSingleNewLineAround() { + return false; + } /** * Converts this to string with new line. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java index 28175419f..955000cd4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.parser.script.AbcIndexing; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.action.model.ConstantPool; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.graph.DottedChain; import java.util.HashMap; import java.util.HashSet; @@ -78,6 +79,11 @@ public class LocalData { * ABC */ public ABC abc; + + /** + * Script export mode + */ + public ScriptExportMode exportMode; /** * Creates a new local data @@ -99,9 +105,10 @@ public class LocalData { * @param localRegNames Local register names * @param fullyQualifiedNames Fully qualified names * @param seenMethods Seen methods + * @param exportMode * @return Local data */ - public static LocalData create(List callStack, AbcIndexing abcIndex, ABC abc, HashMap localRegNames, List fullyQualifiedNames, Set seenMethods) { + public static LocalData create(List callStack, AbcIndexing abcIndex, ABC abc, HashMap localRegNames, List fullyQualifiedNames, Set seenMethods, ScriptExportMode exportMode) { LocalData localData = new LocalData(); localData.abc = abc; localData.constantsAvm2 = abc.constants; @@ -110,6 +117,7 @@ public class LocalData { localData.seenMethods = seenMethods; localData.abcIndex = abcIndex; localData.callStack = callStack; + localData.exportMode = exportMode; return localData; } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java index 37911e2d4..5712f776a 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java @@ -51,6 +51,7 @@ public class ActionScript2CompilerTest extends ActionScript2TestBase { Configuration.decompile.set(true); Configuration.registerNameFormat.set("_loc%d_"); Configuration.resolveConstants.set(true); + Configuration.showAllAddresses.set(false); swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2/as2.swf")), false); } 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 e6d044322..484a45ddf 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 @@ -35,7 +35,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT @Test public void testActivationProps() { decompileMethod("assembled", "testActivationProps", "var myvar2:int = 10;\r\n", - false); + false); } @Test @@ -45,7 +45,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "trace(\"hey\");\r\n" + "}\r\n", - false); + false); } @Test @@ -53,7 +53,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT decompileMethod("assembled", "testDecrementPrecedence", "var _loc2_:int = 10;\r\n" + "var _loc1_:int = 5;\r\n" + "var _loc3_:* = _loc2_ & (1 << _loc1_) - 1;\r\n", - false); + false); } @Test @@ -79,21 +79,21 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "}\r\n" + "return 5;\r\n", - false); + false); } @Test public void testDoubleDup() { decompileMethod("assembled", "testDoubleDup", "var _loc10_:Rectangle = myprop(_loc5_);\r\n" + "_loc10_.mymethod(-_loc10_.width,-_loc10_.height);\r\n", - false); + false); } @Test public void testDup() { decompileMethod("assembled", "testDup", "var _loc1_:Number;\r\n" + "return 1 - (_loc1_ = 1 - _loc1_ / _loc4_) * _loc1_;\r\n", - false); + false); } @Test @@ -105,7 +105,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "trace(_loc2_);\r\n" + "}\r\n", - false); + false); } @Test @@ -121,7 +121,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "}\r\n" + "}\r\n" + "_loc3_ = 0;\r\n", - false); + false); } @Test @@ -130,14 +130,14 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "_loc6_.methodname(_loc1_,_loc2_,_loc5_);\r\n" + "}\r\n", - false); + false); } @Test public void testIncrement() { decompileMethod("assembled", "testIncrement", "super();\r\n" + "b = a++;\r\n", - false); + false); } @Test @@ -146,13 +146,13 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "somemethod();\r\n" + "}\r\n", - false); + false); } @Test public void testIncrement3() { decompileMethod("assembled", "testIncrement3", "_loc1_.length--;\r\n", - false); + false); } @Test @@ -162,7 +162,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "trace(\"I\");\r\n" + "}\r\n", - false); + false); } @Test @@ -181,7 +181,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "default:\r\n" + "return;\r\n" + "}\r\n", - false); + false); } @Test @@ -197,7 +197,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "}\r\n" + "§§pop();\r\n" + "§§pop();\r\n", - false); + false); } @Test @@ -206,14 +206,14 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "var _loc5_:int = 5;\r\n" + "myname.somemethod(\"okay\",myslot = _loc5_);\r\n" + "myname.start();\r\n", - false); + false); } @Test public void testSetSlotFindProperty() { decompileMethod("assembled", "testSetSlotFindProperty", "var myprop:int;\r\n" + "return myprop = 50;\r\n", - false); + false); } @Test @@ -221,7 +221,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT decompileMethod("assembled", "testSwapAssignment", "var _loc6_:Bitmap = MyFactory.createBitmap();\r\n" + "_loc6_.x = _loc6_.x + 5;\r\n" + "_loc6_.y = -10;\r\n", - false); + false); } @Test @@ -241,7 +241,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "_loc2_ = \"C\";\r\n" + "}\r\n" + "_loc2_ = \"after\";\r\n", - false); + false); } @Test @@ -264,7 +264,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "default:\r\n" + "_loc2_ = 100;\r\n" + "}\r\n", - false); + false); } @Test @@ -292,7 +292,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "case 2:\r\n" + "trace(\"case2\");\r\n" + "}\r\n", - false); + false); } @Test @@ -338,7 +338,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "}\r\n" + "trace(\"G\");\r\n" + "return null;\r\n", - false); + false); } @Test @@ -365,7 +365,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "_loc2_ = 1;\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -394,7 +394,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -415,7 +415,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -435,7 +435,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "}\r\n" + "while(_loc5_ <= 100);\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -461,7 +461,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "return;\r\n" + "}\r\n" + "trace(\"finish\");\r\n", - false); + false); } @Test @@ -475,7 +475,7 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "{\r\n" + "return _loc5_;\r\n" + "}\r\n", - false); + false); } @Test @@ -485,6 +485,6 @@ public class ActionScript3AssembledDecompileTest extends ActionScript3DecompileT + "yyy\r\n" + ";\r\n" + "var _loc2_:* = _loc1_.b.*;\r\n", - false); + false); } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java index e2793c597..0a4bd47c8 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassTest.java @@ -627,4 +627,86 @@ public class ActionScript3ClassTest extends ActionScript3DecompileTestBase { + " }\n" + "}"); } + + @Test + public void testScriptInitializer() { + decompileScriptPack("standard", "tests_classes.TestScriptInitializer", "package tests_classes\n" + + "{\n" + + " public class TestScriptInitializer\n" + + " {\n" + + " \n" + + " private static var sv:int;\n" + + " \n" + + " private static var sa:int = 5;\n" + + " \n" + + " private static const sc:int = Math.floor(Math.random() * 50) + sa + x;\n" + + " \n" + + " private static var sb:int = sa + 20;\n" + + " \n" + + " if(Math.random() * 10 >= 5)\n" + + " {\n" + + " sa += 100;\n" + + " }\n" + + " else\n" + + " {\n" + + " sa += 200;\n" + + " }\n" + + " if(sb > 100)\n" + + " {\n" + + " sb += 10;\n" + + " }\n" + + " else\n" + + " {\n" + + " sb += 20;\n" + + " }\n" + + " for each(sv in [1,3,5])\n" + + " {\n" + + " trace(sv);\n" + + " }\n" + + " \n" + + " public function TestScriptInitializer()\n" + + " {\n" + + " super();\n" + + " }\n" + + " \n" + + " public function test() : void\n" + + " {\n" + + " var x:int = 5;\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + "var v:int;\n" + + "\n" + + "var x:int = Math.random() * 100;\n" + + "\n" + + "var a:int = 5;\n" + + "\n" + + "if(Math.random() * 10 >= 5)\n" + + "{\n" + + " a = a + 100;\n" + + "}\n" + + "else\n" + + "{\n" + + " a = a + 200;\n" + + "}\n" + + "\n" + + "const c:int = Math.floor(Math.random() * 50) + a;\n" + + "\n" + + "var b:int = a + 20;\n" + + "\n" + + "if(b > 100)\n" + + "{\n" + + " b = b + 10;\n" + + "}\n" + + "else\n" + + "{\n" + + " b = b + 20;\n" + + "}\n" + + "for each(v in [1,3,5])\n" + + "{\n" + + " trace(v);\n" + + "}\n" + + ""); + } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index 7c5360757..b91ca6e8b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -42,13 +42,13 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(arguments[0]);\r\n" + "}\r\n", - false); + false); } @Test public void testArguments() { decompileMethod("classic_air", "testArguments", "return arguments[0];\r\n", - false); + false); } @Test @@ -61,21 +61,21 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var f:* = a ^ 0x0641;\r\n" + "var g:* = 0x0641 ^ a;\r\n" + "var h:int = -385;\r\n", - false); + false); } @Test public void testCallCall() { decompileMethod("classic_air", "testCallCall", "var o:* = new getDefinitionByName(\"Object\");\r\n" + "var o2:* = new (getDefinitionByName(\"Object\"))();\r\n", - false); + false); } @Test public void testCallLocal() { decompileMethod("classic_air", "testCallLocal", "var f:Function = getF();\r\n" + "var b:int = f(1,3);\r\n", - false); + false); } @Test @@ -95,7 +95,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"infinally\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -115,7 +115,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"ch\");\r\n" + "}\r\n", - false); + false); } @Test @@ -134,7 +134,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"OK: \" + f);\r\n" + "}\r\n", - false); + false); } @Test @@ -157,7 +157,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(e);\r\n" + "}\r\n" + "trace(\"y\");\r\n", - false); + false); } @Test @@ -165,7 +165,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile decompileMethod("classic_air", "testComma", "var a:int = 5;\r\n" + "var b:int = 0;\r\n" + "trace(a > 4 ? (b = 5, a) : 35);\r\n", - false); + false); } @Test @@ -173,7 +173,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile decompileMethod("classic_air", "testComplexExpressions", "var i:int = 0;\r\n" + "var j:int = 0;\r\n" + "j = i += i += i++;\r\n", - false); + false); } @Test @@ -203,7 +203,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(e.message);\r\n" + "}\r\n", - false); + false); } @Test @@ -269,7 +269,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"hello\");\r\n" + "}\r\n", - false); + false); } @Test @@ -353,7 +353,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "super.prot = int(s);\r\n" + "i = super.prot;\r\n" + "s = String(super.prot);\r\n", - false); + false); } @Test @@ -369,7 +369,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "}\r\n" + "k = 7;\r\n", - false); + false); } @Test @@ -385,7 +385,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "i = new MyClass2();\r\n" + "}\r\n" + "return i;\r\n", - false); + false); } @Test @@ -405,7 +405,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "vnumber = 0.5;\r\n" + "vnumber = 6;\r\n" + "vobject = vclass;\r\n", - false); + false); } @Test @@ -423,7 +423,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"4\");\r\n" + "}\r\n" + "trace(\"after switch\");\r\n", - false); + false); } @Test @@ -445,7 +445,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -457,7 +457,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "a++;\r\n" + "}\r\n" + "while(a < 20);\r\n", - false); + false); } @Test @@ -478,7 +478,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "while(k < 9);\r\n" + "return 2;\r\n", - false); + false); } @Test @@ -488,7 +488,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "nextChar();\r\n" + "}\r\n" + "while(ch != \"\\n\" && ch != \"\");\r\n", - false); + false); } @Test @@ -510,7 +510,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "while(k < 10);\r\n" + "trace(\"ss\");\r\n", - false); + false); } @Test @@ -521,7 +521,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"between\");\r\n" + "var g:* = k.(d.attrib++, false);\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -529,7 +529,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile decompileMethod("classic_air", "testExecutionOrder", "var m:MyClass = null;\r\n" + "m.x = (m = create() as MyClass).x + 5;\r\n" + "trace(m.x);\r\n", - false); + false); } @Test @@ -551,7 +551,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "arr[0]();\r\n" + "}\r\n" + "return i == 0;\r\n", - false); + false); } @Test @@ -573,7 +573,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "return \"hu\" + str;\r\n" + "}\r\n", - false); + false); } @Test @@ -584,7 +584,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"a=\" + a);\r\n" + "a++;\r\n" + "}\r\n", - false); + false); } @Test @@ -610,7 +610,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -625,7 +625,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"hello:\" + a);\r\n" + "a++;\r\n" + "}\r\n", - false); + false); } @Test @@ -654,7 +654,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"part5\");\r\n" + "}\r\n", - false); + false); } @Test @@ -669,7 +669,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"item #\" + item);\r\n" + "}\r\n", - false); + false); } @Test @@ -686,7 +686,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"item #\" + test[0]);\r\n" + "}\r\n", - false); + false); } @Test @@ -700,7 +700,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"item #\" + this.testPriv);\r\n" + "}\r\n", - false); + false); } @Test @@ -718,7 +718,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "return item;\r\n" + "}\r\n" + "return null;\r\n", - false); + false); } @Test @@ -741,7 +741,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "}\r\n" + "return null;\r\n", - false); + false); } @Test @@ -780,7 +780,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"before_continue\");\r\n" + "}\r\n", - false); + false); } @Test @@ -807,7 +807,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -833,7 +833,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"C\");\r\n" + "}\r\n" + "trace(\"exit\");\r\n", - false); + false); } @Test @@ -848,7 +848,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(item);\r\n" + "}\r\n", - false); + false); } @Test @@ -867,7 +867,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"forend\");\r\n" + "}\r\n", - false); + false); } @Test @@ -881,7 +881,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "return item;\r\n" + "}\r\n" + "return null;\r\n", - false); + false); } @Test @@ -902,7 +902,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"final\");\r\n" + "}\r\n", - false); + false); } @Test @@ -936,7 +936,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"C\");\r\n" + "}\r\n", - false); + false); } @Test @@ -945,7 +945,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "c.attr = 2;\r\n" + "var a:int = attr;\r\n" + "trace(a);\r\n", - false); + false); } @Test @@ -977,7 +977,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"after\");\r\n" + "}\r\n" + "return 89;\r\n", - false); + false); } @Test @@ -1001,7 +1001,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"E\");\r\n" + "}\r\n" + "return 5;\r\n", - false); + false); } @Test @@ -1029,7 +1029,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"C\");\r\n" + "}\r\n" + "trace(\"return\");\r\n", - false); + false); } @Test @@ -1050,7 +1050,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "}\r\n" + "trace(\"return\");\r\n", - false); + false); } @Test @@ -1075,7 +1075,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "j++;\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -1100,7 +1100,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"D\");\r\n" + "}\r\n" + "trace(\"finish\");\r\n", - false); + false); } @Test @@ -1130,13 +1130,13 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"before loop end\");\r\n" + "}\r\n", - false); + false); } @Test public void testHello() { decompileMethod("classic_air", "testHello", "trace(\"hello\");\r\n", - false); + false); } @Test @@ -1146,7 +1146,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"onTrue\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1160,7 +1160,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"onFalse\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1181,7 +1181,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"in finally\");\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -1205,7 +1205,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"C\");\r\n" + "return 7;\r\n", - false); + false); } @Test @@ -1230,7 +1230,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"in catch\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1252,7 +1252,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1269,20 +1269,20 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"F\");\r\n" + "}\r\n", - false); + false); } @Test public void testImportedConst() { decompileMethod("classic_air", "testImportedConst", "trace(29);\r\n", - false); + false); } @Test public void testImportedVar() { decompileMethod("classic_air", "testImportedVar", "trace(myvar);\r\n" + "myvar = 5;\r\n", - false); + false); } @Test @@ -1296,7 +1296,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "b++;\r\n" + "var c:int = 1;\r\n" + "b = c++;\r\n", - false); + false); } @Test @@ -1347,7 +1347,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"--attr\");\r\n" + "trace(--attrx);\r\n" + "--attrx;\r\n", - false); + false); } @Test @@ -1367,7 +1367,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "return first;\r\n" + "};\r\n" + "traceParameter(\"hello\");\r\n", - false); + false); } @Test @@ -1392,7 +1392,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "return a + 1;\r\n" + "})(1);\r\n", - false); + false); } @Test @@ -1403,7 +1403,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(testProm);\r\n" + "};\r\n" + "innerFunc(a);\r\n", - false); + false); } @Test @@ -1419,7 +1419,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "s = 8;\r\n" + "}\r\n" + "innerFunc(a);\r\n", - false); + false); } @Test @@ -1446,7 +1446,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"b!=7\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -1471,7 +1471,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"finally block\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1485,20 +1485,20 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "b = true;\r\n" + "}\r\n" + "b = (i == 0 || i == 1) && j == 0;\r\n", - false); + false); } @Test public void testManualConvert() { decompileMethod("classic_air", "testManualConvert", "trace(\"String(this).length\");\r\n" + "trace(String(this).length);\r\n", - false); + false); } @Test public void testMetadata() { decompileMethod("classic_air", "testMetadata", "trace(\"hello\");\r\n", - false); + false); } @Test @@ -1515,7 +1515,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "default:\r\n" + "jj = 3;\r\n" + "}\r\n", - false); + false); } @Test @@ -1531,7 +1531,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"onFalse\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1544,7 +1544,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "return (param1 as TestClass2).attrib1 == 5;\r\n" + "};\r\n" + "})();\r\n", - false); + false); } @Test @@ -1556,7 +1556,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(b.c);\r\n" + "var c:int = myInternal::neco;\r\n" + "var d:int = myInternal2::neco;\r\n", - false); + false); } @Test @@ -1572,21 +1572,21 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "f();\r\n" + "this.f();\r\n" + "g();\r\n", - false); + false); } @Test public void testNegate() { decompileMethod("classic_air", "testNegate", "var a:int = 5;\r\n" + "var b:int = ~a;\r\n", - false); + false); } @Test public void testNumberCall() { decompileMethod("classic_air", "testNumberCall", "var a:String = (5).toString();\r\n" + "var b:String = 5.2.toString();\r\n", - false); + false); } @Test @@ -1675,7 +1675,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "\"test\" + this.f();\r\n" + "v = undefined;\r\n" + "sr = typeof c;\r\n", - false); + false); } @Test @@ -1689,19 +1689,19 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var d:int = 4;\r\n" + "var e:int = d + 5;\r\n" + "var i:int = h = g = f;\r\n", - false); + false); } @Test public void testParamNames() { decompileMethod("classic_air", "testParamNames", "return firstp + secondp + thirdp;\r\n", - false); + false); } @Test public void testParamsCount() { decompileMethod("classic_air", "testParamsCount", "return firstp;\r\n", - false); + false); } @Test @@ -1718,7 +1718,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "a = 6;\r\n" + "a = 0.6666666666666666;\r\n" + "trace(\"a=\" + a);\r\n", - false); + false); } @Test @@ -1728,7 +1728,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var c:int = 3;\r\n" + "var d:* = a << (b >>> c);\r\n" + "var e:* = a << b >>> c;\r\n", - false); + false); } @Test @@ -1739,7 +1739,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "d.method(d.attrib * 5);\r\n" + "}\r\n", - false); + false); } @Test @@ -1756,14 +1756,14 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "r = n1 / n2 / n3;\r\n" + "trace(\"not a regexp 2\");\r\n" + "r /= n1 / n2;\r\n", - false); + false); } @Test public void testRest() { decompileMethod("classic_air", "testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + "return firstp;\r\n", - false); + false); } @Test @@ -1778,7 +1778,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(i--);\r\n" + "trace(++i);\r\n" + "trace(--i);\r\n", - false); + false); } @Test @@ -1795,7 +1795,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "n = 1;\r\n" + "}\r\n" + "};\r\n", - false); + false); } @Test @@ -1805,14 +1805,14 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"is eight\");\r\n" + "}\r\n", - false); + false); } @Test public void testStringCoerce() { decompileMethod("classic_air", "testStringCoerce", "var text1:String = this.a[\"test\"];\r\n" + "var text2:String = String(this.a[\"test\"]);\r\n", - false); + false); } @Test @@ -1821,7 +1821,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "this.traceIt(\"hello30\");\r\n" + "this.traceIt(\"hello\" + (k - 1));\r\n" + "this.traceIt(\"hello56\");\r\n", - false); + false); } @Test @@ -1831,7 +1831,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"backslash: \\\\ \");\r\n" + "trace(\"single quotes: \\'hello!\\'\");\r\n" + "trace(\"new line \\r\\n hello!\");\r\n", - false); + false); } @Test @@ -1850,7 +1850,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "case 89:\r\n" + "trace(\"eightynine\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1867,7 +1867,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "case \"C\":\r\n" + "trace(\"is C\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1895,7 +1895,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"message shown\");\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -1917,7 +1917,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "default:\r\n" + "trace(\"default clause\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1935,7 +1935,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "break;\r\n" + "}\r\n" + "trace(\"B\");\r\n", - false); + false); } @Test @@ -1946,7 +1946,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var d:int = 78;\r\n" + "var e:* = a == b ? (c == d ? 1 : 7) : 3;\r\n" + "trace(\"e=\" + e);\r\n", - false); + false); } @Test @@ -1971,7 +1971,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"Finally part\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -1989,7 +1989,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "trace(\"in catch\");\r\n" + "}\r\n", - false); + false); } @Test @@ -2017,7 +2017,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "}\r\n" + "return 4;\r\n", - false); + false); } @Test @@ -2059,7 +2059,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"after\");\r\n" + "return \"X\";\r\n", - false); + false); } @Test @@ -2080,7 +2080,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "i++;\r\n" + "}\r\n" + "f();\r\n", - false); + false); } @Test @@ -2114,7 +2114,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"after\");\r\n" + "return \"X\";\r\n", - false); + false); } @Test @@ -2124,7 +2124,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "return x + y + TestClass;\r\n" + "};\r\n", - false); + false); } @Test @@ -2135,14 +2135,14 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var a:int = 5;\r\n" + "v[a * 8 - 39] = \"hi2\";\r\n" + "trace(v[0]);\r\n", - false); + false); } @Test public void testVector2() { decompileMethod("classic_air", "testVector2", "var a:Vector.> = new Vector.>();\r\n" + "var b:Vector. = new [10,20,30];\r\n", - false); + false); } @Test @@ -2156,7 +2156,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "a = 7;\r\n" + "b = 9;\r\n", - false); + false); } @Test @@ -2175,7 +2175,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "}\r\n" + "return \"B\";\r\n", - false); + false); } @Test @@ -2226,7 +2226,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"gg\");\r\n" + "}\r\n" + "trace(\"ss\");\r\n", - false); + false); } @Test @@ -2248,7 +2248,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "trace(\"hello2\");\r\n" + "}\r\n", - false); + false); } @Test @@ -2267,7 +2267,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "\r\n" + "}\r\n" + "trace(\"E\");\r\n", - false); + false); } @Test @@ -2297,7 +2297,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "}\r\n" + "i++;\r\n" + "}\r\n", - false); + false); } @Test @@ -2318,7 +2318,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "{\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -2346,7 +2346,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "trace(\"after_try\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -2490,6 +2490,6 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "\r\n" + ";\r\n" + "var m:XMLList = myXML.*;\r\n", - false); + false); } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index 3fd476a9d..3a0f87c4f 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -42,13 +42,13 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(arguments[0]);\r\n" + "}\r\n", - false); + false); } @Test public void testArguments() { decompileMethod("classic", "testArguments", "return arguments[0];\r\n", - false); + false); } @Test @@ -61,21 +61,21 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var f:int = a ^ 0x0641;\r\n" + "var g:int = 0x0641 ^ a;\r\n" + "var h:int = ~0x0180;\r\n", - false); + false); } @Test public void testCallCall() { decompileMethod("classic", "testCallCall", "var o:* = new getDefinitionByName(\"Object\")();\r\n" + "var o2:* = new (getDefinitionByName(\"Object\"))();\r\n", - false); + false); } @Test public void testCallLocal() { decompileMethod("classic", "testCallLocal", "var f:Function = this.getF();\r\n" + "var b:int = f(1,3);\r\n", - false); + false); } @Test @@ -95,7 +95,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"infinally\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -115,7 +115,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"ch\");\r\n" + "}\r\n", - false); + false); } @Test @@ -134,7 +134,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"OK: \" + f);\r\n" + "}\r\n", - false); + false); } @Test @@ -157,7 +157,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(e);\r\n" + "}\r\n" + "trace(\"y\");\r\n", - false); + false); } @Test @@ -165,7 +165,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes decompileMethod("classic", "testComma", "var a:int = 5;\r\n" + "var b:int = 0;\r\n" + "trace(a > 4 ? (b = 5, a) : 35);\r\n", - false); + false); } @Test @@ -173,7 +173,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes decompileMethod("classic", "testComplexExpressions", "var i:int = 0;\r\n" + "var j:int = 0;\r\n" + "j = i = i + (i = i + i++);\r\n", - false); + false); } @Test @@ -204,7 +204,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(e.message);\r\n" + "}\r\n", - false); + false); } @Test @@ -268,7 +268,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"hello\");\r\n" + "}\r\n", - false); + false); } @Test @@ -352,7 +352,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "super.prot = int(s);\r\n" + "i = super.prot;\r\n" + "s = String(super.prot);\r\n", - false); + false); } @Test @@ -368,7 +368,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "}\r\n" + "k = 7;\r\n", - false); + false); } @Test @@ -384,7 +384,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "i = new MyClass2();\r\n" + "}\r\n" + "return i;\r\n", - false); + false); } @Test @@ -404,7 +404,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "vnumber = 0.5;\r\n" + "vnumber = 6;\r\n" + "vobject = vclass;\r\n", - false); + false); } @Test @@ -422,7 +422,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"4\");\r\n" + "}\r\n" + "trace(\"after switch\");\r\n", - false); + false); } @Test @@ -444,7 +444,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -456,7 +456,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "a++;\r\n" + "}\r\n" + "while(a < 20);\r\n", - false); + false); } @Test @@ -477,7 +477,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "while(k < 9);\r\n" + "return 2;\r\n", - false); + false); } @Test @@ -487,7 +487,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "this.nextChar();\r\n" + "}\r\n" + "while(this.ch != \"\\n\" && this.ch != \"\");\r\n", - false); + false); } @Test @@ -509,7 +509,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "while(k < 10);\r\n" + "trace(\"ss\");\r\n", - false); + false); } @Test @@ -523,7 +523,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"between\");\r\n" + "g = k.(++d.attrib, 0);\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -531,7 +531,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes decompileMethod("classic", "testExecutionOrder", "var m:MyClass = null;\r\n" + "m.x = (m = create() as MyClass).x + 5;\r\n" + "trace(m.x);\r\n", - false); + false); } @Test @@ -553,7 +553,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "arr[0]();\r\n" + "}\r\n" + "return i == 0;\r\n", - false); + false); } @Test @@ -575,7 +575,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "return \"hu\" + str;\r\n" + "}\r\n", - false); + false); } @Test @@ -584,7 +584,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"a=\" + a);\r\n" + "}\r\n", - false); + false); } @Test @@ -609,7 +609,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -622,7 +622,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"hello:\" + a);\r\n" + "}\r\n", - false); + false); } @Test @@ -650,7 +650,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"part5\");\r\n" + "}\r\n", - false); + false); } @Test @@ -665,7 +665,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"item #\" + item);\r\n" + "}\r\n", - false); + false); } @Test @@ -682,7 +682,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"item #\" + test[0]);\r\n" + "}\r\n", - false); + false); } @Test @@ -696,7 +696,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"item #\" + this.testPriv);\r\n" + "}\r\n", - false); + false); } @Test @@ -714,7 +714,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "return item;\r\n" + "}\r\n" + "return null;\r\n", - false); + false); } @Test @@ -738,7 +738,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "}\r\n" + "return null;\r\n", - false); + false); } @Test @@ -778,7 +778,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"before_continue\");\r\n" + "}\r\n", - false); + false); } @Test @@ -806,7 +806,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -831,7 +831,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"C\");\r\n" + "}\r\n" + "trace(\"exit\");\r\n", - false); + false); } @Test @@ -846,7 +846,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(item);\r\n" + "}\r\n", - false); + false); } @Test @@ -866,7 +866,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"forend\");\r\n" + "}\r\n", - false); + false); } @Test @@ -880,7 +880,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "return item;\r\n" + "}\r\n" + "return null;\r\n", - false); + false); } @Test @@ -903,7 +903,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"final\");\r\n" + "}\r\n", - false); + false); } @Test @@ -937,7 +937,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"C\");\r\n" + "}\r\n", - false); + false); } @Test @@ -946,7 +946,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "c.attr = 2;\r\n" + "var a:* = this.attr;\r\n" + "trace(a);\r\n", - false); + false); } @Test @@ -978,7 +978,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"after\");\r\n" + "}\r\n" + "return 89;\r\n", - false); + false); } @Test @@ -1002,7 +1002,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"E\");\r\n" + "}\r\n" + "return 5;\r\n", - false); + false); } @Test @@ -1029,7 +1029,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"C\");\r\n" + "}\r\n" + "trace(\"return\");\r\n", - false); + false); } @Test @@ -1050,7 +1050,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "}\r\n" + "trace(\"return\");\r\n", - false); + false); } @Test @@ -1074,7 +1074,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "j++;\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -1099,7 +1099,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"D\");\r\n" + "}\r\n" + "trace(\"finish\");\r\n", - false); + false); } @Test @@ -1128,13 +1128,13 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"before loop end\");\r\n" + "}\r\n", - false); + false); } @Test public void testHello() { decompileMethod("classic", "testHello", "trace(\"hello\");\r\n", - false); + false); } @Test @@ -1144,7 +1144,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"onTrue\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1158,7 +1158,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"onFalse\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1179,7 +1179,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"in finally\");\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -1203,7 +1203,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"C\");\r\n" + "return 7;\r\n", - false); + false); } @Test @@ -1227,7 +1227,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"in catch\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1249,7 +1249,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"D\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1266,20 +1266,20 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"F\");\r\n" + "}\r\n", - false); + false); } @Test public void testImportedConst() { decompileMethod("classic", "testImportedConst", "trace(myconst);\r\n", - false); + false); } @Test public void testImportedVar() { decompileMethod("classic", "testImportedVar", "trace(myvar);\r\n" + "myvar = 5;\r\n", - false); + false); } @Test @@ -1293,7 +1293,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "b++;\r\n" + "var c:* = 1;\r\n" + "b = c++;\r\n", - false); + false); } @Test @@ -1346,7 +1346,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"--attr\");\r\n" + "trace(--this.attrx);\r\n" + "--this.attrx;\r\n", - false); + false); } @Test @@ -1368,7 +1368,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "return first;\r\n" + "};\r\n" + "traceParameter(\"hello\");\r\n", - false); + false); } @Test @@ -1389,7 +1389,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "return a + 1;\r\n" + "})(1);\r\n", - false); + false); } @Test @@ -1400,7 +1400,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(testProm);\r\n" + "};\r\n" + "innerFunc(a);\r\n", - false); + false); } @Test @@ -1416,7 +1416,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "s = 8;\r\n" + "}\r\n" + "innerFunc(a);\r\n", - false); + false); } @Test @@ -1443,7 +1443,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"b!=7\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -1468,7 +1468,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"finally block\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1482,20 +1482,20 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "b = true;\r\n" + "}\r\n" + "b = (i == 0 || i == 1) && j == 0;\r\n", - false); + false); } @Test public void testManualConvert() { decompileMethod("classic", "testManualConvert", "trace(\"String(this).length\");\r\n" + "trace(String(this).length);\r\n", - false); + false); } @Test public void testMetadata() { decompileMethod("classic", "testMetadata", "trace(\"hello\");\r\n", - false); + false); } @Test @@ -1512,7 +1512,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "default:\r\n" + "jj = 3;\r\n" + "}\r\n", - false); + false); } @Test @@ -1528,7 +1528,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"onFalse\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1537,7 +1537,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "return (param1 as TestClass2).attrib1 == 5;\r\n" + "};\r\n", - false); + false); } @Test @@ -1549,7 +1549,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(b.c);\r\n" + "var c:* = myInternal::neco;\r\n" + "var d:* = this.myInternal2::neco;\r\n", - false); + false); } @Test @@ -1565,21 +1565,21 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "this.f();\r\n" + "this.f();\r\n" + "g();\r\n", - false); + false); } @Test public void testNegate() { decompileMethod("classic", "testNegate", "var a:int = 5;\r\n" + "var b:int = ~a;\r\n", - false); + false); } @Test public void testNumberCall() { decompileMethod("classic", "testNumberCall", "var a:String = (5).toString();\r\n" + "var b:String = 5.2.toString();\r\n", - false); + false); } @Test @@ -1661,7 +1661,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "\"test\" + this.f();\r\n" + "v = undefined;\r\n" + "sr = typeof c;\r\n", - false); + false); } @Test @@ -1675,19 +1675,19 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var d:int = 4;\r\n" + "var e:int = d + 5;\r\n" + "var i:int = h = g = f;\r\n", - false); + false); } @Test public void testParamNames() { decompileMethod("classic", "testParamNames", "return firstp + secondp + thirdp;\r\n", - false); + false); } @Test public void testParamsCount() { decompileMethod("classic", "testParamsCount", "return firstp;\r\n", - false); + false); } @Test @@ -1704,7 +1704,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "a = 1 * 2 * 3;\r\n" + "a = 1 * 2 / 3;\r\n" + "trace(\"a=\" + a);\r\n", - false); + false); } @Test @@ -1714,7 +1714,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var c:* = 3;\r\n" + "var d:* = a << (b >>> c);\r\n" + "var e:* = a << b >>> c;\r\n", - false); + false); } @Test @@ -1725,7 +1725,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "d.method(d.attrib * 5);\r\n" + "}\r\n", - false); + false); } @Test @@ -1742,14 +1742,14 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "r = n1 / n2 / n3;\r\n" + "trace(\"not a regexp 2\");\r\n" + "r /= n1 / n2;\r\n", - false); + false); } @Test public void testRest() { decompileMethod("classic", "testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + "return firstp;\r\n", - false); + false); } @Test @@ -1764,7 +1764,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(i--);\r\n" + "trace(++i);\r\n" + "trace(--i);\r\n", - false); + false); } @Test @@ -1781,7 +1781,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "n = 1;\r\n" + "}\r\n" + "};\r\n", - false); + false); } @Test @@ -1791,14 +1791,14 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"is eight\");\r\n" + "}\r\n", - false); + false); } @Test public void testStringCoerce() { decompileMethod("classic", "testStringCoerce", "var text1:String = this.a[\"test\"];\r\n" + "var text2:String = String(this.a[\"test\"]);\r\n", - false); + false); } @Test @@ -1807,7 +1807,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "this.traceIt(\"hello\" + 5 * 6);\r\n" + "this.traceIt(\"hello\" + (k - 1));\r\n" + "this.traceIt(\"hello\" + 5 + 6);\r\n", - false); + false); } @Test @@ -1817,7 +1817,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"backslash: \\\\ \");\r\n" + "trace(\"single quotes: \\'hello!\\'\");\r\n" + "trace(\"new line \\r\\n hello!\");\r\n", - false); + false); } @Test @@ -1836,7 +1836,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "case 89:\r\n" + "trace(\"eightynine\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1853,7 +1853,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "case TestSwitchComma.X, \"C\":\r\n" + "trace(\"is C\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1881,7 +1881,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"message shown\");\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -1903,7 +1903,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "default:\r\n" + "trace(\"default clause\");\r\n" + "}\r\n", - false); + false); } @Test @@ -1921,7 +1921,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "}\r\n" + "trace(\"B\");\r\n", - false); + false); } @Test @@ -1932,7 +1932,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var d:* = 78;\r\n" + "var e:* = a == b ? (c == d ? 1 : 7) : 3;\r\n" + "trace(\"e=\" + e);\r\n", - false); + false); } @Test @@ -1957,7 +1957,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"Finally part\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -1975,7 +1975,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "trace(\"in catch\");\r\n" + "}\r\n", - false); + false); } @Test @@ -2003,7 +2003,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "}\r\n" + "return 4;\r\n", - false); + false); } @Test @@ -2050,7 +2050,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"after\");\r\n" + "return \"X\";\r\n", - false); + false); } @Test @@ -2070,7 +2070,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "i++;\r\n" + "}\r\n" + "f();\r\n", - false); + false); } @Test @@ -2106,7 +2106,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"after\");\r\n" + "return \"X\";\r\n", - false); + false); } @Test @@ -2116,7 +2116,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "return x + y + TestClass;\r\n" + "};\r\n", - false); + false); } @Test @@ -2127,14 +2127,14 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var a:int = 5;\r\n" + "v[a * 8 - 39] = \"hi2\";\r\n" + "trace(v[0]);\r\n", - false); + false); } @Test public void testVector2() { decompileMethod("classic", "testVector2", "var a:Vector.> = new Vector.>();\r\n" + "var b:Vector. = new [10,20,30];\r\n", - false); + false); } @Test @@ -2148,7 +2148,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "a = 7;\r\n" + "b = 9;\r\n", - false); + false); } @Test @@ -2167,7 +2167,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "}\r\n" + "return \"B\";\r\n", - false); + false); } @Test @@ -2218,7 +2218,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"gg\");\r\n" + "}\r\n" + "trace(\"ss\");\r\n", - false); + false); } @Test @@ -2240,7 +2240,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "trace(\"hello2\");\r\n" + "}\r\n", - false); + false); } @Test @@ -2259,7 +2259,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "\r\n" + "}\r\n" + "trace(\"E\");\r\n", - false); + false); } @Test @@ -2289,7 +2289,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "}\r\n" + "i++;\r\n" + "}\r\n", - false); + false); } @Test @@ -2310,7 +2310,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "{\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -2337,7 +2337,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "trace(\"after_try\");\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -2492,6 +2492,6 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "\r\n" + ";\r\n" + "m = myXML.*;\r\n", - false); + false); } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java index 36d892788..0bc1b4104 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java @@ -54,7 +54,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -69,7 +69,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"catched exception: \" + e.message);\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -90,7 +90,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -107,7 +107,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "}\r\n" + "return 2;\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -137,7 +137,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -160,7 +160,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "{\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -197,7 +197,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "a++;\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -218,7 +218,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "a++;\r\n" + "}\r\n" + "return \"OK\";\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -244,7 +244,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"a=\" + a);\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -269,7 +269,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "i++;\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -299,7 +299,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "i++;\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -322,7 +322,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -344,7 +344,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"a=\" + a);\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -370,7 +370,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -412,7 +412,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -441,7 +441,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in catch1c\");\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -478,7 +478,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "a++;\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -501,7 +501,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "trace(\"after\");\r\n" + "return -1;\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -524,7 +524,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -546,7 +546,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"after try\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -565,7 +565,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in finally\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -587,7 +587,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "return \"hu\" + str;\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -617,7 +617,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"after\");\r\n" + "i++;\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -647,7 +647,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"after\");\r\n" + "i++;\r\n" + "}\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -670,7 +670,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in finally\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -685,7 +685,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in finally\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -717,7 +717,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "trace(\"after\");\r\n" + "return \"RETFINAL\";\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -753,7 +753,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "trace(\"after\");\r\n" + "return \"RETEXIT\";\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -785,7 +785,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in finally1\");\r\n" + "}\r\n" + "return \"RETFINAL\";\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -837,7 +837,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "}\r\n" + "trace(\"after0\");\r\n" + "return \"RETFINAL\";\r\n", - false); + false); } @Test(dataProvider = "swfNamesProvider") @@ -862,6 +862,6 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi + "trace(\"in finally\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java index 6df341f4a..2722d7350 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java @@ -44,7 +44,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -60,7 +60,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"catched exception: \" + _loc1_.message);\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -81,7 +81,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -98,7 +98,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "return 2;\r\n", - false); + false); } @Test @@ -128,7 +128,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -151,7 +151,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "{\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -188,7 +188,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "_loc1_++;\r\n" + "}\r\n", - false); + false); } @Test @@ -209,7 +209,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "return \"OK\";\r\n", - false); + false); } @Test @@ -235,7 +235,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -261,7 +261,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "_loc1_++;\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -290,7 +290,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "_loc1_++;\r\n" + "}\r\n" + "trace(\"end\");\r\n", - false); + false); } @Test @@ -313,7 +313,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"in catch\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -335,7 +335,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -361,7 +361,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -403,7 +403,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -432,7 +432,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"in catch1c\");\r\n" + "}\r\n" + "}\r\n", - false); + false); } @Test @@ -469,7 +469,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "_loc1_++;\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -492,7 +492,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"after\");\r\n" + "return -1;\r\n", - false); + false); } @Test @@ -515,7 +515,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -541,7 +541,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"after try\");\r\n" + "}\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -565,7 +565,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"in finally\");\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -587,7 +587,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "return \"hu\" + _loc1_;\r\n" + "}\r\n", - false); + false); } @Test @@ -623,7 +623,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"after\");\r\n" + "_loc1_++;\r\n" + "}\r\n", - false); + false); } @Test @@ -653,7 +653,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"after\");\r\n" + "_loc1_++;\r\n" + "}\r\n", - false); + false); } @Test @@ -681,7 +681,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"in finally\");\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -698,7 +698,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"in finally\");\r\n" + "trace(\"after\");\r\n", - false); + false); } @Test @@ -736,7 +736,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"in finally\");\r\n" + "trace(\"after\");\r\n" + "return \"RETFINAL\";\r\n", - false); + false); } @Test @@ -771,7 +771,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"after\");\r\n" + "return \"RETEXIT\";\r\n", - false); + false); } @Test @@ -812,7 +812,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"in finally1\");\r\n" + "return \"RETFINAL\";\r\n", - false); + false); } @Test @@ -879,7 +879,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "trace(\"in finally0\");\r\n" + "trace(\"after0\");\r\n" + "return \"RETFINAL\";\r\n", - false); + false); } @Test @@ -910,6 +910,6 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript + "}\r\n" + "trace(\"in finally\");\r\n" + "trace(\"after\");\r\n", - false); + false); } } diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf index 70fc7a03f8a02543800666360e4ac4a1d2066465..13dffa12b0714531975b865370c3d67413e63a10 100644 GIT binary patch literal 30648 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 literal 30162 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 diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf index 7f0cbbd9666bc39593331eddb0e7857d414dc078..5995734bf7be747aa3cbd9b608bede26c51133db 100644 GIT binary patch literal 40744 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 literal 39982 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�p6- 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 O`bKIIC;tyT!0>i3jcX$S diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index a07bfb6c5..d09e272f0 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -147,6 +147,7 @@ package TestImports2; TestInitializer; TestRegexpHilight; + TestScriptInitializer; TestPropertyCoerce; TestUnaryMinus; @@ -170,6 +171,8 @@ package { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point + + new TestScriptInitializer(); } } diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestScriptInitializer.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestScriptInitializer.as new file mode 100644 index 000000000..90e892ccf --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestScriptInitializer.as @@ -0,0 +1,61 @@ + +package tests_classes +{ + public class TestScriptInitializer + { + private static var sa:int = 5; + + if (Math.random() * 10 >= 5) { + sa += 100; + } else { + sa += 200; + } + + private static const sc:int = Math.floor(Math.random() * 50) + sa + x; + + private static var sb:int = sa + 20; + if (sb > 100) { + sb += 10; + } else { + sb += 20; + } + + private static var sv:int; + + for each (sv in [1,3,5]) + { + trace(sv); + } + + public function test() : void { + const x:int = 5; + } + } + //TestImports; +} + +var x:int = Math.random() * 100; + +var a:int = 5; +if (Math.random() * 10 >= 5) { + a += 100; +} else { + a += 200; +} + +const c:int = Math.floor(Math.random() * 50) + a; + +var b:int = a + 20; +if (b > 100) { + b += 10; +} else { + b += 20; +} + +var v:int; + +for each (v in [1,3,5]) +{ + trace(v); +} + diff --git a/libsrc/ffdec_lib/testdata/compound/bin/compound.abc b/libsrc/ffdec_lib/testdata/compound/bin/compound.abc new file mode 100644 index 0000000000000000000000000000000000000000..3c6be341dd905cb53efdcbfcef3c4fc0652e5c60 GIT binary patch literal 1097 zcmaJ%y6~AOFOKd zxq*8!xg3ll{DcD>8X2c&)0B%jxo8g-{v%xCs3x(&Je1tyQg}kjhT%!GDD8&h+0ymg zrqlG~9!G|{r5Gy46%$G;ji@Q2qd_!=yh}*e=pgACrO-c7h&J;)>cNQpcQJ0{I6=a1f zY6r?`T1tlsFu(#Em{X|H3)KNRG=Onv0_Wg?;IIdh!#)@sT%kl&nDQVUbqE#*(<~bR z1rr4wCP*x36TmHlj2K0V%qS59DuBp1Uv*yqWyD*jEKfP2kjARJIsxK{ydifQM&3|6 z4U-PwZ&uwv-aCUB10%q5?55!iTQLh%Ub9xr12eCAD;9zF!G|xg6%>3-lVV^W#U-+$ z>FU|qu9Xijq{G)}amR<9b4odGo8qEGMtFNI=R-#wN7qy#E@&95!C$F^BUgXWm26* hE1YOLpq`Gh=zs@5XoB_KWVd$?{k;Ex-(H#s@CQ$4vl0LR literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/compound/bin/compound.cpp b/libsrc/ffdec_lib/testdata/compound/bin/compound.cpp new file mode 100644 index 000000000..86b8f638b --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/bin/compound.cpp @@ -0,0 +1,74 @@ +const int compound_abc_length = 1097; +const int compound_abc_method_count = 0; +const int compound_abc_class_count = 6; +const int compound_abc_script_count = 2; +const unsigned char compound_abc_data[1097] = { +0x10, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x1c, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x00, +0x06, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x03, 0x69, 0x6e, 0x74, 0x12, 0x5f, 0x5f, 0x41, 0x53, +0x33, 0x5f, 0x5f, 0x2e, 0x76, 0x65, 0x63, 0x3a, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x0b, 0x5f, +0x5f, 0x41, 0x53, 0x33, 0x5f, 0x5f, 0x2e, 0x76, 0x65, 0x63, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, +0x72, 0x03, 0x4e, 0x61, 0x4e, 0x08, 0x49, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x09, 0x75, +0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x03, 0x41, 0x53, 0x33, 0x21, 0x68, 0x74, 0x74, +0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x53, +0x33, 0x2f, 0x32, 0x30, 0x30, 0x36, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x0d, 0x6d, +0x79, 0x70, 0x6b, 0x67, 0x3a, 0x4d, 0x79, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x04, 0x76, 0x6f, 0x69, +0x64, 0x04, 0x74, 0x65, 0x73, 0x74, 0x05, 0x6d, 0x79, 0x70, 0x6b, 0x67, 0x07, 0x4d, 0x79, 0x43, +0x6c, 0x61, 0x73, 0x73, 0x0e, 0x6d, 0x79, 0x70, 0x6b, 0x67, 0x3a, 0x4d, 0x79, 0x43, 0x6c, 0x61, +0x73, 0x73, 0x32, 0x08, 0x4d, 0x79, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x05, 0x74, 0x72, 0x61, +0x63, 0x65, 0x01, 0x78, 0x01, 0x61, 0x01, 0x62, 0x06, 0x6d, 0x79, 0x70, 0x6b, 0x67, 0x32, 0x0d, +0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x61, 0x73, 0x24, 0x31, 0x01, 0x79, 0x01, +0x63, 0x14, 0x05, 0x01, 0x16, 0x02, 0x18, 0x01, 0x05, 0x03, 0x18, 0x03, 0x05, 0x04, 0x18, 0x04, +0x05, 0x05, 0x16, 0x06, 0x18, 0x05, 0x08, 0x0c, 0x05, 0x0d, 0x16, 0x10, 0x18, 0x0d, 0x05, 0x12, +0x18, 0x12, 0x17, 0x10, 0x17, 0x18, 0x05, 0x19, 0x03, 0x01, 0x02, 0x01, 0x09, 0x1d, 0x07, 0x02, +0x01, 0x07, 0x02, 0x03, 0x07, 0x02, 0x04, 0x07, 0x09, 0x07, 0x09, 0x01, 0x01, 0x09, 0x03, 0x01, +0x09, 0x04, 0x01, 0x09, 0x07, 0x02, 0x09, 0x08, 0x01, 0x07, 0x02, 0x08, 0x09, 0x09, 0x01, 0x07, +0x02, 0x09, 0x09, 0x0a, 0x01, 0x07, 0x02, 0x0a, 0x07, 0x02, 0x0b, 0x07, 0x02, 0x0e, 0x07, 0x02, +0x0f, 0x07, 0x0d, 0x11, 0x07, 0x0d, 0x13, 0x07, 0x02, 0x14, 0x07, 0x11, 0x15, 0x07, 0x11, 0x16, +0x07, 0x11, 0x17, 0x07, 0x12, 0x15, 0x07, 0x12, 0x16, 0x07, 0x12, 0x17, 0x07, 0x13, 0x1a, 0x07, +0x13, 0x1b, 0x11, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, +0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, 0x09, 0x03, 0x00, 0x01, +0x00, 0x02, 0x01, 0x09, 0x05, 0x00, 0x03, 0x00, 0x03, 0x01, 0x09, 0x07, 0x00, 0x05, 0x00, 0x04, +0x01, 0x09, 0x0a, 0x00, 0x07, 0x00, 0x12, 0x01, 0x09, 0x0e, 0x00, 0x0c, 0x01, 0x11, 0x01, 0x02, +0x0b, 0x13, 0x01, 0x09, 0x10, 0x00, 0x0f, 0x01, 0x11, 0x01, 0x02, 0x0e, 0x00, 0x00, 0x02, 0x00, +0x04, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x02, 0x10, 0x0b, 0x14, 0x01, 0x01, 0x09, 0x15, +0x00, 0x01, 0x03, 0x00, 0x16, 0x00, 0x02, 0x03, 0x00, 0x17, 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, +0x04, 0x03, 0x00, 0x19, 0x00, 0x05, 0x03, 0x00, 0x1a, 0x00, 0x06, 0x03, 0x00, 0x12, 0x04, 0x07, +0x04, 0x13, 0x04, 0x08, 0x05, 0x1b, 0x00, 0x09, 0x03, 0x00, 0x1c, 0x00, 0x0a, 0x03, 0x00, 0x08, +0x08, 0x0f, 0x06, 0x00, 0x00, 0x0b, 0x08, 0x01, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x01, 0x03, +0x04, 0x00, 0x02, 0x04, 0x04, 0x00, 0x03, 0x0a, 0x06, 0x00, 0x02, 0x01, 0x06, 0x0c, 0x06, 0x00, +0x02, 0x02, 0x06, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0xd0, +0x30, 0x47, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x04, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x02, +0x01, 0x01, 0x03, 0x04, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x03, 0x01, 0x01, 0x04, 0x05, 0x06, +0xd0, 0x30, 0xd0, 0x49, 0x00, 0x47, 0x00, 0x00, 0x04, 0x01, 0x01, 0x03, 0x04, 0x03, 0xd0, 0x30, +0x47, 0x00, 0x00, 0x05, 0x01, 0x01, 0x04, 0x05, 0x06, 0xd0, 0x30, 0xd0, 0x49, 0x00, 0x47, 0x00, +0x00, 0x06, 0x01, 0x01, 0x03, 0x04, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x07, 0x01, 0x01, 0x04, +0x05, 0x06, 0xd0, 0x30, 0xd0, 0x49, 0x00, 0x47, 0x00, 0x00, 0x08, 0x03, 0x01, 0x01, 0x03, 0x51, +0xd0, 0x30, 0x5d, 0x05, 0x20, 0x58, 0x00, 0x68, 0x01, 0x5d, 0x06, 0x5d, 0x01, 0x66, 0x01, 0x30, +0x5d, 0x01, 0x66, 0x01, 0x58, 0x01, 0x1d, 0x68, 0x02, 0x5d, 0x07, 0x5d, 0x01, 0x66, 0x01, 0x30, +0x5d, 0x01, 0x66, 0x01, 0x58, 0x02, 0x1d, 0x68, 0x03, 0x5d, 0x08, 0x5d, 0x01, 0x66, 0x01, 0x30, +0x5d, 0x01, 0x66, 0x01, 0x58, 0x03, 0x1d, 0x68, 0x04, 0x5d, 0x09, 0x24, 0x00, 0x24, 0x00, 0xa3, +0x68, 0x0a, 0x5d, 0x0b, 0x24, 0x01, 0x24, 0x00, 0xa3, 0x68, 0x0c, 0x5d, 0x0d, 0x21, 0x68, 0x0e, +0x47, 0x00, 0x00, 0x09, 0x01, 0x02, 0x01, 0x02, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x0a, 0x01, +0x01, 0x03, 0x04, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x0b, 0x01, 0x01, 0x04, 0x05, 0x03, 0xd0, +0x30, 0x47, 0x00, 0x00, 0x0c, 0x01, 0x01, 0x04, 0x05, 0x06, 0xd0, 0x30, 0xd0, 0x49, 0x00, 0x47, +0x00, 0x00, 0x0d, 0x01, 0x01, 0x03, 0x04, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x0e, 0x01, 0x01, +0x04, 0x05, 0x03, 0xd0, 0x30, 0x47, 0x00, 0x00, 0x0f, 0x01, 0x01, 0x04, 0x05, 0x06, 0xd0, 0x30, +0xd0, 0x49, 0x00, 0x47, 0x00, 0x00, 0x10, 0x02, 0x03, 0x01, 0x03, 0xda, 0x01, 0xd0, 0x30, 0x65, +0x00, 0x5d, 0x01, 0x66, 0x01, 0x30, 0x5d, 0x01, 0x66, 0x01, 0x58, 0x04, 0x1d, 0x68, 0x12, 0x65, +0x00, 0x5d, 0x01, 0x66, 0x01, 0x30, 0x5d, 0x01, 0x66, 0x01, 0x58, 0x05, 0x1d, 0x68, 0x13, 0x24, +0x07, 0x64, 0x2b, 0x6d, 0x01, 0x24, 0x01, 0x64, 0x2b, 0x6d, 0x02, 0x64, 0x6c, 0x01, 0x24, 0x05, +0x0f, 0x0e, 0x00, 0x00, 0x64, 0x6c, 0x02, 0x24, 0x64, 0xa0, 0x64, 0x2b, 0x6d, 0x02, 0x10, 0x0b, +0x00, 0x00, 0x64, 0x6c, 0x02, 0x25, 0xc8, 0x01, 0xa0, 0x64, 0x2b, 0x6d, 0x02, 0x64, 0x6c, 0x02, +0x24, 0x0a, 0xa0, 0x64, 0x2b, 0x6d, 0x03, 0x24, 0x07, 0x64, 0x2b, 0x6d, 0x04, 0x24, 0x01, 0x64, +0x2b, 0x6d, 0x05, 0x64, 0x6c, 0x04, 0x24, 0x05, 0x0f, 0x0e, 0x00, 0x00, 0x64, 0x6c, 0x05, 0x24, +0x64, 0xa0, 0x64, 0x2b, 0x6d, 0x05, 0x10, 0x0b, 0x00, 0x00, 0x64, 0x6c, 0x05, 0x25, 0xc8, 0x01, +0xa0, 0x64, 0x2b, 0x6d, 0x05, 0x64, 0x6c, 0x05, 0x24, 0x0a, 0xa0, 0x64, 0x2b, 0x6d, 0x06, 0x5d, +0x14, 0x24, 0x1d, 0x46, 0x14, 0x01, 0x82, 0xd5, 0x24, 0x01, 0x64, 0x2b, 0x6d, 0x09, 0x24, 0x01, +0x64, 0x2b, 0x6d, 0x0a, 0x64, 0x6c, 0x09, 0x24, 0x05, 0x0f, 0x15, 0x00, 0x00, 0x64, 0x6c, 0x0a, +0x24, 0x64, 0xa0, 0x2a, 0xd6, 0x64, 0x2b, 0x6d, 0x0a, 0xd2, 0x08, 0x02, 0x82, 0xd5, 0x10, 0x11, +0x00, 0x00, 0x64, 0x6c, 0x0a, 0x24, 0x64, 0xa0, 0x2a, 0xd6, 0x64, 0x2b, 0x6d, 0x0a, 0xd2, 0x08, +0x02, 0x82, 0xd5, 0xd1, 0x48, 0x08, 0x01, 0x00, 0x00 }; diff --git a/libsrc/ffdec_lib/testdata/compound/bin/compound.h b/libsrc/ffdec_lib/testdata/compound/bin/compound.h new file mode 100644 index 000000000..6ba8cdc8d --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/bin/compound.h @@ -0,0 +1,13 @@ +const int abcclass_Object = 0; +const int abcclass_Number = 1; +const int abcclass_int = 2; +const int abcclass___AS3___vec_Vector = 3; +const int abcclass_mypkg_MyClass = 4; +const int abcclass_mypkg_MyClass2 = 5; +const int abcpackage_compound_as = 0; +const int abcpackage_stubs_as = 1; +extern const int compound_abc_length; +extern const int compound_abc_method_count; +extern const int compound_abc_class_count; +extern const int compound_abc_script_count; +extern const unsigned char compound_abc_data[]; diff --git a/libsrc/ffdec_lib/testdata/compound/build_flex.bat b/libsrc/ffdec_lib/testdata/compound/build_flex.bat new file mode 100644 index 000000000..c21e6edda --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/build_flex.bat @@ -0,0 +1,2 @@ +java -cp c:\flex\lib\asc.jar macromedia.asc.embedding.ScriptCompiler -strict -builtin -outdir bin/ -out compound src/stubs.as src/compound.as>buildlog.flex.txt 2>&1 +rem call c:\flex\bin\mxmlc.bat -debug=true -output bin/compound.swf src/compound.as 1> buildlog.flex.txt 2>&1 diff --git a/libsrc/ffdec_lib/testdata/compound/src/Main.as b/libsrc/ffdec_lib/testdata/compound/src/Main.as new file mode 100644 index 000000000..25f855eb5 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/Main.as @@ -0,0 +1,27 @@ +package +{ + import flash.display.Sprite; + import flash.events.Event; + + /** + * ... + * @author Jindra + */ + public class Main extends Sprite + { + + public function Main() + { + if (stage) init(); + else addEventListener(Event.ADDED_TO_STAGE, init); + } + + private function init(e:Event = null):void + { + removeEventListener(Event.ADDED_TO_STAGE, init); + // entry point + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/compound/src/Number.as b/libsrc/ffdec_lib/testdata/compound/src/Number.as new file mode 100644 index 000000000..2982227d1 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/Number.as @@ -0,0 +1,4 @@ +package { + public class Number { + } +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/Object.as b/libsrc/ffdec_lib/testdata/compound/src/Object.as new file mode 100644 index 000000000..66e32ec59 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/Object.as @@ -0,0 +1,6 @@ +package +{ + public class Object + { + } +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/Toplevel.as b/libsrc/ffdec_lib/testdata/compound/src/Toplevel.as new file mode 100644 index 000000000..379bc0240 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/Toplevel.as @@ -0,0 +1,9 @@ +package { + public namespace AS3 = "http://adobe.com/AS3/2006/builtin"; + + public const NaN: Number = 0 / 0; + + public const Infinity: Number = 1 / 0; + + public const undefined = void 0; +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/__AS3__/vec/Vector.as b/libsrc/ffdec_lib/testdata/compound/src/__AS3__/vec/Vector.as new file mode 100644 index 000000000..645459d7a --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/__AS3__/vec/Vector.as @@ -0,0 +1,5 @@ +package __AS3__.vec { + + public class Vector { + } +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/compound.as b/libsrc/ffdec_lib/testdata/compound/src/compound.as new file mode 100644 index 000000000..192c01c17 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/compound.as @@ -0,0 +1,43 @@ +package { + public function trace(s:int) { + //print something + } +} + +package mypkg { + var x:int = 7; + var a:int = 1; + if (x >= 5) { + a += 100; + } else { + a += 200; + } + var b:int = a + 10; +} + +package mypkg2 { + var x:int = 7; + var a:int = 1; + if (x >= 5) { + a += 100; + } else { + a += 200; + } + var b:int = a + 10; +} + +package mypkg3 { + trace(29); +} + +include "mypkg/MyClass.as" +include "mypkg/MyClass2.as" + +var y:int = 1; +var c:int = 1; +if (y >= 5) { + c += 100; +} else { + c += 100; +} + diff --git a/libsrc/ffdec_lib/testdata/compound/src/int.as b/libsrc/ffdec_lib/testdata/compound/src/int.as new file mode 100644 index 000000000..8fd30a041 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/int.as @@ -0,0 +1,4 @@ +package { + public class int { + } +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass.as b/libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass.as new file mode 100644 index 000000000..0d99015df --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass.as @@ -0,0 +1,10 @@ +package mypkg +{ + public class MyClass + { + public function test(): void + { + } + } + +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass2.as b/libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass2.as new file mode 100644 index 000000000..2b2cfa7d1 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/mypkg/MyClass2.as @@ -0,0 +1,10 @@ +package mypkg +{ + public class MyClass2 + { + public function test(): void + { + } + } + +} diff --git a/libsrc/ffdec_lib/testdata/compound/src/stubs.as b/libsrc/ffdec_lib/testdata/compound/src/stubs.as new file mode 100644 index 000000000..fe562d45e --- /dev/null +++ b/libsrc/ffdec_lib/testdata/compound/src/stubs.as @@ -0,0 +1,5 @@ +include "Object.as" +include "Number.as" +include "int.as" +include "__AS3__/vec/Vector.as" +include "TopLevel.as"