From 90ee5282d7628adfd0c5a8ef9bbc405d042323c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 7 Nov 2015 09:02:13 +0100 Subject: [PATCH] AS3 direct editation: protected namespaces fix Added sample SWF files from freeactionscript.com - tests use them --- .../abc/avm2/parser/script/AbcIndexing.java | 15 ++++++-- .../decompiler/flash/DirectEditingTest.java | 13 ++----- .../jpexs/decompiler/flash/ExportTest.java | 4 +- .../jpexs/decompiler/flash/FileTestBase.java | 35 ++++++++++++------ .../jpexs/decompiler/flash/RecompileTest.java | 4 +- .../enemy-behavior-run-away-follow-player.swf | Bin 0 -> 3383 bytes .../as2/flash-game-projectile-weapons-v3.swf | Bin 0 -> 4837 bytes .../freeactionscript.com/as3/pixel.swf | Bin 0 -> 1601 bytes .../freeactionscript.com/as3/space.swf | Bin 0 -> 1902 bytes .../freeactionscript.com/as3/weaponsystem.swf | Bin 0 -> 10769 bytes .../testdata/freeactionscript.com/readme.txt | 2 + 11 files changed, 44 insertions(+), 29 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/freeactionscript.com/as2/enemy-behavior-run-away-follow-player.swf create mode 100644 libsrc/ffdec_lib/testdata/freeactionscript.com/as2/flash-game-projectile-weapons-v3.swf create mode 100644 libsrc/ffdec_lib/testdata/freeactionscript.com/as3/pixel.swf create mode 100644 libsrc/ffdec_lib/testdata/freeactionscript.com/as3/space.swf create mode 100644 libsrc/ffdec_lib/testdata/freeactionscript.com/as3/weaponsystem.swf create mode 100644 libsrc/ffdec_lib/testdata/freeactionscript.com/readme.txt diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java index 5afd4033a..8b06e8c07 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java @@ -368,8 +368,14 @@ public class AbcIndexing { AbcIndexing.ClassIndex ci = findClass(prop.parent); if (ci != null && ci.parent != null) { ci = ci.parent; + //parent protected DottedChain parentClass = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).getNameWithNamespace(ci.abc.constants); - return findProperty(new PropertyDef(prop.propName, new TypeItem(parentClass), ci.abc, ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).namespace_index), findStatic, findInstance); + TraitIndex pti = findProperty(new PropertyDef(prop.propName, new TypeItem(parentClass), ci.abc, ci.abc.instance_info.get(ci.index).protectedNS), findStatic, findInstance); + if (pti != null) { + return pti; + } + //parent public + return findProperty(new PropertyDef(prop.propName, new TypeItem(parentClass), null, 0), findStatic, findInstance); } return null; @@ -512,7 +518,8 @@ public class AbcIndexing { ClassInfo ci = abc.class_info.get(i); ClassIndex cindex = new ClassIndex(i, abc, null); addedClasses.add(cindex); - classes.put(multinameToType(ii.name_index, abc.constants), cindex); + GraphTargetItem cname = multinameToType(ii.name_index, abc.constants); + classes.put(cname, cindex); indexTraits(abc, ii.name_index, ii.instance_traits, instanceProperties, instanceNsProperties); indexTraits(abc, ii.name_index, ci.static_traits, classProperties, classNsProperties); @@ -520,13 +527,15 @@ public class AbcIndexing { for (int i = 0; i < abc.script_info.size(); i++) { indexTraits(abc, 0, abc.script_info.get(i).traits, null, scriptProperties); } + for (ClassIndex cindex : addedClasses) { int parentClassName = abc.instance_info.get(cindex.index).super_index; if (parentClassName > 0) { TypeItem parentClass = new TypeItem(abc.constants.getMultiname(parentClassName).getNameWithNamespace(abc.constants)); ClassIndex parentClassIndex = findClass(parentClass); if (parentClassIndex == null) { - throw new RuntimeException("Parent class " + parentClass + " definition not found!"); + //Parent class can be deleted, do not check. TODO: handle this better + //throw new RuntimeException("Parent class " + parentClass + " definition not found!"); } cindex.parent = parentClassIndex; } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java index 7b1101311..8dde60a3b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java @@ -91,14 +91,7 @@ public class DirectEditingTest extends FileTestBase { System.out.println("Recompiling:" + classPathString + "..."); en.toSource(htw, abc.script_info.get(s).traits.traits, new ConvertData(), ScriptExportMode.AS, false); String original = htw.toString(); - List otherAbcs = new ArrayList<>(allAbcs); - otherAbcs.remove(abc); - ActionScript3Parser.compile(original, abc, otherAbcs, false, en.getClassPath().className + ".as", abc.instance_info.size()); - - //remove last compiled script: - ScriptInfo n = abc.script_info.remove(abc.script_info.size() - 1); - abc.script_info.set(s, n); - ((Tag) abc.parentTag).setModified(true); + abc.replaceScriptPack(en, original); } } } else { @@ -150,7 +143,7 @@ public class DirectEditingTest extends FileTestBase { } @Override - public String getTestDataDir() { - return TESTDATADIR; + public String[] getTestDataDirs() { + return new String[]{TESTDATADIR, FREE_ACTIONSCRIPT_AS2, FREE_ACTIONSCRIPT_AS3}; } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ExportTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ExportTest.java index 4e7c9ac77..469786427 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ExportTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ExportTest.java @@ -113,7 +113,7 @@ public class ExportTest extends FileTestBase { } @Override - public String getTestDataDir() { - return TESTDATADIR; + public String[] getTestDataDirs() { + return new String[]{TESTDATADIR, FREE_ACTIONSCRIPT_AS2, FREE_ACTIONSCRIPT_AS3}; } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/FileTestBase.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/FileTestBase.java index 455ee2c85..de4e1abfe 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/FileTestBase.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/FileTestBase.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash; import java.io.File; import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.List; import org.testng.annotations.DataProvider; /** @@ -26,25 +28,34 @@ import org.testng.annotations.DataProvider; */ public abstract class FileTestBase { - protected abstract String getTestDataDir(); + protected abstract String[] getTestDataDirs(); + + protected static final String FREE_ACTIONSCRIPT_AS2 = "testdata/freeactionscript.com/as2"; + protected static final String FREE_ACTIONSCRIPT_AS3 = "testdata/freeactionscript.com/as3"; @DataProvider(name = "provideFiles") public Object[][] provideFiles() { - File dir = new File(getTestDataDir()); - File[] files = new File[0]; - if (dir.exists()) { - files = dir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.toLowerCase().endsWith(".swf") && !name.toLowerCase().endsWith(".recompiled.swf"); + String[] dirs = getTestDataDirs(); + List files = new ArrayList<>(); + for (String d : dirs) { + File dir = new File(d); + if (dir.exists()) { + File[] fs = dir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".swf") && !name.toLowerCase().endsWith(".recompiled.swf"); + } + }); + for (File f : fs) { + files.add(dir.getAbsolutePath() + File.separator + f.getName()); } - }); + } } - Object[][] ret = new Object[files.length + 2][1]; + Object[][] ret = new Object[files.size() + 2][1]; ret[0][0] = "testdata/as2/as2.swf"; ret[1][0] = "testdata/as3/as3.swf"; - for (int f = 0; f < files.length; f++) { - ret[f + 2][0] = dir.getAbsolutePath() + File.separator + files[f].getName(); + for (int f = 0; f < files.size(); f++) { + ret[f + 2][0] = files.get(f); } return ret; } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/RecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/RecompileTest.java index 9dd02f93a..8ded84fd5 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/RecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/RecompileTest.java @@ -99,7 +99,7 @@ public class RecompileTest extends FileTestBase { } @Override - public String getTestDataDir() { - return TESTDATADIR; + public String[] getTestDataDirs() { + return new String[]{TESTDATADIR, FREE_ACTIONSCRIPT_AS2, FREE_ACTIONSCRIPT_AS3}; } } diff --git a/libsrc/ffdec_lib/testdata/freeactionscript.com/as2/enemy-behavior-run-away-follow-player.swf b/libsrc/ffdec_lib/testdata/freeactionscript.com/as2/enemy-behavior-run-away-follow-player.swf new file mode 100644 index 0000000000000000000000000000000000000000..cbfa8c1067261ff84890f952f94c0ccee92b8530 GIT binary patch literal 3383 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 Lft&vY4b>pDUQb)A literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/pixel.swf b/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/pixel.swf new file mode 100644 index 0000000000000000000000000000000000000000..0ff683c4a3e10f822f414d00953e7b4c8ef32d2a GIT binary patch literal 1601 zcmV-H2EO@2S5pb72><|ioP}0hY}?iqzK0TdNa|lv7DPF#_y&7bBrxpY~XKyNZkEw{^v#My*T^uR|gKB ze86u1k4+yw^68!Ahab14cOSC(i*5FmmL^XU`TBvP05Nuk*7ub>(Mce~@Q)yjJ|M8js`Fh`dbklug)BT`u zA0b1bbNdUU02{(+ix|^jeM!cE7#uOwP4`1-uX88x<+5P< zqPynvP|Vfb)tQFJxmgQr*YRtf-3k)(ZnJ6ow7$aqK^IfyK z#I1K+QMp*4%2VWCo@_ zX9ufhD5eB(yGcMRjfT$yWzh^gdtDcZzQ(s#TTPBs39cizS#r6yz3yzy;v!v#ZuQVf9i#_XdhNaeXdRH7h(;e&tH}((=Nkvy0`lS+9qK@EzL^==1gT#md#o z<>gZ4wO7=hc=e)wZ7m2~XVIZ_M{Y_>Bmi}r~Tyv};|M1ZP9mH_d=cR#gwqIT5Y8gZAyDQejFeGYK?M?}W;=~%8qZo;g9P$5eaC!Gi2KRy9dqXC$#jftWlE~Xdl^5qsA{eo z`pp@+?v`H?`+kj7*T@MUR1&>5P0ypEDA+VT-&$6ta*!D*K}3NOfT*mri|v;g^*<`n zUZmQ^rJ{j!zs^Q2h14>Ds`YkAiGZeG4DrSxBieZ07_ZDq)zKy8g2Jp(qhQF5!^U3H zh2jgwo=}`Lj~FA5Oe2p>BV;1KDEz)djb7Sq6e_!c*hr5J5i>@OA)~O6m$EdHOJk%P z17ZbYp=sm^(@4)$*lsF(!!-1SNxV$Ss8U4J$J#})$wzM<`=~p?%;SQb5acAOyXH~C zX#zL?R2+4E8&Ho(n!baI+f~`cDBq#RsR_7ko+49BB2$t~!=1*93&T)(No+*?o7&St zo1pDc_qL0iiS0R4G|m={xuPKzjX}C!htcq|1_*k3hsJt;4#clm_)p?%juT^s%W^6O literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/space.swf b/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/space.swf new file mode 100644 index 0000000000000000000000000000000000000000..8845df6cfca8c3abe127d256a41b14695dc60e64 GIT binary patch literal 1902 zcmV-!2a)(gS5pai3jhFkoP8EeP#f3zeY@Iy`y`=1gunufY)d%C7-Yc2CXNB~XS>*P zjho;Dco*r3-HzB*wJU7;Gm~bfO=sFe+sP!C9*8r!cBZEu+L<(+_R6ntzknPb9+E`*FJJ86`OOc1yZmGU`ab*q(of(0&bvSPz4g1t;_tL*!`ulg^pAPPSn|?$>+m2P~ zsMZYE9I04ty=LsNyUw=7=W146wrnpN(D*jDJy%%}N9e9$+3HHYVR@Xnp3zvec&(By zJ6j{w2IofEvmDzkH>|qHR$h>OXl2W&)lR>RajMN2HOggP;|)U))qBmY4c<_>ZEVzd z#Ieyge%EQbJXUsW5B=bcx2=k2DsG+gO1zD{#jQ=#OB%JhY0Mr|7#9AzvyFzaqxgH; z<=#B68qJz_zv0w*!?U=XLF5C&t~gu5E$_bLT0%JL3(qwh4a|ZnF5aU^xxo#O`>sct z^$Nm5#*Nnv&wS|2y>Lh~Dixm)c<|8ij2g3CUq7$Vn~qcChV65SNGKLVgq(ECMvWhj zATH#6*O$4y>6zN5vBj4irye-88gA#{(f`0zp?J=;Y8AD#@oirA;(jIPvEqhTHhH6C zJ}7=bP2RRWG>7%s<^d*ig5Hiw@sNv07VbS}>EY?2HqJQ!KZLmRyrpa_E$0Z{{L7n?K3<1sF;BsTWvYtzt|g zBO~1lK9nxR& zCTyxbVd<0jV5agXkuT5uz)7aB6s-4al=K~+>8bzg1i9?E()Lr?wQOm7M|mQqOEvv* zQn$q9tp>*TL=Vl|mF0DpLv?l^9jRRE<*Tpe#-yK_N+5in311(v)>kmZ7Yh zLJwu9D9cjTOIaUx^eB86cJm#92K zrBNyssdSmb7=>{P6Er+Y;dKgEDO{s4Md1w!*JLg#YRFGt`@F@);5B(wO`kANBl!a9J&W8x(e7brO)z$Ai_nj)l=q=7`bfOKR8z8mqR2M9d{B#{;G zqh26dpCI+)8!sFl020js37_#5oE3y~Kw^0zR}i;Bv5CJ*WC@fI5CvEWAO%{8U?u=G zChrxOFc2(ncyzD0cblw9cO>$T^!eKPR_Q#f(>3jmMog;HRz5sb_+_Z@AF1#GlzLPY zlO$AeZm-CR{#sGLP}GNt`o*F?T+~(kt&)C!nF_MX04y9BLl43c)i;JW1$D6Vuh1dk zZx#BF^spsSqP8Av%y497uef$;xW9A>*0U`$yFR#Y4z3pt%))wXBV@+b6B~+|SkLRR zy!5d?xNGLuyY+;C3%h3bdf$d>_UTzYR2|WKOQX_Sv=kLiX|fuQG*NYNxMQ&h`sMfD zx%_1#<2=Vv2bjFI%uqR0&HSOP zY=kxxBcmx=NYChf=^jGbMz2cf|BT+ZJ3PCKQJ`@qV}35~74`mPFCj?1DWdBiH2aT) z&Y`CX>XYUIk#Jii6^P9HBIl2ZTzw(35Qs!%IUJeWE4D-=EfI;>CiH9iwZ$n?_)>bd z_y#nexAu+eE&ba5;+vqypBXoNc-n_&T6)}=MO9H*3P*-eRjWFyhj)!xWNKBfqX;4b z8F8Hst}`gn5kd(pddoMa$6D2!A3ekJ7*~!kiB@$EF@;@Y64_&b>>8HiROyr`Ph7%q z<9kJ{>%3pl1+yE`2@%r2VXv6O{>_u;>u2>;b3;$L7Y-!wjb+omBLDyZ literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/weaponsystem.swf b/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/weaponsystem.swf new file mode 100644 index 0000000000000000000000000000000000000000..bfa92c0f2198157f1e9f87fd2096845845e783b2 GIT binary patch literal 10769 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