From b750780cd909d51279f9b0a8d15b74a943e47459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 14 Aug 2016 23:25:46 +0200 Subject: [PATCH] Export subclasses stubs to be compiled by Flex too. WIP: merging ABCs Test data (flexedit) with simple class hierarchy --- .../com/jpexs/decompiler/flash/abc/ABC.java | 48 +++++++ .../decompiler/flash/abc/ScriptPack.java | 14 +- .../flash/abc/avm2/AVM2ConstantPool.java | 122 ++++++++++++++++++ .../flash/abc/types/MethodInfo.java | 13 ++ .../flash/abc/types/traits/TraitClass.java | 24 ++-- .../types/traits/TraitMethodGetterSetter.java | 35 ++++- .../abc/types/traits/TraitSlotConst.java | 11 +- .../exporters/modes/ScriptExportMode.java | 2 +- .../settings/ScriptExportSettings.java | 1 + .../flash/flexsdk/As3ScriptReplacer.java | 23 +++- libsrc/ffdec_lib/testdata/as3/as3.swf | Bin 109671 -> 109834 bytes libsrc/ffdec_lib/testdata/flexedit/Main.as | 24 ++++ libsrc/ffdec_lib/testdata/flexedit/Main.fla | Bin 0 -> 4425 bytes libsrc/ffdec_lib/testdata/flexedit/Main.html | 49 +++++++ libsrc/ffdec_lib/testdata/flexedit/Main.swf | Bin 0 -> 1176 bytes .../testdata/flexedit/pkg/MyClass.as | 17 +++ .../testdata/flexedit/pkg/ParentClass.as | 11 ++ .../flexedit/pkg/ParentParentClass.as | 22 ++++ 18 files changed, 388 insertions(+), 28 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/flexedit/Main.as create mode 100644 libsrc/ffdec_lib/testdata/flexedit/Main.fla create mode 100644 libsrc/ffdec_lib/testdata/flexedit/Main.html create mode 100644 libsrc/ffdec_lib/testdata/flexedit/Main.swf create mode 100644 libsrc/ffdec_lib/testdata/flexedit/pkg/MyClass.as create mode 100644 libsrc/ffdec_lib/testdata/flexedit/pkg/ParentClass.as create mode 100644 libsrc/ffdec_lib/testdata/flexedit/pkg/ParentParentClass.as diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java index d5bbfe1c7..034f30aac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -37,6 +37,7 @@ import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.types.NamespaceSet; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; +import com.jpexs.decompiler.flash.abc.types.ValueKind; 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.TraitFunction; @@ -1451,4 +1452,51 @@ public class ABC { getSwf().clearScriptCache(); getMethodIndexing(); } + + public void mergeABC(ABC secondABC) { + Map namespaceMap = new HashMap<>(); + Map namespaceSetMap = new HashMap<>(); + Map multinameMap = new HashMap<>(); + Map methodInfoMap = new HashMap<>(); + + constants.merge(secondABC.constants, namespaceMap, namespaceSetMap, multinameMap); + for (int i = 0; i < secondABC.method_info.size(); i++) { + MethodInfo secondMethodInfo = secondABC.method_info.get(i); + int newParamTypes[] = new int[secondMethodInfo.param_types.length]; + int newParamNames[] = new int[secondMethodInfo.paramNames.length]; + int newRetType = multinameMap.get(secondMethodInfo.ret_type); + int newNameIndex = constants.getStringId(secondABC.constants.getString(secondMethodInfo.name_index), true); + ValueKind newOptional[] = new ValueKind[secondMethodInfo.optional.length]; + for (int k = 0; k < secondMethodInfo.optional.length; k++) { + int vkind = secondMethodInfo.optional[k].value_kind; + int newValueIndex; + switch (vkind) { + case ValueKind.CONSTANT_ExplicitNamespace: + case ValueKind.CONSTANT_Namespace: + case ValueKind.CONSTANT_PackageInternalNs: + case ValueKind.CONSTANT_PackageNamespace: + case ValueKind.CONSTANT_ProtectedNamespace: + case ValueKind.CONSTANT_PrivateNs: + case ValueKind.CONSTANT_StaticProtectedNs: + newValueIndex = namespaceMap.get(secondMethodInfo.optional[k].value_index); + break; + default: + newValueIndex = secondMethodInfo.optional[k].value_index; + } + newOptional[k] = new ValueKind(newValueIndex, vkind); + } + + MethodInfo newMethodInfo = new MethodInfo(newParamTypes, newRetType, newNameIndex, secondMethodInfo.flags, newOptional, newParamNames); + int newIndex = addMethodInfo(newMethodInfo); + methodInfoMap.put(i, newIndex); + } + for (MethodBody secondBody : secondABC.bodies) { + //TODO!!! + //MethodBody newBody = new MethodBody(this, mergeTraits(secondBody.traits), codeBytes, exceptions) + } + } + + private Traits mergeTraits(Traits secondTraits) { + return null; //TODO + } } 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 517152c1f..55317afe1 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 @@ -200,12 +200,14 @@ public class ScriptPack extends AS3ClassTreeItem { //TODO: handle this better in GUI(?) writer.startTrait(GraphTextWriter.TRAIT_SCRIPT_INITIALIZER); writer.startMethod(script_init); - if (!scriptInitializerIsEmpty) { - writer.startBlock(); - abc.bodies.get(bodyIndex).toString(path +/*packageName +*/ "/.scriptinitializer", exportMode, abc, null, writer, new ArrayList<>()); - writer.endBlock(); - } else { - writer.append(" "); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + if (!scriptInitializerIsEmpty) { + writer.startBlock(); + abc.bodies.get(bodyIndex).toString(path +/*packageName +*/ "/.scriptinitializer", exportMode, abc, null, writer, new ArrayList<>()); + writer.endBlock(); + } else { + writer.append(" "); + } } writer.endMethod(); writer.endTrait(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java index 1303e51f5..50ad462fc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java @@ -377,6 +377,14 @@ public class AVM2ConstantPool implements Cloneable { return null; } + public int getDecimalId(Decimal val, boolean add) { + int id = getDecimalId(val); + if (add && id == -1) { + id = addDecimal(val); + } + return id; + } + public Float getFloat(int index) { try { return constant_float.get(index); @@ -514,6 +522,10 @@ public class AVM2ConstantPool implements Cloneable { return constant_float4.indexOf(value); } + private int getDecimalId(Decimal value) { + return constant_decimal.indexOf(value); + } + private int getStringId(String value) { return constant_string.indexOf(value); } @@ -755,4 +767,114 @@ public class AVM2ConstantPool implements Cloneable { } return null; } + + /** + * Merges second constantpool into this one + * + * @param secondPool + * @param namespaceMap Output map of merged namespaces. Index in second pool + * to index in this pool. + * @param namespaceSetMap Output map of merged namespace sets. Index in + * second pool to index in this pool. + * @param multinameMap Output map of merged multinames. Index in second pool + * to index in this pool. + */ + public void merge(AVM2ConstantPool secondPool, Map namespaceMap, Map namespaceSetMap, Map multinameMap) { + for (String val : secondPool.constant_string) { + getStringId(val, true); + } + for (Long val : secondPool.constant_int) { + getIntId(val, true); + } + for (Long val : secondPool.constant_uint) { + getUIntId(val, true); + } + for (Double val : secondPool.constant_double) { + getDoubleId(val, true); + } + for (Float val : secondPool.constant_float) { + getFloatId(val, true); + } + for (Float4 val : secondPool.constant_float4) { + getFloat4Id(val, true); + } + for (Decimal val : secondPool.constant_decimal) { + getDecimalId(val, true); + } + namespaceMap.put(0, 0); + for (int i = 1; i < secondPool.constant_namespace.size(); i++) { + Namespace secondNamespace = secondPool.getNamespace(i); + String secondNsNameStr = secondNamespace.name_index == 0 ? null : secondPool.getString(secondNamespace.name_index); + int mappedId; + if (secondNamespace.kind == Namespace.KIND_PRIVATE) {//always add, this does not exists in this ABC. Conflicting private namespaces can have same names. + mappedId = addNamespace(secondNamespace.kind, getStringId(secondNsNameStr, true)); + } else { + mappedId = getNamespaceId(secondNamespace.kind, secondNsNameStr, 0, true); + } + namespaceMap.put(i, mappedId); + } + namespaceSetMap.put(0, 0); + for (int i = 1; i < secondPool.constant_namespace_set.size(); i++) { + NamespaceSet secondNamespaceSet = secondPool.getNamespaceSet(i); + int mappedsNss[] = new int[secondNamespaceSet.namespaces.length]; + for (int n = 0; n < secondNamespaceSet.namespaces.length; n++) { + mappedsNss[n] = namespaceMap.get(secondNamespaceSet.namespaces[n]); + } + int mappedId = getNamespaceSetId(mappedsNss, true); + namespaceSetMap.put(i, mappedId); + } + multinameMap.put(0, 0); + for (int i = 1; i < secondPool.constant_multiname.size(); i++) { + Multiname secondMultiname = secondPool.getMultiname(i); + Multiname importedMultiname = null; + int newNameIndex = secondMultiname.name_index <= 0 ? secondMultiname.name_index : getStringId(secondPool.getString(secondMultiname.name_index), true); + int newNsIndex = secondMultiname.namespace_index <= 0 ? secondMultiname.namespace_index : namespaceMap.get(secondMultiname.namespace_index); + int newNssIndex = secondMultiname.namespace_set_index <= 0 ? secondMultiname.namespace_set_index : namespaceSetMap.get(secondMultiname.namespace_set_index); + + switch (secondMultiname.kind) { + case Multiname.MULTINAME: + importedMultiname = Multiname.createMultiname(false, newNameIndex, newNssIndex); + break; + case Multiname.MULTINAMEA: + importedMultiname = Multiname.createMultiname(true, newNameIndex, newNssIndex); + break; + case Multiname.MULTINAMEL: + importedMultiname = Multiname.createMultinameL(false, newNssIndex); + break; + case Multiname.MULTINAMELA: + importedMultiname = Multiname.createMultinameL(true, newNssIndex); + break; + case Multiname.QNAME: + importedMultiname = Multiname.createQName(false, newNameIndex, newNsIndex); + break; + case Multiname.QNAMEA: + importedMultiname = Multiname.createQName(true, newNameIndex, newNsIndex); + break; + case Multiname.RTQNAME: + importedMultiname = Multiname.createRTQName(false, newNameIndex); + break; + case Multiname.RTQNAMEA: + importedMultiname = Multiname.createRTQName(true, newNameIndex); + break; + case Multiname.RTQNAMEL: + importedMultiname = Multiname.createRTQNameL(false); + break; + case Multiname.RTQNAMELA: + importedMultiname = Multiname.createRTQNameL(true); + break; + case Multiname.TYPENAME: + int newQnameIndex = multinameMap.get(secondMultiname.qname_index); + int newParams[] = new int[secondMultiname.params.length]; + for (int p = 0; p < secondMultiname.params.length; p++) { + newParams[p] = multinameMap.get(secondMultiname.params[p]); + } + importedMultiname = Multiname.createTypeName(newQnameIndex, newParams); + break; + } + + int mappedId = getMultinameId(importedMultiname, true); + multinameMap.put(i, mappedId); + } + + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index 022b3dd2f..20f504f49 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -386,4 +386,17 @@ public class MethodInfo { } return writer.hilightSpecial(rname, HighlightSpecialType.RETURNS); } + + public String getReturnTypeRaw(AVM2ConstantPool constants, List fullyQualifiedNames) { + String rname = "*"; + if (ret_type > 0) { + Multiname multiname = constants.getMultiname(ret_type); + if (multiname.kind != Multiname.TYPENAME && multiname.name_index > 0 && constants.getString(multiname.name_index).equals("void")) { + rname = "void"; + } else { + rname = multiname.getName(constants, fullyQualifiedNames, false); + } + } + return rname; + } } 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 2eea9627c..f21028ecc 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 @@ -131,14 +131,16 @@ public class TraitClass extends Trait implements TraitWithSlot { if (bodyIndex != -1) { writer.startTrait(GraphTextWriter.TRAIT_CLASS_INITIALIZER); writer.startMethod(classInfo.cinit_index); - if (!classInitializerIsEmpty) { - writer.startBlock(); - abc.bodies.get(bodyIndex).toString(path +/*packageName +*/ "/" + instanceInfoName + ".staticinitializer", exportMode, abc, this, writer, fullyQualifiedNames); - 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(?) - writer.append(" ").newLine(); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + if (!classInitializerIsEmpty) { + writer.startBlock(); + abc.bodies.get(bodyIndex).toString(path +/*packageName +*/ "/" + instanceInfoName + ".staticinitializer", exportMode, abc, this, writer, fullyQualifiedNames); + 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(?) + writer.append(" ").newLine(); + } } writer.endMethod(); writer.endTrait(); @@ -178,8 +180,10 @@ public class TraitClass extends Trait implements TraitWithSlot { MethodBody body = bodyIndex == -1 ? null : abc.bodies.get(bodyIndex); abc.method_info.get(instanceInfo.iinit_index).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames); writer.appendNoHilight(")").startBlock(); - if (body != null) { - body.toString(path +/*packageName +*/ "/" + instanceInfoName + ".initializer", exportMode, abc, this, writer, fullyQualifiedNames); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + if (body != null) { + body.toString(path +/*packageName +*/ "/" + instanceInfoName + ".initializer", exportMode, abc, this, writer, fullyQualifiedNames); + } } writer.endBlock().newLine(); 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 8b24560a3..1ed3656a0 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 @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.exporters.script.Dependency; import com.jpexs.decompiler.flash.exporters.script.DependencyParser; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; +import com.jpexs.decompiler.flash.helpers.hilight.HighlightData; import com.jpexs.decompiler.flash.helpers.hilight.HighlightSpecialType; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.ScopeStack; @@ -112,9 +113,11 @@ public class TraitMethodGetterSetter extends Trait { path = path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames, false); convertHeader(parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel); int bodyIndex = abc.findBodyIndex(method_info); - if (!(classIndex != -1 && abc.instance_info.get(classIndex).isInterface() || bodyIndex == -1)) { - if (bodyIndex != -1) { - abc.bodies.get(bodyIndex).convert(convertData, path, exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, new ScopeStack(), 0, writer, fullyQualifiedNames, null, true); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + if (!(classIndex != -1 && abc.instance_info.get(classIndex).isInterface() || bodyIndex == -1)) { + if (bodyIndex != -1) { + abc.bodies.get(bodyIndex).convert(convertData, path, exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, new ScopeStack(), 0, writer, fullyQualifiedNames, null, true); + } } } writer.endMethod(); @@ -135,8 +138,30 @@ public class TraitMethodGetterSetter extends Trait { writer.appendNoHilight(";"); } else { writer.startBlock(); - if (bodyIndex != -1) { - abc.bodies.get(bodyIndex).toString(path, exportMode, abc, this, writer, fullyQualifiedNames); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + if (bodyIndex != -1) { + abc.bodies.get(bodyIndex).toString(path, exportMode, abc, this, writer, fullyQualifiedNames); + } + } else { + String retTypeRaw = abc.method_info.get(method_info).getReturnTypeRaw(abc.constants, fullyQualifiedNames); + switch (retTypeRaw) { + case "void": + break; + case "int": + case "uint": + writer.append("return 0; //autogenerated").newLine(); + break; + case "double": + case "float": + writer.append("return 0.0; //autogenerated").newLine(); + break; + case "String": + writer.append("return \"\"; //autogenerated").newLine(); + break; + default: + writer.append("return null; //autogenerated").newLine(); + break; + } } writer.endBlock(); } 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 2ee16f80f..29337bd30 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 @@ -106,7 +106,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { return writer; } - public void getValueStr(Trait parent, ConvertData convertData, GraphTextWriter writer, ABC abc, List fullyQualifiedNames) throws InterruptedException { + public void getValueStr(ScriptExportMode exportMode, Trait parent, ConvertData convertData, GraphTextWriter writer, ABC abc, List fullyQualifiedNames) throws InterruptedException { if (convertData.assignedValues.containsKey(this)) { AssignedValue assignment = convertData.assignedValues.get(this); @@ -119,8 +119,9 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { writer.appendNoHilight(assignment.method); writer.newLine(); } - - assignment.value.toString(writer, LocalData.create(abc.constants, new HashMap<>(), fullyQualifiedNames)); + if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { + assignment.value.toString(writer, LocalData.create(abc.constants, new HashMap<>(), fullyQualifiedNames)); + } writer.endMethod(); writer.endTrait(); return; @@ -165,7 +166,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { getNameStr(writer, abc, fullyQualifiedNames); if (value_kind != 0 || convertData.assignedValues.containsKey(this)) { writer.appendNoHilight(" = "); - getValueStr(parent, convertData, writer, abc, fullyQualifiedNames); + getValueStr(exportMode, parent, convertData, writer, abc, fullyQualifiedNames); } return writer.appendNoHilight(";").newLine(); } @@ -174,7 +175,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { public void convert(Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) throws InterruptedException { getNameStr(writer, abc, fullyQualifiedNames); if (value_kind != 0 || convertData.assignedValues.containsKey(this)) { - getValueStr(parent, convertData, writer, abc, fullyQualifiedNames); + getValueStr(exportMode, parent, convertData, writer, abc, fullyQualifiedNames); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ScriptExportMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ScriptExportMode.java index c89b0bc12..943310a33 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ScriptExportMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ScriptExportMode.java @@ -22,5 +22,5 @@ package com.jpexs.decompiler.flash.exporters.modes; */ public enum ScriptExportMode { - AS, PCODE, PCODE_HEX, HEX, CONSTANTS; + AS, PCODE, PCODE_HEX, HEX, CONSTANTS, AS_METHOD_STUBS; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/settings/ScriptExportSettings.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/settings/ScriptExportSettings.java index 3f2c8386b..d6f1b4aab 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/settings/ScriptExportSettings.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/settings/ScriptExportSettings.java @@ -41,6 +41,7 @@ public class ScriptExportSettings { public String getFileExtension() { switch (mode) { case AS: + case AS_METHOD_STUBS: return ".as"; case PCODE: case PCODE_HEX: diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java index a786965da..809d8e96f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java @@ -6,7 +6,10 @@ import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.exporters.script.AS3ScriptExporter; import com.jpexs.decompiler.flash.exporters.script.LinkReportExporter; +import com.jpexs.decompiler.flash.exporters.settings.ScriptExportSettings; import com.jpexs.decompiler.flash.exporters.swf.SwfToSwcExporter; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; @@ -112,21 +115,38 @@ public class As3ScriptReplacer extends MxmlcRunner { } } - //remove all subclasses + List removedPacks = new ArrayList<>(); + + //remove all subclasses from the SWC for (ScriptPack sp : copyPacks) { DottedChain dc = sp.getPathPackage().add(sp.getPathScriptName()); if (isParentDeleted(sp.abc, sp.allABCs, dc)) { sp.abc.script_info.get(sp.scriptIndex).delete(sp.abc, true); modAbcs.add(sp.abc); + removedPacks.add(sp); } } + + //Export subclasses so they can be compiled by Flex, but ONLY STUBS. + //No method code to avoid code compilation problems. + //This compiled code won't be used at all in original SWF, + //it is used only by Flex to properly compile current script + AS3ScriptExporter ex = new AS3ScriptExporter(); + ex.exportActionScript3(swfCopy, null, tempDir.getAbsolutePath(), removedPacks, new ScriptExportSettings(ScriptExportMode.AS_METHOD_STUBS, false), false, null); + + //now really remove the classes from SWF copy for (ABC a : modAbcs) { a.pack(); } + //Generate SWC file from the modified SWF file. + //Flex then uses the code already present in the SWC, no need to decompile it (hurray!) SwfToSwcExporter swcExport = new SwfToSwcExporter(); swcExport.exportSwf(swfCopy, swcFile, true); + //Write new script Helper.writeFile(scriptFileToCompile.getAbsolutePath(), txt.getBytes("UTF-8")); + + //Compile it (and subclasses stubs) mxmlc("-include-inheritance-dependencies-only", "-warnings=false", "-library-path", swcFile.getAbsolutePath(), "-source-path", tempDir.getAbsolutePath(), "-output", compiledSwfFile.getAbsolutePath(), "-debug=true", scriptFileToCompile.getAbsolutePath()); try (FileInputStream fis = new FileInputStream(compiledSwfFile)) { @@ -146,6 +166,7 @@ public class As3ScriptReplacer extends MxmlcRunner { ABCContainerTag lastTag = newTags.get(newTags.size() - 1); ((Tag) lastTag).setSwf(swf); swf.addTag(oldTagIndex + 1, (Tag) lastTag); + //TODO: looks like ABCs need to be merged. Parent class needs to be defined earlier than used :-( ((Tag) lastTag).setModified(true); ((Tag) oldPack.abc.parentTag).setModified(true); } diff --git a/libsrc/ffdec_lib/testdata/as3/as3.swf b/libsrc/ffdec_lib/testdata/as3/as3.swf index 731abd8fd0ea3df58ffb9d4156a6cc54ce58d73c..3f191024a4e9af37d44a64129342d086714e1efd 100644 GIT binary patch delta 27529 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 delta 27365 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 diff --git a/libsrc/ffdec_lib/testdata/flexedit/Main.as b/libsrc/ffdec_lib/testdata/flexedit/Main.as new file mode 100644 index 000000000..ad4e8e444 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flexedit/Main.as @@ -0,0 +1,24 @@ +package { + + import flash.display.MovieClip; + import flash.text.TextField; + import pkg.MyClass; + + + public class Main extends MovieClip { + + private var mc:MyClass; + + + public function Main() { + this.mc = new MyClass(5); + var display_txt:TextField = new TextField(); + display_txt.text = "Hello myclass: "+this.mc.getVal()+" char:"+this.mc.getAChar(); + display_txt.width = 300; + addChild(display_txt); + + + } + } + +} diff --git a/libsrc/ffdec_lib/testdata/flexedit/Main.fla b/libsrc/ffdec_lib/testdata/flexedit/Main.fla new file mode 100644 index 0000000000000000000000000000000000000000..fe5d67f1e85a4bd9bfc49f47c8008695cdaf44e1 GIT binary patch literal 4425 zcmbW5byQSq7sdyWmb`<2fP{c_gQ9c^Lx^xH9$7rC?G30B{qCO8{$g zYhx#OJ7b8Qot3#E#L3*&hTX-+hz(+7YhcXgW@4rEi<|<-2n7=%yNMgQJjC4Q&ny*1 zO)XY&Ro-9I5gC7vn{+uDF%?l2E%yJ;x+yF#sV2%QqagKH8ZrjPpHp8d8Ln$W0st0K z002BhnuMafgsq{owXuy8o13*&km`s{3J1_Tqr$heVSP!YzOqmZW~Yo$k(LEU<`!WYby(qdD*-zRVfqE2En{sJzc( z5xJczEGqL-(4EoI5BezVPL3IjsRtg;46?ZDnwkbhCI<=U6_GS}l6A$Az zq7$bhjo79niqW@E zouinql}bIMruk*7v(3 zek}FS`dy?eqWGkYQ_eYBcCrni2+ z?Zwr%J^;&pq^*rvkXFXv)RFe^`B5ULmM~Po2#i+wg^=|X%NwjfV?sC~t2fG1FR@sk z!M0(5(54H z=I-he$dAnFSHMPXn>baO#PQkgU^|X*)Vle(z(;!^GSfg-H2o4Lc=`5BF6v1)f6btjw`ke2LBBh>m50#F zvQ&Sa_i#1PK$zih^N9$B+!{-i->jK4q;{X2f#S1XCTxFGU1y7@>Pffto80prhZtiD zKPxU-k~dX!tymf2=Gno{p$>66ol68M#aCFX{EiQVSvIbp>(P`~)1`#h*a_3bbn?8( zhtAwRpGpqRWF*E^M;a_oB1nDL0_U0WcpPa@EcC$p@Os?g#nRS&Mw!K0P=2uD<`Ibh zxiN5Fxo16Kc(jTSjpg!#-{xUyG z*)=j3l0;--ZS&n!IvQPp5e;_QaKRqlUT2qf=sbbK&MPAsqA2y5aVT^h$&=?haqQo9Uc}$-~WKlE5z_c7@ zAs+Gq_hXIFtK?YK$UHn`;hg0qUn9vnA0@vlnz)im+|8Au0*$v-;LLFAV&2bXh32Ek z^^eiy<8=dYsnxWZW3Xd-gZ;r6@d-FY^3|c2G5&FQYR@s+#qtj2sfekfy4duenpufx zdL)&Yc3RRkZE!VXd*?LGx*Xl=Iu(>j_~wJ{!G!ls5Ezh-E%9Eai54*9?4RlYWj_^6 z$=(&K92LO_>@RhB2#Y$_Lxhj;d= zG~dZAmD@3HaxyE)r)?mEd@6%9fvx`|B>#7O_||5^s;?;WZ7d{E^J?|8CSIpoHoL1A zi)@A5^&QZvMICZyqMl_Q%{3{!cy_P`n3GV6C6sZ+DP!~td?C)PvCx5${AfYwe9f

q?4_E}l2 z&`AtOU9Q}k_CtB9sdWKWsR_LoQcw(jT1f>sXvR2FM9wZ&nnbroU-*4H?T91W`!S1; z)^?gmT>K|q~|RLc2H>B8mF!px>K40%lhsEJ;y2bR|^m(QTjQSEdm*OZ(QtD zC-_CW0^8V<(i6(YwBf@qTV}|jj|~sR@Z;~%YpjU+8qh4Xe*lJ(9TaswR*=0?`UZN@1B(UGX4}RS~u= zjGDGnKP_Rku>kpvP~r`s#_s)jWddHs-U=&I_c1M6Qn8Cxrjh()8$LV;I_eI+u~}P` z!Fw+AkS77R%2D~Q?(d5&~8#wX$QRo5$vV)&{R>WYZj-f+f z%KFTrkoYfX9VDMZ5{@$=shU)KVrjSObordIdpvm*LNo0^O`e6u;L^Bl&PToaYE+dm ztFr!7gD5$`^EjC*BjLAlJu_+fbrE07H8_topQTvQhLf;Sm-1$t=ung)nTb;?ykxu_ z(hr3wIjnKe8`K3KIjl9Zso*Z>%RQtXGd&3ig$v1!r$7^z(62?KeSj6fZJy{H*dmZFR4C5jbXQ1YCMWzbXAg#m&Zq95#6Rj`3f*l6qu%O5dIu&3iRi6@O~?@RN!l{U6x~j z`>?*9H~KNuRq@KgW1M>H;U-iF)J@nBvr1$ZQq0S6uL2qSu)2N0f>uUyBS!*ub@S@U%qU!x{@_%8fdibA;*Y9FzH76jbmjPC z4MYCyox`RjRkRDWrzUz|wE?ALNOwIe&jaX`00FGWo7ZklP2-lZS=|R3(O5ppI}@|b zrcPJj+Dq46AC7tOBrdas#TJye*2|58B7;Y9c9&|1xszOYGf72K#2LK9R)Q|kiLKjy zIHf`%DzwP9pqE{L#{RI{SD@PCWk`|tinG@G^v;6Zj7R&*9A{le+@8g4BV|8^x`J8V z32;efMcW6o`h55dfQwxnaW!>YgfoMnfnazS1GrAxAu z$L5yut`sw&NR&RF*IHP--+iY+)F~9;mMgO;o)eLJf#w_a%*l}r`|&(dSHS^w#9@*@ z`@M7Xe&pImlKuM~k#A)AJa=%$#)EFnBZJOhkmgGn$=G!z|2_;z&Vch!TQ zyi4D32xPZrTMvFsEN2skW6P%Zr1yE-PL$-ccYRk2%gd5F%kGpb;c|>iW$e+&-RFYI z?;q=Qp`XZ2OmHa6qwBz*S2Y^6xY;kE^{?+)cJ+mC-*(*|GV~sIeU9J1>M0x8b+?u93jo5dY3p zKgGES()#y>xc}~#U!U9Wj`^vNK + + + Main + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + Get Adobe Flash player + + + + + +
+ + diff --git a/libsrc/ffdec_lib/testdata/flexedit/Main.swf b/libsrc/ffdec_lib/testdata/flexedit/Main.swf new file mode 100644 index 0000000000000000000000000000000000000000..d8f1d7414998732b02ef523de629c2e839c595fb GIT binary patch literal 1176 zcmV;J1ZVq0S5pxO2><|ioTXLWQrkup-d+8y)MCRTUxvgzm2+HYgF`SmDT87r&b>vcodZ*fy(O6~H9SuA27lIzPxy=LfZ zx5@8eCv?xU`{$oTzCo(%+6PX4nzxpDZLNP2I7z)MQ{xUFayJUW-dbX>Wg2}i7_w-C z`MzVDEEd#8m2lvhZ_d~$uk>T9*R>nq=Pn7}tlRx~!G}Zb3LQqTdH>_+aR1!r+G`$q zCxOWUzBJh|-LA3Yh7og3zSG`-iK=Z|#&)ZrZ*4cXR_l%WcB59?YOJhnH@4bqtDWU% zo%(X({rl7_wYF!T#J)|`tpA{Pi+ZKD8`#G-Y}tEMS87|$=H}Mw%CnEF-Xn3nRvy@= z-0B40FsXvif{@2fJzu=CDz+){*Rb!}^zTc!L%mY7KIet*P_NXy|6|iXN~qU`x$)`# zEv-!s!3`C)$h&v%-p=RXfW&CeDS zW(3ZsGo|<9Ef4-eY?lY}o*&o|FO+aeC}$*8&X=boRGKZ%z`ayjAQ(TPm{1~8B2g?; zLaC@wlBFa^ae>kzCDWA5(99goK2T(=5Udn1%{`>#F(pqZ`GV%Zq?xa1Mx~jrX=bsA zCJiSQCFtIk6dMWmL_|?i1cU`S22qSi1|tEBiiBjOUtL20Z% zoqqw#0f&U*SU)WGB)umcpoM`57%9f2S~A9xe62+RFU|peI>w7|9pHt90ftZ}2BsW^ z5SeBZ&iHbWg_$e{^JA5M7P96*MS2J-GZPgI*8y1oB?Z8FjFoJvR1iouXQWDp$~V$W z1rMeUXJ5{u-)H~2d|Dp&r#d-w@$}I}+{>T~Hh1~$pM*U)oWIn5I!AG? qlHPl$_sV+jk=}c(_X=