From 5a0a14eb5b8136b96187fcc616c34fc3a4bcb3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 31 May 2025 18:02:23 +0200 Subject: [PATCH] Fixed: AS3 difference between namespace keyword and const of type Namespace --- CHANGELOG.md | 1 + .../parser/script/AVM2SourceGenerator.java | 2 +- .../parser/script/ActionScript3Parser.java | 11 +++++----- .../abc/avm2/parser/script/ConstAVM2Item.java | 15 +++++++++---- .../abc/types/traits/TraitSlotConst.java | 2 +- .../flash/simpleparser/SimpleParser.java | 22 +++++++++---------- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75af31a01..6f66ddce6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ All notable changes to this project will be documented in this file. the title instead of tag full description - AS1/2/3 for decompilation with multiple variables - AS3 native functions outside class allowed +- AS3 difference between namespace keyword and const of type Namespace ## [23.0.1] - 2025-05-16 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 5cd5fb74e..e95b65e1c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -1980,7 +1980,7 @@ public class AVM2SourceGenerator implements SourceGenerator { cai.pkg.resolveCustomNs(abcIndex, importedClasses, localData.pkg, openedNamespaces, localData); } namespace = cai.pkg == null ? 0 : cai.pkg.getCpoolIndex(abcIndex); - isNamespace = type.toString().equals("Namespace"); + isNamespace = cai.ns; isStatic = cai.isStatic(); } tsc.type_index = isNamespace ? 0 : (type == null ? 0 : typeName(localData, type)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index af06d5527..983d0b201 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -40,7 +40,6 @@ import com.jpexs.decompiler.flash.abc.avm2.model.InitVectorAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NameValuePair; -import com.jpexs.decompiler.flash.abc.avm2.model.NanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewArrayAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NewObjectAVM2Item; @@ -149,7 +148,7 @@ import macromedia.asc.util.Decimal128; * @author JPEXS */ public class ActionScript3Parser { - + private static final GraphTargetDialect DIALECT = AVM2GraphTargetDialect.INSTANCE; private long uniqLast = 0; @@ -919,7 +918,7 @@ public class ActionScript3Parser { lexer.pushback(s); } - ConstAVM2Item ns = new ConstAVM2Item(metadata, namespace, customNs, true, nname, new TypeItem(DottedChain.NAMESPACE), new StringAVM2Item(null, null, nval), lexer.yyline(), generatedNs); + ConstAVM2Item ns = new ConstAVM2Item(metadata, namespace, customNs, true, nname, new TypeItem(DottedChain.NAMESPACE), new StringAVM2Item(null, null, nval), lexer.yyline(), true, generatedNs); traits.add(ns); break; case CONST: @@ -961,7 +960,7 @@ public class ActionScript3Parser { } GraphTargetItem tar; if (isConst) { - tar = new ConstAVM2Item(metadata, namespace, customNs, isStatic, vcname, type, value, lexer.yyline(), false); + tar = new ConstAVM2Item(metadata, namespace, customNs, isStatic, vcname, type, value, lexer.yyline(), false, false); } else { tar = new SlotAVM2Item(metadata, namespace, customNs, isStatic, vcname, type, value, lexer.yyline()); } @@ -1275,7 +1274,7 @@ public class ActionScript3Parser { } GraphTargetItem tar; if (isConst) { - tar = new ConstAVM2Item(metadata, ns, null, true, vcname, type, value, lexer.yyline(), false); + tar = new ConstAVM2Item(metadata, ns, null, true, vcname, type, value, lexer.yyline(), false, false); } else { tar = new SlotAVM2Item(metadata, ns, null, true, vcname, type, value, lexer.yyline()); } @@ -1309,7 +1308,7 @@ public class ActionScript3Parser { lexer.pushback(s); } - traits.add(new ConstAVM2Item(metadata, ns, null, true, nname, new TypeItem(DottedChain.NAMESPACE), new StringAVM2Item(null, null, nval), lexer.yyline(), generatedNs)); + traits.add(new ConstAVM2Item(metadata, ns, null, true, nname, new TypeItem(DottedChain.NAMESPACE), new StringAVM2Item(null, null, nval), lexer.yyline(), true, generatedNs)); break; default: lexer.pushback(s); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstAVM2Item.java index 154f34850..36abd8133 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ConstAVM2Item.java @@ -70,6 +70,11 @@ public class ConstAVM2Item extends AVM2Item { * Package */ public NamespaceItem pkg; + + /** + * Is namespace? + */ + public boolean ns; /** * Generated namespace @@ -96,9 +101,10 @@ public class ConstAVM2Item extends AVM2Item { * @param type Type * @param value Value * @param line Line + * @param ns Is namespace? * @param generatedNs Generated namespace */ - public ConstAVM2Item(List>> metadata, NamespaceItem pkg, String customNamespace, boolean isStatic, String var, GraphTargetItem type, GraphTargetItem value, int line, boolean generatedNs) { + public ConstAVM2Item(List>> metadata, NamespaceItem pkg, String customNamespace, boolean isStatic, String var, GraphTargetItem type, GraphTargetItem value, int line, boolean ns, boolean generatedNs) { super(null, null, NOPRECEDENCE, value); this.metadata = metadata; @@ -108,6 +114,7 @@ public class ConstAVM2Item extends AVM2Item { this.var = var; this.type = type; this.customNamespace = customNamespace; + this.ns = ns; this.generatedNs = generatedNs; } @@ -134,12 +141,12 @@ public class ConstAVM2Item extends AVM2Item { } AVM2SourceGenerator agen = (AVM2SourceGenerator) generator; - int ns = agen.genNs(localData.importedClasses, pkg.name, pkg, localData.openedNamespaces, localData, line); - if (type.toString().equals("Namespace")) { + if (this.ns) { return new ArrayList<>(); } - + int ns = agen.genNs(localData.importedClasses, pkg.name, pkg, localData.openedNamespaces, localData, line); + List ret = new ArrayList<>(); if (value != null) { GraphTargetItem value2 = AVM2SourceGenerator.handleAndOrCoerce(value, type); 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 e3c278d25..95a7a6785 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 @@ -132,7 +132,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { if (kindType == TRAIT_CONST) { slotconst = "const"; } - if (val != null && val.isNamespace()) { + if (val != null && type_index == 0 && val.isNamespace()) { slotconst = "namespace"; typeStr = ""; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java index 7cead3d32..44b209fa9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java @@ -127,12 +127,12 @@ public interface SimpleParser { if (vs instanceof TraitVarConstValueScope) { subStatic = ((TraitVarConstValueScope) vs).isStatic(); } - + //if its inner function (not a method), remove all this variables Map subPrivateVarFullNameToDefinitionPosition = privateVarFullNameToDefinitionPosition; Map subPrivateVarNameToDefinitionPosition = privateVarNameToDefinitionPosition; - if ((vs instanceof FunctionScope) &&(!(vs instanceof MethodScope))) { - subPrivateVarFullNameToDefinitionPosition = new LinkedHashMap<>(subPrivateVarFullNameToDefinitionPosition); + if ((vs instanceof FunctionScope) && (!(vs instanceof MethodScope))) { + subPrivateVarFullNameToDefinitionPosition = new LinkedHashMap<>(subPrivateVarFullNameToDefinitionPosition); subPrivateVarNameToDefinitionPosition = new LinkedHashMap<>(subPrivateVarNameToDefinitionPosition); Set keys = new HashSet<>(subPrivateVarFullNameToDefinitionPosition.keySet()); for (String vName : keys) { @@ -145,10 +145,10 @@ public interface SimpleParser { String lastName = vName.contains(".") ? vName.substring(vName.lastIndexOf(".") + 1) : vName; subPrivateVarNameToDefinitionPosition.remove(lastName); } - } + } } } - + parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, subPrivateVarFullNameToDefinitionPosition, subPrivateVarNameToDefinitionPosition, positionToStatic, subStatic, errors, vs, innerFunctionCanUseTraits); } } @@ -203,28 +203,28 @@ public interface SimpleParser { if (vs instanceof TraitVarConstValueScope) { subStatic = ((TraitVarConstValueScope) vs).isStatic(); } - + //if its inner function (not a method), remove all this variables Map subPrivateVarFullNameToDefinitionPosition = privateVarFullNameToDefinitionPosition; Map subPrivateVarNameToDefinitionPosition = privateVarNameToDefinitionPosition; - if ((vs instanceof FunctionScope) &&(!(vs instanceof MethodScope))) { - subPrivateVarFullNameToDefinitionPosition = new LinkedHashMap<>(subPrivateVarFullNameToDefinitionPosition); + if ((vs instanceof FunctionScope) && (!(vs instanceof MethodScope))) { + subPrivateVarFullNameToDefinitionPosition = new LinkedHashMap<>(subPrivateVarFullNameToDefinitionPosition); subPrivateVarNameToDefinitionPosition = new LinkedHashMap<>(subPrivateVarNameToDefinitionPosition); Set keys = new HashSet<>(subPrivateVarFullNameToDefinitionPosition.keySet()); for (String vName : keys) { if (vName.equals("this") || vName.startsWith("this.")) { subPrivateVarFullNameToDefinitionPosition.remove(vName); - if (vName.equals("this")) { + if (vName.equals("this")) { subPrivateVarNameToDefinitionPosition.remove("this"); } if (!innerFunctionCanUseTraits) { String lastName = vName.contains(".") ? vName.substring(vName.lastIndexOf(".") + 1) : vName; subPrivateVarNameToDefinitionPosition.remove(lastName); } - } + } } } - + parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, positionToStatic, subStatic, errors, vs, innerFunctionCanUseTraits); } }