diff --git a/CHANGELOG.md b/CHANGELOG.md index 2df3aacff..2219de761 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - AS3 direct editation - Allow comma operator in XML filter operation - AS3 direct editation - Allow comma operator in switch expressions - AS3 XML embedded variables display and direct edit +- AS3 Metadata values order ## [18.3.6] - 2023-02-25 ### Fixed 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 dfa455985..d081b0006 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 @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -102,7 +103,7 @@ public abstract class Trait implements Cloneable, Serializable { for (int m : metadata) { if (m >= 0 && m < abc.metadata_info.size()) { String name = abc.constants.getString(abc.metadata_info.get(m).name_index); - Map data = new HashMap<>(); + Map data = new LinkedHashMap<>(); for (int i = 0; i < abc.metadata_info.get(m).keys.length; i++) { data.put(abc.constants.getString(abc.metadata_info.get(m).keys[i]), abc.constants.getString(abc.metadata_info.get(m).values[i])); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index f3ea4cbb1..e403fd009 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -1383,6 +1383,12 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testMetadata() { + decompileMethod("classic_air", "testMetadata", "trace(\"hello\");\r\n", + false); + } + @Test public void testMissingDefault() { decompileMethod("classic_air", "testMissingDefault", "var jj:int = 1;\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index 45b9d5d97..f298e960c 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -1379,6 +1379,12 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testMetadata() { + decompileMethod("classic", "testMetadata", "trace(\"hello\");\r\n", + false); + } + @Test public void testMissingDefault() { decompileMethod("classic", "testMissingDefault", "var jj:int = 1;\r\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 a544f65ea..81b7eb9e4 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 c0f722a66..703048be5 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 7f07d26e3..804b71688 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -83,6 +83,7 @@ package TestInnerTry; TestLogicalComputing; TestManualConvert; + TestMetadata; TestMissingDefault; TestMultipleCondition; TestNamedAnonFunctions; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestMetadata.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestMetadata.as new file mode 100644 index 000000000..6d28ce979 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestMetadata.as @@ -0,0 +1,14 @@ +package tests +{ + [MyClassTag(cls1 = "class 1", cls2 = "class 2")] + public class TestMetadata + { + [MyVarTag(var1 = "var 1", var2 = "var 2")] + public var v:int = 5; + + public function run(): void + { + trace("hello"); + } + } +} \ No newline at end of file