From 92e43cb61563ce1c8c8b70896ccc8d47a6f30ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 28 Feb 2026 15:33:32 +0100 Subject: [PATCH] Added: AS3 Direct editation - Error when accessing inaccessible namespace Fixed: AS3 goto definition missing some namespaces AS3 debug game testdata with debug info --- CHANGELOG.md | 2 + .../parser/script/AVM2SourceGenerator.java | 11 ++- .../abc/avm2/parser/script/AbcIndexing.java | 69 +++++++++--------- .../parser/script/ActionScript3Parser.java | 4 +- .../script/ActionScript3SimpleParser.java | 7 +- .../abc/avm2/parser/script/CallAVM2Item.java | 2 +- .../abc/avm2/parser/script/NamespaceItem.java | 2 +- .../avm2/parser/script/PropertyAVM2Item.java | 48 +++++++++++- .../parser/script/UnresolvedAVM2Item.java | 20 ++--- .../testdata/debug_game/as3_scoring.swf | Bin 9845 -> 10154 bytes .../debug_game/as3_scoring/DOMDocument.xml | 6 +- .../as3_scoring/META-INF/metadata.xml | 12 ++- .../as3_scoring/PublishSettings.xml | 4 +- .../as3_scoring/bin/SymDepend.cache | Bin 107 -> 107 bytes .../decompiler/flash/gui/abc/ABCPanel.java | 2 +- 15 files changed, 121 insertions(+), 68 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b018254c..6e31f1ca6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ### Added - Debugger - Button to disconnect current session (stay listening) - [#2644] Debugger - Button to sort variables alphabetically +- AS3 Direct editation - Error when accessing inaccessible namespace ### Fixed - [#2643] APNG export - images containing multiple IDAT chunks @@ -13,6 +14,7 @@ All notable changes to this project will be documented in this file. - [#2645] Windows MSI installer - Cannot change install directory - Long delay before switching critical status bar titles (Causing many actions to look slow - for example Debug listening) +- AS3 goto definition missing some namespaces ### Changed - Icon of Debug listen action from ear to phone receiver 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 2af8206d9..c21b2300a 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 @@ -2508,10 +2508,13 @@ public class AVM2SourceGenerator implements SourceGenerator { */ public static boolean searchPrototypeChain(String nsKeyword, Integer namespaceSuffix, List otherNs, int privateNs, int protectedNs, int staticProtectedNs, int internalNs, boolean instanceOnly, AbcIndexing abc, DottedChain pkg, String obj, String propertyName, Reference outName, Reference outNs, Reference outPropNs, Reference outPropNsKind, Reference outPropNsIndex, Reference outPropType, Reference outPropValue, Reference outPropValueAbc, Reference isType, Reference outPropTrait) { + AVM2ConstantPool constants = abc.getSelectedAbc().constants; + int publicNs = constants.getNamespaceId(Namespace.KIND_PACKAGE, "", 0, false); + if (nsKeyword != null) { switch (nsKeyword) { case "public": - return searchPrototypeChain(0, instanceOnly, abc, pkg, obj, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc, isType, outPropTrait); + return searchPrototypeChain(publicNs, instanceOnly, abc, pkg, obj, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc, isType, outPropTrait); case "protected": if (searchPrototypeChain(staticProtectedNs, instanceOnly, abc, pkg, obj, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc, isType, outPropTrait)) { return true; @@ -2542,14 +2545,14 @@ public class AVM2SourceGenerator implements SourceGenerator { } } - return searchPrototypeChain(0, instanceOnly, abc, pkg, obj, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc, isType, outPropTrait); + return searchPrototypeChain(publicNs, instanceOnly, abc, pkg, obj, propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc, isType, outPropTrait); } private static boolean searchPrototypeChain(int selectedNs, boolean instanceOnly, AbcIndexing abc, DottedChain pkg, String obj, String propertyName, Reference outName, Reference outNs, Reference outPropNs, Reference outPropNsKind, Reference outPropNsIndex, Reference outPropType, Reference outPropValue, Reference outPropValueAbc, Reference isType, Reference outPropTrait) { isType.setVal(false); AbcIndexing.TraitIndex sp = abc.findScriptProperty(pkg.addWithSuffix(propertyName)); if (sp == null) { - Reference foundStatic = new Reference<>(null); + Reference foundStatic = new Reference<>(null); sp = abc.findProperty(new AbcIndexing.PropertyDef(propertyName, new TypeItem(pkg.addWithSuffix(obj)), abc.getSelectedAbc(), selectedNs), !instanceOnly, true, true, foundStatic); } if (sp != null) { @@ -3086,7 +3089,7 @@ public class AVM2SourceGenerator implements SourceGenerator { ret.add(ins(AVM2Instructions.NewObject, 0)); ret.add(ins(AVM2Instructions.PushWith)); scope = localData.scopeStack.size(); - localData.scopeStack.add(new PropertyAVM2Item(null, false, item.functionName, "" /*??*/, abcIndex, new ArrayList<>(), localData.callStack, false, null)); + localData.scopeStack.add(new PropertyAVM2Item(null, false, item.functionName, "" /*??*/, abcIndex, new ArrayList<>(), localData.callStack, false, null, -1)); } AVM2ConstantPool constants = abcIndex.getSelectedAbc().constants; ret.add(ins(AVM2Instructions.NewFunction, method(null, false, constants.getStringId(item.functionName, true), true, false, false, localData.callStack, localData.pkg, item.needsActivation, item.subvariables, 0 /*Set later*/, item.hasRest, item.line, localData.currentClassBaseName, null, false, localData, item.paramTypes, item.paramNames, item.paramValues, item.body, item.retType))); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java index 421161134..6209209c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java @@ -162,13 +162,16 @@ public final class AbcIndexing { return; } Namespace ns = abc.constants.getNamespace(propNsIndex); - this.propNsKind = ns.kind; + //this.propNsKind = ns.kind; switch (ns.kind) { - case Namespace.KIND_PACKAGE: - case Namespace.KIND_NAMESPACE: + case Namespace.KIND_PACKAGE: + case Namespace.KIND_PACKAGE_INTERNAL: case Namespace.KIND_PROTECTED: case Namespace.KIND_STATIC_PROTECTED: - this.abc = null; + //this.abc = null; + //this.propNsString = abc.constants.getNamespace(propNsIndex).getRawName(abc.constants); + break; + case Namespace.KIND_NAMESPACE: this.propNsString = abc.constants.getNamespace(propNsIndex).getRawName(abc.constants); break; default: @@ -187,8 +190,11 @@ public final class AbcIndexing { this.propName = propName; this.parent = parent; this.abc = null; - this.propNsKind = nsKind; - this.propNsString = propNsString; + if (nsKind == Namespace.KIND_NAMESPACE) { + this.propNsString = propNsString; + } + //this.propNsKind = nsKind; + //this.propNsString = propNsString; } @Override @@ -242,12 +248,7 @@ public final class AbcIndexing { private int propNsIndex = 0; - private ABC abc = null; - - private void setPrivate(ABC abc, int propNsIndex) { - this.propNsIndex = propNsIndex; - this.abc = abc; - } + private ABC abc = null; /** * Gets property name @@ -280,9 +281,12 @@ public final class AbcIndexing { return; } int k = abc.constants.getNamespace(nsIndex).kind; - if (k != Namespace.KIND_PACKAGE) { + /*if (k != Namespace.KIND_PACKAGE) { setPrivate(abc, nsIndex); - } + }*/ + + this.propNsIndex = nsIndex; + this.abc = abc; } /** @@ -840,33 +844,26 @@ public final class AbcIndexing { * @param prop Property to find * @param findStatic Find static properties * @param findInstance Find instance properties + * @param foundStatic Whether result is static * @return Trait index or null */ - public TraitIndex findNsProperty(PropertyNsDef prop, boolean findStatic, boolean findInstance) { - - if (findStatic && classNsProperties.containsKey(prop)) { - if (!classNsProperties.containsKey(prop)) { - if (parent != null) { - TraitIndex ret = parent.findNsProperty(prop, findStatic, findInstance); - if (ret != null) { - return ret; - } - } - } else { + public TraitIndex findNsProperty(PropertyNsDef prop, boolean findStatic, boolean findInstance, Reference foundStatic) { + if (findStatic) { + if (classNsProperties.containsKey(prop)) { + foundStatic.setVal(true); return classNsProperties.get(prop); - } + } } if (findInstance && instanceNsProperties.containsKey(prop)) { - if (!instanceNsProperties.containsKey(prop)) { - if (parent != null) { - TraitIndex ret = parent.findNsProperty(prop, findStatic, findInstance); - if (ret != null) { - return ret; - } - } - } else { - return instanceNsProperties.get(prop); - } + foundStatic.setVal(false); + return instanceNsProperties.get(prop); + } + + if (parent != null) { + TraitIndex ret = parent.findProperty(new PropertyDef(prop.propName, new TypeItem(prop.ns), prop.abc, prop.propNsIndex), findStatic, findInstance, true, foundStatic); + if (ret != null) { + return ret; + } } return null; } 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 0add52d18..2b1c09e93 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 @@ -358,7 +358,7 @@ public class ActionScript3Parser { if (ns != null) { ret = new NamespacedAVM2Item(ns, propName, propItem, ret, attr, openedNamespaces, null); } else { - ret = new PropertyAVM2Item(ret, attr, propName, nsSuffix, abcIndex, openedNamespaces, new ArrayList<>(), nullDot, nsKeyword); + ret = new PropertyAVM2Item(ret, attr, propName, nsSuffix, abcIndex, openedNamespaces, new ArrayList<>(), nullDot, nsKeyword, lexer.yyline()); } s = lex(); } @@ -472,7 +472,7 @@ public class ActionScript3Parser { } if (nsname != null) { if (nsKeyword != null && nspropItem == null) { - ret = new PropertyAVM2Item(ret, nsAtribute, nsprop, nsSuffix, abcIndex, openedNamespaces, new ArrayList(), false, nsKeyword); + ret = new PropertyAVM2Item(ret, nsAtribute, nsprop, nsSuffix, abcIndex, openedNamespaces, new ArrayList(), false, nsKeyword, lexer.yyline()); } else { UnresolvedAVM2Item ns = new UnresolvedAVM2Item(new ArrayList<>(), importedClasses, typeOnly, null, lexer.yyline(), new DottedChain(new String[]{nsname}), null, openedNamespaces, abcIndex); variables.add(ns); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java index ae902de41..c45cbe3d3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; import com.jpexs.decompiler.flash.simpleparser.CatchScope; @@ -2371,7 +2372,11 @@ public class ActionScript3SimpleParser implements SimpleParser { List vars = new ArrayList<>(); List importedClasses = new ArrayList<>(); List openedNamespaces = new ArrayList<>(); - for (String name : abc.getSwf().getAbcIndex().getPackageObjects(DottedChain.TOPLEVEL)) { + SWF swf = abc.getSwf(); + if (swf == null) { + return; + } + for (String name : swf.getAbcIndex().getPackageObjects(DottedChain.TOPLEVEL)) { externalTypes.add(new Path(name)); } externalTypes.add(new Path("__AS3__", "vec", "Vector")); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java index 38a730748..696b6709b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java @@ -136,7 +136,7 @@ public class CallAVM2Item extends AVM2Item { nobj.setRegNumber(0); obj = nobj; }*/ - PropertyAVM2Item p = new PropertyAVM2Item(obj, n.isAttribute(), n.getVariableName(), n.getNamespaceSuffix(), g.abcIndex, n.openedNamespaces, new ArrayList<>(), false, null); + PropertyAVM2Item p = new PropertyAVM2Item(obj, n.isAttribute(), n.getVariableName(), n.getNamespaceSuffix(), g.abcIndex, n.openedNamespaces, new ArrayList<>(), false, null, line); p.setAssignedValue(n.getAssignedValue()); callable = p; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java index 6e59d02ee..ca3821203 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java @@ -136,7 +136,7 @@ public class NamespaceItem { } if (kind == KIND_NAMESPACE_CUSTOM) { String custom = name.toRawString(); - PropertyAVM2Item prop = new PropertyAVM2Item(null, false, custom, "", abcIndex, openedNamespaces, new ArrayList<>(), false, null); + PropertyAVM2Item prop = new PropertyAVM2Item(null, false, custom, "", abcIndex, openedNamespaces, new ArrayList<>(), false, null, -1); Reference value = new Reference<>(null); Reference outAbc = new Reference<>(null); Reference isType = new Reference<>(false); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index f3967bcf3..751303cc6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -45,8 +45,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -98,10 +100,12 @@ public class PropertyAVM2Item extends AssignableAVM2Item { public List scopeStack = new ArrayList<>(); private final boolean nullish; private final String nsKeyword; + + private int line; @Override public AssignableAVM2Item copy() { - PropertyAVM2Item p = new PropertyAVM2Item(object, attribute, propertyName, namespaceSuffix, abcIndex, openedNamespaces, callStack, nullish, nsKeyword); + PropertyAVM2Item p = new PropertyAVM2Item(object, attribute, propertyName, namespaceSuffix, abcIndex, openedNamespaces, callStack, nullish, nsKeyword, line); return p; } @@ -117,8 +121,9 @@ public class PropertyAVM2Item extends AssignableAVM2Item { * @param callStack Call stack * @param nullish Nullish * @param nsKeyword Namespace keyword (public,protected,private,internal) + * @param line Source code line */ - public PropertyAVM2Item(GraphTargetItem object, boolean attribute, String propertyName, String namespaceSuffix, AbcIndexing abcIndex, List openedNamespaces, List callStack, boolean nullish, String nsKeyword) { + public PropertyAVM2Item(GraphTargetItem object, boolean attribute, String propertyName, String namespaceSuffix, AbcIndexing abcIndex, List openedNamespaces, List callStack, boolean nullish, String nsKeyword, int line) { this.attribute = attribute; this.propertyName = propertyName; this.namespaceSuffix = namespaceSuffix; @@ -128,6 +133,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { this.callStack = callStack; this.nullish = nullish; this.nsKeyword = nsKeyword; + this.line = line; } @Override @@ -302,7 +308,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { propValueAbc = sp.abc; propTrait = sp.trait; } - } + } if (propType == null && AVM2SourceGenerator.searchPrototypeChain(nsKeyword, namespaceSuffixInt, otherNs, localData.privateNs, localData.protectedNs, localData.staticProtectedNs, localData.internalNs, false, abcIndex, ftn.getWithoutLast(), ftn.getLast(), propertyName, outName, outNs, outPropNs, outPropNsKind, outPropNsIndex, outPropType, outPropValue, outPropValueAbc, isType, outPropTrait)) { objType = new TypeItem(outNs.getVal().addWithSuffix(outName.getVal())); propType = outPropType.getVal(); @@ -313,6 +319,39 @@ public class PropertyAVM2Item extends AssignableAVM2Item { propValue = outPropValue.getVal(); propValueAbc = outPropValueAbc.getVal(); propTrait = outPropTrait.getVal(); + int nsIndex = propTrait.getName(propValueAbc).namespace_index; + Namespace ns = propValueAbc.constants.getNamespace(nsIndex); + String pkg = ftn.getWithoutLast().toRawString(); + switch (ns.kind) { + case Namespace.KIND_PRIVATE: + if (!(otherNs.contains(nsIndex) && propValueAbc == abc)) { + throw new CompilationException("Property " + propertyName + " has private access in " + objType.toString(), line); + } + break; + case Namespace.KIND_PACKAGE_INTERNAL: + if (!pkg.equals(localData.pkg.toRawString())) { + throw new CompilationException("Property " + propertyName + " has package internal access in " + objType.toString(), line); + } + break; + case Namespace.KIND_PROTECTED: + case Namespace.KIND_STATIC_PROTECTED: + AbcIndexing.ClassIndex ci = abcIndex.findClass(thisType, abc, localData.scriptIndex); + boolean found = false; + String nsName = ns.getName(propValueAbc.constants).toRawString(); + while (ci != null) { + DottedChain clsName = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).getNameWithNamespace(new HashSet<>(), ci.abc, ci.abc.constants, false); + String clsNsName = clsName.isTopLevel() ? clsName.getLast() : clsName.getWithoutLast().toRawString() + ":" + clsName.getLast(); + if (Objects.equals(nsName, clsNsName)) { + found = true; + break; + } + ci = ci.parent; + } + if (!found) { + throw new CompilationException("Property " + propertyName + " has protected access in " + objType.toString(), line); + } + break; + } } } } @@ -364,7 +403,8 @@ public class PropertyAVM2Item extends AssignableAVM2Item { } } if (nsKind == Namespace.KIND_PACKAGE && propertyName != null) { - AbcIndexing.TraitIndex p = abcIndex.findNsProperty(new AbcIndexing.PropertyNsDef(propertyName, nsname, abc, nsindex), true, true); + Reference foundStatic = new Reference<>(null); + AbcIndexing.TraitIndex p = abcIndex.findNsProperty(new AbcIndexing.PropertyNsDef(propertyName, nsname, abc, nsindex), true, true, foundStatic); Reference outName = new Reference<>(""); Reference outNs = new Reference<>(DottedChain.EMPTY); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java index 92a34e8bd..bedfe250f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java @@ -420,7 +420,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { ret.setRegNumber(n.getRegNumber()); resolved = ret; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -447,7 +447,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { GraphTargetItem ret = new NameAVM2Item(t, line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex, false); resolved = ret; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -460,7 +460,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { boolean isProperty = false; if (localData != null) { //resolve can be called without localData - PropertyAVM2Item resolvedx = new PropertyAVM2Item(null, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), abc, openedNamespaces, callStack, false, null); + PropertyAVM2Item resolvedx = new PropertyAVM2Item(null, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), abc, openedNamespaces, callStack, false, null, line); ((PropertyAVM2Item) resolvedx).scopeStack = scopeStack; ((PropertyAVM2Item) resolvedx).setAssignedValue(assignedValue); Reference objectType = new Reference<>(null); @@ -490,7 +490,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { if (ci != null) { resolved = ti; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -517,7 +517,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { } resolved = ti; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -536,7 +536,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { resolved = ret; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -573,7 +573,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { TypeItem ret = new TypeItem(fname); resolved = ret; for (int j = i + 1; j < name.size(); j++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(j), name.get(j), name.getNamespaceSuffix(j), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(j), name.get(j), name.getNamespaceSuffix(j), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (j == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -602,7 +602,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { TypeItem ret = ti; resolved = ret; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -639,7 +639,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { NameAVM2Item ret = new NameAVM2Item(ntype, line, name.isAttribute(0), name.get(0), name.getNamespaceSuffix(0), null, false, openedNamespaces, abcIndex, false); resolved = ret; for (int i = 1; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, new ArrayList<>(), false, null, line); if (i == name.size() - 1) { ((PropertyAVM2Item) resolved).assignedValue = assignedValue; } @@ -662,7 +662,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { resolved = null; GraphTargetItem ret = null; for (int i = 0; i < name.size(); i++) { - resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, callStack, false, null); + resolved = new PropertyAVM2Item(resolved, name.isAttribute(i), name.get(i), name.getNamespaceSuffix(i), abc, openedNamespaces, callStack, false, null, line); if (ret == null) { ((PropertyAVM2Item) resolved).scopeStack = scopeStack; ret = resolved; diff --git a/libsrc/ffdec_lib/testdata/debug_game/as3_scoring.swf b/libsrc/ffdec_lib/testdata/debug_game/as3_scoring.swf index d5bb3532bbdc3ac35feffbbd75d27e6ea97df29c..8c9aa707d0c7cb101ef8413cf1c095ea232f76b2 100644 GIT binary patch literal 10154 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 W6H_hgy}p3^C>!#QpmMV2{C@!Z%T~$& literal 9845 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≪o?h}z3=Y8bsEC799^5RnLH4z z6GYHd8p1I!MsGzkLKQD1EH+KY_)Qzbe@n*~Yx+P{^z36^OE!0!`o8P1!RL$-W;Y?9 z^srr?|4mr3qqK!fYW>fyC41@UUh@Ag;c^Q+;S4bD4LTi`RurjA*k;^GXgHngb#^}f zEkS8_u;~1isF`M^)hwZMjj(+mE&N3XE=b9Isw^>Y##i7Rn;{=ysMG0V@lW<>UR`Gexb1#F~WBLaYQx0v~x*5rDYC zx$$)gDuz1=?SX9GlheobyAsiq16ydjp3WaDH9&5+yxQ?@Gne*Oo_BjuQ&Ps`pWsSE zB|q#HhXT>YV}os)2mW1?T&gZsy0gk8x&TwOE(q74KX+rWnnIQo`jwldZN0@r%xMBfMGEt0$NSD7dDsY!G&-W{!`2?_s$16)m*G(DWtv0Pg7(}K1ec7KM%18I)VxWzI-z>VpyfI_pPU79v}-q z8K|UDVY{-mMuMOuRDt5ClYGRfN8E-!wJUiRyl`)^ucncjAzdQW7DJi1e_3Z-h>`lo z%X(81o(;g#(C)viiV=7M{;o;6{C^>_XV8Uzz47M?+1ka&a}51S_`i%{l`(s=h7#ht zE|=@A!j^bHI)akWe&Bz2ic~8q=i1;5T<(fDi0*JfxTV5LLj#!Y&&gjVktUKwpd`Q) z0cK&)&~WGa_qxme2oP)6^v|oN`EPi(bfq%iZ6oe}sTeRdCDKAFk1h?d{!j58M3vsS z&%ErH?A25}7;6H#cgG9B%BV$02*Rc|beVU_$G(0=IE|-%f+)R1kQdz{blvk?X1uaB!SW*2@Il*@6BJNBcLTfhKH zI?BD@j`RBwfKBZUpvn(-lMf&yD&ygpj5GN8@MZ4z=c5RlgV^_l_np)4muXc!k!p{+MOZ3*OQ)_Hkc?SVX z6xr_BE?4eg5I{2WHH3m#>L@|!>_NN}w<7db5yVsui zFmELio7DsWWoyzp%F>T@15Os9*yY-)LkZa%34V8lC3snrEUAw@_!LAQF)kfPWoa=q z?&_){F6A!&se0ydq^D+IP5G9u+UEf92Hk!+BwGV zdK$>qS)438VnevkU`+FJVbH{+lTk<+$V*XIAQKwaW)i}BS}k?u?qSYh{&$tBl}rTj zek3;MGM#P=!NRUdWCEKR8mCz+%kLrb@6EPQ>$e$3zJUG4&(h;DNh0RDji5K58k?SJ z=S;?YCIh@DNyQciu(2~{g%G?^c8JeWly9N=@L5VOFme@40s(LF|l zFiGW}$#<4d?StDF!leF zo8Vx7{h=fK5Tt>JlwhxovlLFP)JB)k0HRgESBa5WhsJz(w%ENLEKC4YD@qUup!!Z= zL+)*Hj&r~c&C}Esku1QdjJH$2Lk{WRscK17JmmwAQif#25b06y`yg&_m*jBG<*DR+ z1o(*;*yU2xDNdeUO-?&xFG&YGOoW$%tlkkBIBFR<5 zPL7>-94LLL&)u=5uiD6iUT{9~{}a7ikn4Q)UWK2lC|>I7u}gW%cpw6uJ`Y5nvmrk% zS0GLb*_c!PCRupc7+F9WO`FAZ!u7#b6@;V4iYl9G<|(7@TV4}alGm2!u<#`UP86yf{C^$a&pma(`X zsLIxfdbO-Yr;#9E^_T}{mP-$aqtTAwSiIS%lJXslmsLw{pYy3sEl^CWfzM{UgmB9PP6`B%ZOWDow^8C;T6<&rJh!z0CVn`L>5ZZi9fCjP@i`yFF!BC+)Ub>pqUn)3}#PEE2gZ1a1|>6#-&HHj3$fMaxd}&_-J1j@xsuX+RbUkrG(( z3q)5s6xSa_;kboKTRHWN>QI6_l+Rm#$UZ;VBFZ*=&G59oiueURM zf{v$=W6(n(LXG~l9XfJ3VV3LP(s{UL%x{YM%2y+gDEf?x3D|#Kreq_C(Rec}d!YtT zux>S^2~1;<6;0}ld0=cKQYd9wj!Vm1&@3RJ8dD+*Twn|6S=~}J(u;NDkQPmf>4MJE zOcc#-6n`aOBkEBy56(N{M}A$aI`LeCGP&ReQoeL(afmdlKf<2~+tl5&)wZa5iw|s? zEgZn}oa&`pX7xTfTA+=96gSn-Py<`|uBa4O+HdCh!%~}B*Ksv7W`#-R>B77zVHMn0 zLp62bmjxX&`!UPm?m zz;oxKVin`)N@wv~SFO^TkU0Qtcg5-tiD5%|P;2DlTx4)ZB%AMqI|fb|LwFkx!4 zMQ#d@LYW0-V>nehg&4r<{b!)@jvC4nNc4p2+YdPTK<`Y2w1298oyYqHyV5XPkD5Lc- zpny%UPD^rCGu&H?oW(@J)KoIC2TfhSo^7@3faH+Rd*c8(qwxb2Tv37X&I`?EXSg`f)VRfLA#z_Uq)KC9afPgUma2?UX_ihUbyTWS75> zPCxZX==gwW<+`!s&cbp16~$Yw7}@!qO3l{e4N+ERrfH(b zaXx6J?>N*S`E|AL4EE}cy#z=Btftn(*ZbHoyJ{G&$qRx1W=yM|HX}1Q^BkC9vI}GV zh5gXV=lGV}#wxakDorP-VxW^DbbY?zab_#^X9KkNmdy`(l~#wiAb@~!Qti;hR>1RQ zu#(A|VX3;W-sXukC{X!9@Ai*IM2wgRtfn!%!Z*5YB330xtxz7;6g{+%gzrD;UiZQ0 zX+g-(;ei=DFzc#RX(A0@moF9m?PRskiQg4eDhPK#huJ9hM$B~JhehF6Q?i%27x*mB zv?617Xgd38A^Ucs`%jhxdZ)+>L%t-J%zT|CX)WD)f;Y*iGzmLisf}F9W&Ht;Og?t8 zexwQV=Dc*dehH||Jq49E!|sSYBUxet)@OV@87FFYk;vhE3HA-G>>24%?`KjdlUANJOd^Jl=hx zuyabYCn9dT>Rdm)5}S7cw+!#ZjND6vG5e7fN$eZU5+Y(nT3?d7oLYid5I_S`jBu@i2eGMWL{01rL&5jLc<6u zY>GKuOIcTi;=*prhq-n^GdH&6a9+v~B8D@ttW##m%mEp%6?O~~)a01jBT-OCBvbeX z1%yk7!zBssmZm3&)ZxK3XE$S$jwy~fqBEzWO9Z>BTj7;yO z9nkG>jv&?sm*vUB5+k;xM-g!8@VOjmtr8+6CPHLl;v+5zxm>~Bp#G226(xxvIrBkf&^!ovwNA_ z#4OzD(;a36IWdk1H_TulyT>@%nYJ%o;m26iRv8{T{XS9_;n<}bQ>W|EZi>>GNl;{S zU&_8xVP%GPPNrLBrrUFj2j0(yPu=pPY*~bV?i|MXCfwuBN9Z@n=*|lOtwVf)b9-v- z7=^Bs<9Uwx{i}Pwb|!#s0>3`O+aGz>3(Mo5ziPizQHGn*E?$L4%KeG_h2XC=)lcDb zi{yJt`~LQG*~D2m + + + @@ -200,8 +203,5 @@ btnSpeedDown.addEventListener(MouseEvent.CLICK, onSpeedDown); - - - \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/META-INF/metadata.xml index fe30b6721..8ec1ced4e 100644 --- a/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/META-INF/metadata.xml +++ b/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/META-INF/metadata.xml @@ -5,8 +5,8 @@ xmlns:xmp="http://ns.adobe.com/xap/1.0/"> Adobe Flash Professional CS6 - build 481 2026-02-16T10:31:42-08:00 - 2026-02-21T09:45:46-08:00 - 2026-02-21T09:45:46-08:00 + 2026-02-27T13:55:44-08:00 + 2026-02-27T13:55:44-08:00 @@ -22,7 +22,7 @@ xmp.did:7FE581FA660BF11197008EF33C376745 xmp.did:EDF1CDD4690BF11197008EF33C376745 - xmp.iid:3B7DE8AB4B0FF111A0D3B09FD2F43FD4 + xmp.iid:909574812614F1118B04B924A153AAEA xmp.did:7FE581FA660BF11197008EF33C376745 @@ -51,6 +51,12 @@ 2026-02-16T10:31:42-08:00 Adobe Flash Professional CS6 - build 481 + + created + xmp.iid:909574812614F1118B04B924A153AAEA + 2026-02-16T10:31:42-08:00 + Adobe Flash Professional CS6 - build 481 + diff --git a/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/PublishSettings.xml b/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/PublishSettings.xml index f8e0a6f85..6046e6ad8 100644 --- a/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/PublishSettings.xml +++ b/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/PublishSettings.xml @@ -79,7 +79,7 @@ . CONFIG::FLASH_AUTHORING="true"; - 0 + 1 1 0 @@ -158,7 +158,7 @@ 0 1 1 - + 0 1 0 1 diff --git a/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/debug_game/as3_scoring/bin/SymDepend.cache index 2debd5f6d7ea9338d214b47df3754a1229a9d0b2..a3750bd23f5dbda6ee6a9e1154b7f7f23716f6cc 100644 GIT binary patch literal 107 zcmYdiU|@K~&cwjVAkDzXz|5cq(), ci.abc.getSwf(), true); + String scriptNamePrintable = DottedChain.parseWithSuffix(scriptName.toString()).toPrintableString(new LinkedHashSet<>(), swfRef.getVal(), true); if (swfRef.getVal() == abc.getSwf()) { hilightScript(getOpenable(), scriptNamePrintable);