diff --git a/CHANGELOG.md b/CHANGELOG.md index e257100bc..9a778c788 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. - [#2094] AS3 Getting register names from debug info - do not allow assigning `_locX_` name to other register than X - [#2094] Embed font name taken from the fontTag, not DefineFontName - AS3 Simplify expressions - Do not convert this to {} when coerced +- AS3 incorrect private modifier on internal namespaced traits of private class inside script ## [19.0.0] - 2023-10-01 ### Added 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 976ece035..1b1da9cd8 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 @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.abc.avm2.parser.script.AbcIndexing; import com.jpexs.decompiler.flash.abc.types.ConvertData; 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.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; @@ -47,6 +48,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -402,7 +404,7 @@ public abstract class Trait implements Cloneable, Serializable { return writer; } - public final GraphTextWriter getModifiers(ABC abc, boolean isStatic, boolean insideInterface, GraphTextWriter writer) { + public final GraphTextWriter getModifiers(ABC abc, boolean isStatic, boolean insideInterface, GraphTextWriter writer, int classIndex) { if ((kindFlags & ATTR_Final) > 0) { if (!isStatic) { writer.appendNoHilight("final "); @@ -430,10 +432,41 @@ public abstract class Trait implements Cloneable, Serializable { writer.appendNoHilight(identifier).appendNoHilight(" "); } } else if (nskind != 0) { + + //Traits of private classes inside script have same namespace as the class + if (nskind == Namespace.KIND_PRIVATE) { + Set namespaceIdsThis = new HashSet<>(); + if (m.isApiVersioned(abc.constants)) { + NamespaceSet nss = m.getNamespaceSet(abc.constants); + for (int n:nss.namespaces) { + namespaceIdsThis.add(n); + } + } else { + namespaceIdsThis.add(m.namespace_index); + } + Set namespaceIdsClass = new HashSet<>(); + + Multiname mc = abc.instance_info.get(classIndex).getName(abc.constants); + if (mc.isApiVersioned(abc.constants)) { + NamespaceSet nss = mc.getNamespaceSet(abc.constants); + for (int n:nss.namespaces) { + namespaceIdsClass.add(n); + } + } else { + namespaceIdsClass.add(mc.namespace_index); + } + + for (int ns:namespaceIdsThis) { + if (namespaceIdsClass.contains(ns)) { + nskind = Namespace.KIND_PACKAGE_INTERNAL; + break; + } + } + } String nsPrefix = Namespace.getPrefix(nskind); if (nsPrefix != null && !nsPrefix.isEmpty()) { writer.appendNoHilight(nsPrefix).appendNoHilight(" "); - } + } } } if (isStatic) { 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 af3a8f6a8..4b6ffd4e5 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 @@ -68,7 +68,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { if (body == null) { writer.appendNoHilight("native "); } - getModifiers(abc, isStatic, insideInterface, writer); + getModifiers(abc, isStatic, insideInterface, writer, classIndex); writer.hilightSpecial("function ", HighlightSpecialType.TRAIT_TYPE); writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc.constants, fullyQualifiedNames, false, true), HighlightSpecialType.TRAIT_NAME); writer.appendNoHilight("("); 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 3308e3859..7862eabda 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 @@ -96,7 +96,7 @@ public class TraitMethodGetterSetter extends Trait { } MethodBody body = abc.findBody(method_info); - getModifiers(abc, isStatic, insideInterface, writer); + getModifiers(abc, isStatic, insideInterface, writer, classIndex); if (abc.method_info.get(method_info).flagNative()) { writer.appendNoHilight("native "); 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 ebacb63a9..5d15842f6 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 @@ -174,7 +174,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { } } if (showModifier) { - getModifiers(abc, isStatic, insideInterface, writer); + getModifiers(abc, isStatic, insideInterface, writer, classIndex); } if (convertData.assignedValues.containsKey(this)) { GraphTargetItem val = convertData.assignedValues.get(this).value; 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 06f22a66c..c885553fe 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 @@ -587,4 +587,43 @@ public class ActionScript3ClassTest extends ActionScript3DecompileTestBase { + " };\n" + "}"); } + + @Test + public void testSubClass() { + decompileScriptPack("standard", "tests_classes.TestSubClass", "package tests_classes\n" + + "{\n" + + " public class TestSubClass\n" + + " {\n" + + " \n" + + " \n" + + " public function TestSubClass()\n" + + " {\n" + + " super();\n" + + " }\n" + + " \n" + + " public function run() : *\n" + + " {\n" + + " var sc:SubClass = new SubClass();\n" + + " sc.a_internal = 1;\n" + + " sc.c_public = 3;\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + "class SubClass\n" + + "{\n" + + " \n" + + " \n" + + " internal var a_internal:int;\n" + + " \n" + + " private var b_private:int;\n" + + " \n" + + " public var c_public:int;\n" + + " \n" + + " public function SubClass()\n" + + " {\n" + + " super();\n" + + " }\n" + + "}"); + } } 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 01a61a6e5..715834ae0 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf differ 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 fc261c681..e300420bd 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index 6509d4ba4..3f4c131e2 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -146,6 +146,8 @@ package TestOtherClass; + TestSubClass; + initializedvar; initializedconst; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as index bbce509f0..1b4e68385 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestHello.as @@ -8,4 +8,4 @@ package tests trace("hello"); } } -} \ No newline at end of file +} diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestSubClass.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestSubClass.as new file mode 100644 index 000000000..7b91bc098 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests_classes/TestSubClass.as @@ -0,0 +1,20 @@ +package tests_classes +{ + + public class TestSubClass + { + public function run():* + { + var sc:SubClass = new SubClass(); + sc.a_internal = 1; + //sc.b_private = 2; + sc.c_public = 3; + } + } +} + +class SubClass { + internal var a_internal:int; + private var b_private:int; + public var c_public:int +}