Fixed: AS3 difference between namespace keyword and const of type Namespace

This commit is contained in:
Jindra Petřík
2025-05-31 18:02:23 +02:00
parent a6903c6257
commit 5a0a14eb5b
6 changed files with 30 additions and 23 deletions

View File

@@ -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));

View File

@@ -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);

View File

@@ -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<Map.Entry<String, Map<String, String>>> metadata, NamespaceItem pkg, String customNamespace, boolean isStatic, String var, GraphTargetItem type, GraphTargetItem value, int line, boolean generatedNs) {
public ConstAVM2Item(List<Map.Entry<String, Map<String, String>>> 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<GraphSourceItem> ret = new ArrayList<>();
if (value != null) {
GraphTargetItem value2 = AVM2SourceGenerator.handleAndOrCoerce(value, type);

View File

@@ -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 = "";
}

View File

@@ -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<String, Integer> subPrivateVarFullNameToDefinitionPosition = privateVarFullNameToDefinitionPosition;
Map<String, Integer> 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<String> 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<String, Integer> subPrivateVarFullNameToDefinitionPosition = privateVarFullNameToDefinitionPosition;
Map<String, Integer> 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<String> 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);
}
}