diff --git a/CHANGELOG.md b/CHANGELOG.md index 241a4a226..a9e37e6d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - AS3 XML embedded variables display and direct edit - AS3 Metadata values order - AS3 Metadata in P-code formatting +- AS3 Metadata single value (null item key) ## [18.3.6] - 2023-02-25 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java index 5ff2de100..ac36bd454 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java @@ -156,8 +156,10 @@ public class ASM3Parser { Map items = new HashMap<>(); while (symb.type == ParsedSymbol.TYPE_KEYWORD_ITEM) { symb = lexer.lex(); - expected(symb, ParsedSymbol.TYPE_STRING, "string key"); - String key = (String) symb.value; + if (symb.type != ParsedSymbol.TYPE_KEYWORD_NULL && symb.type != ParsedSymbol.TYPE_STRING) { + throw new AVM2ParseException("string/null value expected", lexer.yyline()); + } + String key = symb.type == ParsedSymbol.TYPE_KEYWORD_NULL ? null : (String) symb.value; symb = lexer.lex(); expected(symb, ParsedSymbol.TYPE_STRING, "string value"); String val = (String) symb.value; 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 a93ef84b3..2044df86c 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 @@ -433,15 +433,23 @@ public abstract class Trait implements Cloneable, Serializable { int val = abc.metadata_info.get(m).values[i]; writer.append("item "); - writer.append("\""); - writer.append(Helper.escapePCodeString(abc.constants.getString(key))); - writer.append("\""); + if (key == 0) { + writer.append("null"); + } else { + writer.append("\""); + writer.append(Helper.escapePCodeString(abc.constants.getString(key))); + writer.append("\""); + } writer.append(" "); - writer.append("\""); - writer.append(Helper.escapePCodeString(abc.constants.getString(val))); - writer.append("\""); + if (val == 0) { + writer.append("null"); + } else { + writer.append("\""); + writer.append(Helper.escapePCodeString(abc.constants.getString(val))); + writer.append("\""); + } writer.newLine(); } } 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 81b7eb9e4..256687182 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 703048be5..4843abd9b 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/tests/TestMetadata.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestMetadata.as index 6d28ce979..9c4b34824 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestMetadata.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestMetadata.as @@ -6,6 +6,7 @@ package tests [MyVarTag(var1 = "var 1", var2 = "var 2")] public var v:int = 5; + [MySingleTag("tag")] public function run(): void { trace("hello");