From ac7e0572c6644e08679d7a3276cc716cc44f0ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 14 Aug 2016 21:42:00 +0200 Subject: [PATCH] Add only last ABCTag when flex compiling --- .../flash/flexsdk/As3ScriptReplacer.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) 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 bbdedd249..a786965da 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 @@ -18,6 +18,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; +import java.util.ArrayList; import java.util.List; public class As3ScriptReplacer extends MxmlcRunner { @@ -99,21 +100,29 @@ public class As3ScriptReplacer extends MxmlcRunner { //Make copy without the old script SWF swfCopy = recompileSWF(swf); + List modAbcs = new ArrayList<>(); + List copyPacks = swfCopy.getAS3Packs(); for (ScriptPack sp : copyPacks) { if (sp.getClassPath().equals(oldPack.getClassPath())) { sp.abc.script_info.get(sp.scriptIndex).delete(sp.abc, true); ((Tag) sp.abc.parentTag).setModified(true); + modAbcs.add(sp.abc); break; } } + //remove all subclasses 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); } } + for (ABC a : modAbcs) { + a.pack(); + } SwfToSwcExporter swcExport = new SwfToSwcExporter(); swcExport.exportSwf(swfCopy, swcFile, true); @@ -130,18 +139,15 @@ public class As3ScriptReplacer extends MxmlcRunner { //NOO } int oldTagIndex = swf.getTags().indexOf((Tag) oldPack.abc.parentTag); - if (oldPack.abc.script_info.size() == 1) { + oldPack.abc.pack(); // removes old classes/methods/scripts + if (oldPack.abc.script_info.isEmpty()) { swf.removeTag(oldTagIndex); } - - for (ABCContainerTag act : newTags) { - ((Tag) act).setSwf(swf); - swf.addTag(oldTagIndex + 1, (Tag) act); - ((Tag) act).setModified(true); - } + ABCContainerTag lastTag = newTags.get(newTags.size() - 1); + ((Tag) lastTag).setSwf(swf); + swf.addTag(oldTagIndex + 1, (Tag) lastTag); + ((Tag) lastTag).setModified(true); ((Tag) oldPack.abc.parentTag).setModified(true); - swf.clearAbcListCache(); - swf.clearScriptCache(); } } finally { if (tempDir != null && tempDir.exists()) {