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 000000000..cbfa8c106 Binary files /dev/null and b/libsrc/ffdec_lib/testdata/freeactionscript.com/as2/enemy-behavior-run-away-follow-player.swf differ diff --git a/libsrc/ffdec_lib/testdata/freeactionscript.com/as2/flash-game-projectile-weapons-v3.swf b/libsrc/ffdec_lib/testdata/freeactionscript.com/as2/flash-game-projectile-weapons-v3.swf new file mode 100644 index 000000000..071cfa654 Binary files /dev/null and b/libsrc/ffdec_lib/testdata/freeactionscript.com/as2/flash-game-projectile-weapons-v3.swf differ 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 000000000..0ff683c4a Binary files /dev/null and b/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/pixel.swf differ 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 000000000..8845df6cf Binary files /dev/null and b/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/space.swf differ 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 000000000..bfa92c0f2 Binary files /dev/null and b/libsrc/ffdec_lib/testdata/freeactionscript.com/as3/weaponsystem.swf differ diff --git a/libsrc/ffdec_lib/testdata/freeactionscript.com/readme.txt b/libsrc/ffdec_lib/testdata/freeactionscript.com/readme.txt new file mode 100644 index 000000000..668bfcd69 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/freeactionscript.com/readme.txt @@ -0,0 +1,2 @@ +These are sample AS2 and AS3 projects from +http://www.freeactionscript.com/ \ No newline at end of file