From 1db9dcab0a943394f92facd45b4b8e4d904cf52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 3 Oct 2016 20:37:55 +0200 Subject: [PATCH] Issue #1289 AS1/2 direct editation - variables used in inner functions must not be stored in local registers --- CHANGELOG.md | 1 + .../action/model/FunctionActionItem.java | 56 +++- .../parser/script/ActionScript2Parser.java | 288 +++++++++--------- .../action/swf5/ActionDefineFunction.java | 9 +- .../action/swf7/ActionDefineFunction2.java | 9 +- .../flash/ActionScript2CompilerTest.java | 151 +++++++++ .../decompiler/flash/ActionScript2Test.java | 42 +++ libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1085756 -> 1085913 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 25878 -> 25991 bytes 9 files changed, 408 insertions(+), 148 deletions(-) create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a1a6eded..5ae9f8cd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ All notable changes to this project will be documented in this file. - AS3 direct editation not correctly saving local register names - #1254 FLA export - placing AS3 classes to FLA directory instead of scripts dir - Mac OS X installer fix (.pkg) +- #1289 AS1/2 direct editation - variables used in inner functions must not be stored in local registers ## [9.0.0] - 2016-08-12 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java index 93cb192c3..64d4bb26f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java @@ -41,6 +41,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -64,6 +65,7 @@ public class FunctionActionItem extends ActionItem { private int regStart; private List variables; + private List innerFunctions; public static final int REGISTER_THIS = 1; @@ -88,7 +90,7 @@ public class FunctionActionItem extends ActionItem { super(null, null, PRECEDENCE_PRIMARY); } - public FunctionActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, String functionName, List paramNames, Map regNames, List actions, List constants, int regStart, List variables) { + public FunctionActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, String functionName, List paramNames, Map regNames, List actions, List constants, int regStart, List variables, List innerFunctions) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.actions = actions; this.constants = constants; @@ -97,6 +99,7 @@ public class FunctionActionItem extends ActionItem { this.regNames = regNames; this.regStart = regStart; this.variables = variables; + this.innerFunctions = innerFunctions; } @Override @@ -207,6 +210,30 @@ public class FunctionActionItem extends ActionItem { return true; } + private Set getDefinedVariableNames(List variables) { + Set ret = new HashSet<>(); + for (VariableActionItem v : variables) { + if (v.isDefinition()) { + ret.add(v.getVariableName()); + } + } + return ret; + } + + private void getDeeplyUsedVariableNames(Set topLevelDefinedVariableNames, FunctionActionItem fun, Set deeplyUsedVariableNames) { + + Set definedVarNamesInFunc = getDefinedVariableNames(fun.variables); + for (VariableActionItem v : fun.variables) { + if (!v.isDefinition() && !definedVarNamesInFunc.contains(v.getVariableName()) && topLevelDefinedVariableNames.contains(v.getVariableName())) { + deeplyUsedVariableNames.add(v.getVariableName()); + } + } + + for (FunctionActionItem innerFun : fun.innerFunctions) { + getDeeplyUsedVariableNames(topLevelDefinedVariableNames, innerFun, deeplyUsedVariableNames); + } + } + @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { @@ -282,10 +309,31 @@ public class FunctionActionItem extends ActionItem { if (localData.inFunction > 1) { needsFun2 = true; } + + //If the function parameter or local variable is used in inner function, + //it must not be stored in a local register. + Set topLevelVariableNames = new HashSet<>(); + for (VariableActionItem v : variables) { + if (v.isDefinition()) { + topLevelVariableNames.add(v.getVariableName()); + } + } + for (String pn : paramNames) { + topLevelVariableNames.add(pn); + } + Set deeplyUsedVariableNames = new HashSet<>(); + for (FunctionActionItem fun : innerFunctions) { + getDeeplyUsedVariableNames(topLevelVariableNames, fun, deeplyUsedVariableNames); + } + if (needsFun2) { for (int i = 0; i < paramNames.size(); i++) { - paramRegs.add(registerNames.size()); - registerNames.add(paramNames.get(i)); + if (deeplyUsedVariableNames.contains(paramNames.get(i))) { + paramRegs.add(0); //this will be variable, no register + } else { + paramRegs.add(registerNames.size()); + registerNames.add(paramNames.get(i)); + } } } @@ -297,7 +345,7 @@ public class FunctionActionItem extends ActionItem { String varName = v.getVariableName(); GraphTargetItem stored = v.getStoreValue(); if (needsFun2) { - if (v.isDefinition() && !registerNames.contains(varName)) { + if (v.isDefinition() && !registerNames.contains(varName) && !deeplyUsedVariableNames.contains(varName)) { registerNames.add(varName); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index 4103f7764..3d919450d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -177,13 +177,13 @@ public class ActionScript2Parser { return "" + uniqLast; } - private List commands(boolean inFunction, boolean inMethod, int forinlevel, List variables) throws IOException, ActionParseException { + private List commands(boolean inFunction, boolean inMethod, int forinlevel, List variables, List functions) throws IOException, ActionParseException { List ret = new ArrayList<>(); if (debugMode) { System.out.println("commands:"); } GraphTargetItem cmd; - while ((cmd = command(inFunction, inMethod, forinlevel, true, variables)) != null) { + while ((cmd = command(inFunction, inMethod, forinlevel, true, variables, functions)) != null) { ret.add(cmd); } if (debugMode) { @@ -216,7 +216,7 @@ public class ActionScript2Parser { expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.THIS, SymbolType.SUPER, SymbolType.STRING_OP); ret = new VariableActionItem(s.value.toString(), null, false); variables.add((VariableActionItem) ret); - ret = (member(ret, inFunction, inMethod, variables)); + ret = (member(ret, inFunction, inMethod, variables, functions)); return ret; }*/ private void expected(ParsedSymbol symb, int line, Object... expected) throws IOException, ActionParseException { @@ -257,7 +257,7 @@ public class ActionScript2Parser { return ret; } - private List call(boolean inFunction, boolean inMethod, List variables) throws IOException, ActionParseException { + private List call(boolean inFunction, boolean inMethod, List variables, List functions) throws IOException, ActionParseException { List ret = new ArrayList<>(); //expected(SymbolType.PARENT_OPEN); //MUST BE HANDLED BY CALLER ParsedSymbol s = lex(); @@ -265,14 +265,14 @@ public class ActionScript2Parser { if (s.type != SymbolType.COMMA) { lexer.pushback(s); } - ret.add(expression(inFunction, inMethod, true, variables)); + ret.add(expression(inFunction, inMethod, true, variables, functions)); s = lex(); expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.PARENT_CLOSE); } return ret; } - private FunctionActionItem function(boolean withBody, String functionName, boolean isMethod, List variables) throws IOException, ActionParseException { + private FunctionActionItem function(boolean withBody, String functionName, boolean isMethod, List variables, List functions) throws IOException, ActionParseException { GraphTargetItem ret = null; ParsedSymbol s; expectedType(SymbolType.PARENT_OPEN); @@ -298,17 +298,20 @@ public class ActionScript2Parser { } List body = null; List subvariables = new ArrayList<>(); + List subfunctions = new ArrayList<>(); if (withBody) { expectedType(SymbolType.CURLY_OPEN); - body = commands(true, isMethod, 0, subvariables); + body = commands(true, isMethod, 0, subvariables, subfunctions); expectedType(SymbolType.CURLY_CLOSE); } - return new FunctionActionItem(null, null, functionName, paramNames, new HashMap<>() /*?*/, body, constantPool, -1, subvariables); + FunctionActionItem retf = new FunctionActionItem(null, null, functionName, paramNames, new HashMap<>() /*?*/, body, constantPool, -1, subvariables, subfunctions); + functions.add(retf); + return retf; } - private GraphTargetItem traits(boolean isInterface, GraphTargetItem nameStr, GraphTargetItem extendsStr, List implementsStr, List variables) throws IOException, ActionParseException { + private GraphTargetItem traits(boolean isInterface, GraphTargetItem nameStr, GraphTargetItem extendsStr, List implementsStr, List variables, List functions) throws IOException, ActionParseException { GraphTargetItem ret = null; /*for (int i = 0; i < nameStr.size() - 1; i++) { @@ -339,7 +342,7 @@ public class ActionScript2Parser { FunctionActionItem constr = null; List staticFunctions = new ArrayList<>(); List> staticVars = new ArrayList<>(); - List functions = new ArrayList<>(); + List instanceFunctions = new ArrayList<>(); List> vars = new ArrayList<>(); String classNameStr = ""; @@ -371,16 +374,16 @@ public class ActionScript2Parser { expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolGroup.GLOBALFUNC); String fname = s.value.toString(); if (fname.equals(classNameStr)) { //constructor - constr = (function(!isInterface, "", true, variables)); + constr = (function(!isInterface, "", true, variables, functions)); } else if (!isInterface) { if (isStatic) { - FunctionActionItem ft = function(!isInterface, "", true, variables); + FunctionActionItem ft = function(!isInterface, "", true, variables, functions); ft.calculatedFunctionName = pushConst(fname); staticFunctions.add(ft); } else { - FunctionActionItem ft = function(!isInterface, "", true, variables); + FunctionActionItem ft = function(!isInterface, "", true, variables, functions); ft.calculatedFunctionName = pushConst(fname); - functions.add(ft); + instanceFunctions.add(ft); } } break; @@ -395,9 +398,9 @@ public class ActionScript2Parser { } if (s.type == SymbolType.ASSIGN) { if (isStatic) { - staticVars.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables))); + staticVars.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables, functions))); } else { - vars.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables))); + vars.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables, functions))); } s = lex(); } @@ -415,11 +418,11 @@ public class ActionScript2Parser { if (isInterface) { return new InterfaceActionItem(nameStr, implementsStr); } else { - return new ClassActionItem(nameStr, extendsStr, implementsStr, constr, functions, vars, staticFunctions, staticVars); + return new ClassActionItem(nameStr, extendsStr, implementsStr, constr, instanceFunctions, vars, staticFunctions, staticVars); } } - private GraphTargetItem expressionCommands(ParsedSymbol s, boolean inFunction, boolean inMethod, int forinlevel, List variables) throws IOException, ActionParseException { + private GraphTargetItem expressionCommands(ParsedSymbol s, boolean inFunction, boolean inMethod, int forinlevel, List variables, List functions) throws IOException, ActionParseException { if (debugMode) { System.out.println("expressionCommands:"); } @@ -432,52 +435,52 @@ public class ActionScript2Parser { break; case MBORD: expectedType(SymbolType.PARENT_OPEN); - ret = new MBCharToAsciiActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new MBCharToAsciiActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case MBCHR: expectedType(SymbolType.PARENT_OPEN); - ret = new MBAsciiToCharActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new MBAsciiToCharActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case MBLENGTH: expectedType(SymbolType.PARENT_OPEN); - ret = new MBStringLengthActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new MBStringLengthActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case MBSUBSTRING: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem val1 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem val1 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem index1 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem index1 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem len1 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem len1 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); ret = new MBStringExtractActionItem(null, null, val1, index1, len1); break; case SUBSTR: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem val2 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem val2 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem index2 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem index2 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem len2 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem len2 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); ret = new StringExtractActionItem(null, null, val2, index2, len2); break; case LENGTH: expectedType(SymbolType.PARENT_OPEN); - ret = new StringLengthActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new StringLengthActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case RANDOM: expectedType(SymbolType.PARENT_OPEN); - ret = new RandomNumberActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new RandomNumberActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case INT: expectedType(SymbolType.PARENT_OPEN); - ret = new ToIntegerActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new ToIntegerActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case NUMBER_OP: @@ -487,10 +490,10 @@ public class ActionScript2Parser { lexer.pushback(s); VariableActionItem vi = new VariableActionItem(sopn.value.toString(), null, false); variables.add(vi); - ret = vi; //memberOrCall(vi, inFunction, inMethod, variables); + ret = vi; //memberOrCall(vi, inFunction, inMethod, variables, functions); } else { expected(s, lexer.yyline(), SymbolType.PARENT_OPEN); - ret = new ToNumberActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new ToNumberActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); } break; @@ -501,31 +504,31 @@ public class ActionScript2Parser { lexer.pushback(s); VariableActionItem vi2 = new VariableActionItem(sop.value.toString(), null, false); variables.add(vi2); - ret = vi2; //memberOrCall(vi2, inFunction, inMethod, variables); + ret = vi2; //memberOrCall(vi2, inFunction, inMethod, variables, functions); } else { expected(s, lexer.yyline(), SymbolType.PARENT_OPEN); - ret = new ToStringActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new ToStringActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); - //ret = memberOrCall(ret, inFunction, inMethod, variables); + //ret = memberOrCall(ret, inFunction, inMethod, variables, functions); } break; case ORD: expectedType(SymbolType.PARENT_OPEN); - ret = new CharToAsciiActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new CharToAsciiActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case CHR: expectedType(SymbolType.PARENT_OPEN); - ret = new AsciiToCharActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new AsciiToCharActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case DUPLICATEMOVIECLIP: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem src3 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem src3 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem tar3 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem tar3 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem dep3 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem dep3 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); ret = new CloneSpriteActionItem(null, null, src3, tar3, dep3); break; @@ -543,7 +546,7 @@ public class ActionScript2Parser { return ret; } - private GraphTargetItem command(boolean inFunction, boolean inMethod, int forinlevel, boolean mustBeCommand, List variables) throws IOException, ActionParseException { + private GraphTargetItem command(boolean inFunction, boolean inMethod, int forinlevel, boolean mustBeCommand, List variables, List functions) throws IOException, ActionParseException { LexBufferer buf = new LexBufferer(); lexer.addListener(buf); GraphTargetItem ret = null; @@ -557,43 +560,43 @@ public class ActionScript2Parser { switch (s.type) { case FSCOMMAND: expectedType(SymbolType.PARENT_OPEN); - ret = new FSCommandActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new FSCommandActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); break; case CALL: expectedType(SymbolType.PARENT_OPEN); - ret = new CallActionItem(null, null, (expression(inFunction, inMethod, true, variables))); + ret = new CallActionItem(null, null, (expression(inFunction, inMethod, true, variables, functions))); expectedType(SymbolType.PARENT_CLOSE); break; case LENGTH: expectedType(SymbolType.PARENT_OPEN); - ret = new StringLengthActionItem(null, null, (expression(inFunction, inMethod, true, variables))); + ret = new StringLengthActionItem(null, null, (expression(inFunction, inMethod, true, variables, functions))); expectedType(SymbolType.PARENT_CLOSE); break; case MBLENGTH: expectedType(SymbolType.PARENT_OPEN); - ret = new MBStringLengthActionItem(null, null, (expression(inFunction, inMethod, true, variables))); + ret = new MBStringLengthActionItem(null, null, (expression(inFunction, inMethod, true, variables, functions))); expectedType(SymbolType.PARENT_CLOSE); break; case SET: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem name1 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem name1 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem value1 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem value1 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); ret = new SetVariableActionItem(null, null, name1, value1); break; case WITH: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem wvar = expression(inFunction, inMethod, false, variables);//(variable(inFunction, inMethod, variables)); + GraphTargetItem wvar = expression(inFunction, inMethod, false, variables, functions);//(variable(inFunction, inMethod, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); expectedType(SymbolType.CURLY_OPEN); - List wcmd = commands(inFunction, inMethod, forinlevel, variables); + List wcmd = commands(inFunction, inMethod, forinlevel, variables, functions); expectedType(SymbolType.CURLY_CLOSE); ret = new WithActionItem(null, null, wvar, wcmd); break; case DELETE: - GraphTargetItem varDel = expression(inFunction, inMethod, false, variables);//variable(inFunction, inMethod, variables); + GraphTargetItem varDel = expression(inFunction, inMethod, false, variables, functions);//variable(inFunction, inMethod, variables, functions); if (varDel instanceof GetMemberActionItem) { GetMemberActionItem gm = (GetMemberActionItem) varDel; ret = new DeleteActionItem(null, null, gm.object, gm.memberName); @@ -606,19 +609,19 @@ public class ActionScript2Parser { break; case TRACE: expectedType(SymbolType.PARENT_OPEN); - ret = new TraceActionItem(null, null, (expression(inFunction, inMethod, true, variables))); + ret = new TraceActionItem(null, null, (expression(inFunction, inMethod, true, variables, functions))); expectedType(SymbolType.PARENT_CLOSE); break; case GETURL: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem url = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem url = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); expected(s, lexer.yyline(), SymbolType.PARENT_CLOSE, SymbolType.COMMA); int getuMethod = 1; GraphTargetItem target; if (s.type == SymbolType.COMMA) { - target = (expression(inFunction, inMethod, true, variables)); + target = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (s.type == SymbolType.COMMA) { s = lex(); @@ -642,11 +645,11 @@ public class ActionScript2Parser { break; case GOTOANDSTOP: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem gtsFrame = expression(inFunction, inMethod, true, variables); + GraphTargetItem gtsFrame = expression(inFunction, inMethod, true, variables, functions); s = lex(); if (s.type == SymbolType.COMMA) { //Handle scene? lex(); - gtsFrame = expression(inFunction, inMethod, true, variables); + gtsFrame = expression(inFunction, inMethod, true, variables, functions); } else { lexer.pushback(s); } @@ -670,10 +673,10 @@ public class ActionScript2Parser { break; case TELLTARGET: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem tellTarget = expression(inFunction, inMethod, true, variables); + GraphTargetItem tellTarget = expression(inFunction, inMethod, true, variables, functions); expectedType(SymbolType.PARENT_CLOSE); expectedType(SymbolType.CURLY_OPEN); - List tellcmds = commands(inFunction, inMethod, forinlevel, variables); + List tellcmds = commands(inFunction, inMethod, forinlevel, variables, functions); expectedType(SymbolType.CURLY_CLOSE); ret = new TellTargetActionItem(null, null, tellTarget, tellcmds); break; @@ -701,7 +704,7 @@ public class ActionScript2Parser { case TARGETPATH: expectedType(SymbolType.PARENT_OPEN); - ret = new TargetPathActionItem(null, null, (expression(inFunction, inMethod, true, variables))); + ret = new TargetPathActionItem(null, null, (expression(inFunction, inMethod, true, variables, functions))); expectedType(SymbolType.PARENT_CLOSE); break; @@ -709,7 +712,7 @@ public class ActionScript2Parser { case UNLOADMOVIENUM: SymbolType unloadType = s.type; expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem unTargetOrNum = expression(inFunction, inMethod, true, variables); + GraphTargetItem unTargetOrNum = expression(inFunction, inMethod, true, variables, functions); expectedType(SymbolType.PARENT_CLOSE); if (unloadType == SymbolType.UNLOADMOVIE) { ret = new UnLoadMovieActionItem(null, null, unTargetOrNum); @@ -724,9 +727,9 @@ public class ActionScript2Parser { case PRINTNUM: SymbolType printType = s.type; expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem printTarget = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem printTarget = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem printBBox = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem printBBox = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); switch (printType) { @@ -750,9 +753,9 @@ public class ActionScript2Parser { case LOADMOVIENUM: SymbolType loadType = s.type; expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem url2 = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem url2 = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.COMMA); - GraphTargetItem targetOrNum = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem targetOrNum = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); expected(s, lexer.yyline(), SymbolType.PARENT_CLOSE, SymbolType.COMMA); @@ -788,11 +791,11 @@ public class ActionScript2Parser { break; case GOTOANDPLAY: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem gtpFrame = expression(inFunction, inMethod, true, variables); + GraphTargetItem gtpFrame = expression(inFunction, inMethod, true, variables, functions); s = lex(); if (s.type == SymbolType.COMMA) { //Handle scene? lex(); - gtpFrame = expression(inFunction, inMethod, true, variables); + gtpFrame = expression(inFunction, inMethod, true, variables, functions); } else { lexer.pushback(s); } @@ -802,12 +805,12 @@ public class ActionScript2Parser { case REMOVEMOVIECLIP: expectedType(SymbolType.PARENT_OPEN); - ret = new RemoveSpriteActionItem(null, null, (expression(inFunction, inMethod, true, variables))); + ret = new RemoveSpriteActionItem(null, null, (expression(inFunction, inMethod, true, variables, functions))); expectedType(SymbolType.PARENT_CLOSE); break; case STARTDRAG: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem dragTarget = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem dragTarget = (expression(inFunction, inMethod, true, variables, functions)); GraphTargetItem lockCenter; GraphTargetItem constrain; GraphTargetItem x1 = null; @@ -816,20 +819,20 @@ public class ActionScript2Parser { GraphTargetItem y2 = null; s = lex(); if (s.type == SymbolType.COMMA) { - lockCenter = (expression(inFunction, inMethod, true, variables)); + lockCenter = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (s.type == SymbolType.COMMA) { constrain = new DirectValueActionItem(null, null, 0, 1L, new ArrayList<>()); - x1 = (expression(inFunction, inMethod, true, variables)); + x1 = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (s.type == SymbolType.COMMA) { - y1 = (expression(inFunction, inMethod, true, variables)); + y1 = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (s.type == SymbolType.COMMA) { - x2 = (expression(inFunction, inMethod, true, variables)); + x2 = (expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (s.type == SymbolType.COMMA) { - y2 = (expression(inFunction, inMethod, true, variables)); + y2 = (expression(inFunction, inMethod, true, variables, functions)); } else { lexer.pushback(s); y2 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); @@ -862,10 +865,10 @@ public class ActionScript2Parser { case IFFRAMELOADED: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem iflExpr = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem iflExpr = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); expectedType(SymbolType.CURLY_OPEN); - List iflComs = commands(inFunction, inMethod, forinlevel, variables); + List iflComs = commands(inFunction, inMethod, forinlevel, variables, functions); expectedType(SymbolType.CURLY_CLOSE); ret = new IfFrameLoadedActionItem(iflExpr, iflComs, null, null); break; @@ -886,7 +889,7 @@ public class ActionScript2Parser { } while (s.type == SymbolType.COMMA); } expected(s, lexer.yyline(), SymbolType.CURLY_OPEN); - ret = (traits(false, classTypeStr, extendsTypeStr, implementsTypeStrs, variables)); + ret = (traits(false, classTypeStr, extendsTypeStr, implementsTypeStrs, variables, functions)); expectedType(SymbolType.CURLY_CLOSE); break; case INTERFACE: @@ -902,13 +905,13 @@ public class ActionScript2Parser { } while (s.type == SymbolType.COMMA); } expected(s, lexer.yyline(), SymbolType.CURLY_OPEN); - ret = (traits(true, interfaceTypeStr, null, intExtendsTypeStrs, variables)); + ret = (traits(true, interfaceTypeStr, null, intExtendsTypeStrs, variables, functions)); expectedType(SymbolType.CURLY_CLOSE); break; case FUNCTION: s = lexer.lex(); expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolGroup.GLOBALFUNC); - ret = (function(true, s.value.toString(), false, variables)); + ret = (function(true, s.value.toString(), false, variables, functions)); break; case VAR: s = lex(); @@ -922,7 +925,7 @@ public class ActionScript2Parser { } if (s.type == SymbolType.ASSIGN) { - GraphTargetItem varval = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem varval = (expression(inFunction, inMethod, true, variables, functions)); ret = new VariableActionItem(varIdentifier, varval, true); variables.add((VariableActionItem) ret); } else { @@ -932,12 +935,12 @@ public class ActionScript2Parser { } break; case CURLY_OPEN: - ret = new BlockItem(null, null, commands(inFunction, inMethod, forinlevel, variables)); + ret = new BlockItem(null, null, commands(inFunction, inMethod, forinlevel, variables, functions)); expectedType(SymbolType.CURLY_CLOSE); break; case INCREMENT: //preincrement case DECREMENT: //predecrement - GraphTargetItem varincdec = expression(inFunction, inMethod, false, variables); + GraphTargetItem varincdec = expression(inFunction, inMethod, false, variables, functions); if (s.type == SymbolType.INCREMENT) { ret = new PreIncrementActionItem(null, null, varincdec); } else if (s.type == SymbolType.DECREMENT) { @@ -947,7 +950,7 @@ public class ActionScript2Parser { case SUPER: //constructor call ParsedSymbol ss2 = lex(); if (ss2.type == SymbolType.PARENT_OPEN) { - List args = call(inFunction, inMethod, variables); + List args = call(inFunction, inMethod, variables, functions); VariableActionItem supItem = new VariableActionItem(s.value.toString(), null, false); variables.add(supItem); ret = new CallMethodActionItem(null, null, supItem, new DirectValueActionItem(null, null, 0, Undefined.INSTANCE, constantPool), args); @@ -958,16 +961,16 @@ public class ActionScript2Parser { break; case IF: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem ifExpr = (expression(inFunction, inMethod, true, variables)); + GraphTargetItem ifExpr = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); - GraphTargetItem onTrue = command(inFunction, inMethod, forinlevel, true, variables); + GraphTargetItem onTrue = command(inFunction, inMethod, forinlevel, true, variables, functions); List onTrueList = new ArrayList<>(); onTrueList.add(onTrue); s = lex(); List onFalseList = null; if (s.type == SymbolType.ELSE) { onFalseList = new ArrayList<>(); - onFalseList.add(command(inFunction, inMethod, forinlevel, true, variables)); + onFalseList.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); } else { lexer.pushback(s); } @@ -976,19 +979,19 @@ public class ActionScript2Parser { case WHILE: expectedType(SymbolType.PARENT_OPEN); List whileExpr = new ArrayList<>(); - whileExpr.add(commaExpression(inFunction, inMethod, forinlevel, variables)); + whileExpr.add(commaExpression(inFunction, inMethod, forinlevel, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); List whileBody = new ArrayList<>(); - whileBody.add(command(inFunction, inMethod, forinlevel, true, variables)); + whileBody.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); ret = new WhileItem(null, null, null, whileExpr, whileBody); break; case DO: List doBody = new ArrayList<>(); - doBody.add(command(inFunction, inMethod, forinlevel, true, variables)); + doBody.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); expectedType(SymbolType.WHILE); expectedType(SymbolType.PARENT_OPEN); List doExpr = new ArrayList<>(); - doExpr.add(commaExpression(inFunction, inMethod, forinlevel, variables)); + doExpr.add(commaExpression(inFunction, inMethod, forinlevel, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); ret = new DoWhileItem(null, null, null, doBody, doExpr); break; @@ -1049,7 +1052,7 @@ public class ActionScript2Parser { variables.add(item); - collection = expression(inFunction, inMethod, true, variables); + collection = expression(inFunction, inMethod, true, variables, functions); forin = true; } else { lexer.pushback(s3); @@ -1071,20 +1074,20 @@ public class ActionScript2Parser { GraphTargetItem forExpr = null; List forFirstCommands = new ArrayList<>(); if (!forin) { - GraphTargetItem fc = command(inFunction, inMethod, forinlevel, true, variables); + GraphTargetItem fc = command(inFunction, inMethod, forinlevel, true, variables, functions); if (fc != null) { //can be empty command forFirstCommands.add(fc); } - forExpr = (expression(inFunction, inMethod, true, variables)); + forExpr = (expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.SEMICOLON); - GraphTargetItem fcom = command(inFunction, inMethod, forinlevel, true, variables); + GraphTargetItem fcom = command(inFunction, inMethod, forinlevel, true, variables, functions); if (fcom != null) { forFinalCommands.add(fcom); } } expectedType(SymbolType.PARENT_CLOSE); List forBody = new ArrayList<>(); - forBody.add(command(inFunction, inMethod, forin ? forinlevel + 1 : forinlevel, true, variables)); + forBody.add(command(inFunction, inMethod, forin ? forinlevel + 1 : forinlevel, true, variables, functions)); if (forin) { ret = new ForInActionItem(null, null, null, item, collection, forBody); } else { @@ -1093,7 +1096,7 @@ public class ActionScript2Parser { break; case SWITCH: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem switchExpr = expression(inFunction, inMethod, true, variables); + GraphTargetItem switchExpr = expression(inFunction, inMethod, true, variables, functions); expectedType(SymbolType.PARENT_CLOSE); expectedType(SymbolType.CURLY_OPEN); s = lex(); @@ -1114,7 +1117,7 @@ public class ActionScript2Parser { while (s.type == SymbolType.CASE || s.type == SymbolType.DEFAULT) { //List caseExprs; = new ArrayList<>(); while (s.type == SymbolType.CASE || s.type == SymbolType.DEFAULT) { - GraphTargetItem curCaseExpr = s.type == SymbolType.DEFAULT ? new DefaultItem() : expression(inFunction, inMethod, true, variables); + GraphTargetItem curCaseExpr = s.type == SymbolType.DEFAULT ? new DefaultItem() : expression(inFunction, inMethod, true, variables, functions); //caseExprs.add(curCaseExpr); expectedType(SymbolType.COLON); s = lex(); @@ -1123,7 +1126,7 @@ public class ActionScript2Parser { } pos++; lexer.pushback(s); - List caseCmd = commands(inFunction, inMethod, forinlevel, variables); + List caseCmd = commands(inFunction, inMethod, forinlevel, variables, functions); caseCmds.add(caseCmd); s = lex(); } @@ -1137,7 +1140,7 @@ public class ActionScript2Parser { ret = new ContinueItem(null, null, 0); //? There is no more than 1 level continue/break in AS1/2 break; case RETURN: - GraphTargetItem retexpr = expression(inFunction, inMethod, true, variables); + GraphTargetItem retexpr = expression(inFunction, inMethod, true, variables, functions); if (retexpr == null) { retexpr = new DirectValueActionItem(null, null, 0, Undefined.INSTANCE, new ArrayList<>()); } @@ -1145,7 +1148,7 @@ public class ActionScript2Parser { break; case TRY: List tryCommands = new ArrayList<>(); - tryCommands.add(command(inFunction, inMethod, forinlevel, true, variables)); + tryCommands.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); s = lex(); boolean found = false; List> catchCommands = null; @@ -1158,7 +1161,7 @@ public class ActionScript2Parser { expectedType(SymbolType.PARENT_CLOSE); catchCommands = new ArrayList<>(); List cc = new ArrayList<>(); - cc.add(command(inFunction, inMethod, forinlevel, true, variables)); + cc.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); catchCommands.add(cc); s = lex(); found = true; @@ -1166,7 +1169,7 @@ public class ActionScript2Parser { List finallyCommands = null; if (s.type == SymbolType.FINALLY) { finallyCommands = new ArrayList<>(); - finallyCommands.add(command(inFunction, inMethod, forinlevel, true, variables)); + finallyCommands.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); found = true; s = lex(); } @@ -1177,7 +1180,7 @@ public class ActionScript2Parser { ret = new TryActionItem(tryCommands, catchExceptions, catchCommands, finallyCommands); break; case THROW: - ret = new ThrowActionItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new ThrowActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); break; case SEMICOLON: //empty command if (debugMode) { @@ -1185,13 +1188,13 @@ public class ActionScript2Parser { } return null; default: - GraphTargetItem valcmd = expressionCommands(s, inFunction, inMethod, forinlevel, variables); + GraphTargetItem valcmd = expressionCommands(s, inFunction, inMethod, forinlevel, variables, functions); if (valcmd != null) { ret = valcmd; break; } lexer.pushback(s); - ret = expression(inFunction, inMethod, true, variables); + ret = expression(inFunction, inMethod, true, variables, functions); } if (debugMode) { System.out.println("/command"); @@ -1199,7 +1202,7 @@ public class ActionScript2Parser { lexer.removeListener(buf); if (ret == null) { //can be popped expression buf.pushAllBack(lexer); - ret = expression(inFunction, inMethod, true, variables); + ret = expression(inFunction, inMethod, true, variables, functions); } s = lex(); if ((s != null) && (s.type != SymbolType.SEMICOLON)) { @@ -1210,15 +1213,15 @@ public class ActionScript2Parser { } - private GraphTargetItem expression(boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, ActionParseException { + private GraphTargetItem expression(boolean inFunction, boolean inMethod, boolean allowRemainder, List variables, List functions) throws IOException, ActionParseException { if (debugMode) { System.out.println("expression:"); } - GraphTargetItem prim = expressionPrimary(false, inFunction, inMethod, allowRemainder, variables); + GraphTargetItem prim = expressionPrimary(false, inFunction, inMethod, allowRemainder, variables, functions); if (prim == null) { return null; } - GraphTargetItem ret = expression1(prim, GraphTargetItem.NOPRECEDENCE, inFunction, inMethod, allowRemainder, variables); + GraphTargetItem ret = expression1(prim, GraphTargetItem.NOPRECEDENCE, inFunction, inMethod, allowRemainder, variables, functions); if (debugMode) { System.out.println("/expression"); } @@ -1258,7 +1261,7 @@ public class ActionScript2Parser { return s.type.getPrecedence(); } - private GraphTargetItem expression1(GraphTargetItem lhs, int min_precedence, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, ActionParseException { + private GraphTargetItem expression1(GraphTargetItem lhs, int min_precedence, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables, List functions) throws IOException, ActionParseException { ParsedSymbol op; GraphTargetItem rhs; GraphTargetItem mhs = null; @@ -1278,14 +1281,14 @@ public class ActionScript2Parser { if (debugMode) { System.out.println("ternar-middle:"); } - mhs = expression(inFunction, inMethod, allowRemainder, variables); + mhs = expression(inFunction, inMethod, allowRemainder, variables, functions); expectedType(SymbolType.COLON); if (debugMode) { System.out.println("/ternar-middle"); } } - rhs = expressionPrimary(allowRemainder, inFunction, inMethod, allowRemainder, variables); + rhs = expressionPrimary(allowRemainder, inFunction, inMethod, allowRemainder, variables, functions); if (rhs == null) { lexer.pushback(op); break; @@ -1294,7 +1297,7 @@ public class ActionScript2Parser { lookahead = peekLex(); while ((isBinaryOperator(lookahead) && getSymbPrecedence(lookahead) < /* > on wiki */ getSymbPrecedence(op)) || (lookahead.type.isRightAssociative() && getSymbPrecedence(lookahead) == getSymbPrecedence(op))) { - rhs = expression1(rhs, getSymbPrecedence(lookahead), inFunction, inMethod, allowRemainder, variables); + rhs = expression1(rhs, getSymbPrecedence(lookahead), inFunction, inMethod, allowRemainder, variables, functions); lookahead = peekLex(); } @@ -1489,7 +1492,7 @@ public class ActionScript2Parser { default: if (lhs instanceof ParenthesisItem) { if (isType(((ParenthesisItem) lhs).value)) { - GraphTargetItem expr2 = expression(inFunction, inMethod, true, variables); + GraphTargetItem expr2 = expression(inFunction, inMethod, true, variables, functions); if (expr2 != null) { lhs = new CastOpActionItem(null, null, ((ParenthesisItem) lhs).value, expr2); } @@ -1512,7 +1515,7 @@ public class ActionScript2Parser { return (item instanceof VariableActionItem); } - private int brackets(List ret, boolean inFunction, boolean inMethod, List variables) throws IOException, ActionParseException { + private int brackets(List ret, boolean inFunction, boolean inMethod, List variables, List functions) throws IOException, ActionParseException { ParsedSymbol s = lex(); int arrCnt = 0; if (s.type == SymbolType.BRACKET_OPEN) { @@ -1523,7 +1526,7 @@ public class ActionScript2Parser { lexer.pushback(s); } arrCnt++; - ret.add(expression(inFunction, inMethod, true, variables)); + ret.add(expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (!s.isType(SymbolType.COMMA, SymbolType.BRACKET_CLOSE)) { expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.BRACKET_CLOSE); @@ -1536,12 +1539,12 @@ public class ActionScript2Parser { return arrCnt; } - private GraphTargetItem commaExpression(boolean inFunction, boolean inMethod, int forInLevel, List variables) throws IOException, ActionParseException { + private GraphTargetItem commaExpression(boolean inFunction, boolean inMethod, int forInLevel, List variables, List functions) throws IOException, ActionParseException { GraphTargetItem cmd = null; List expr = new ArrayList<>(); ParsedSymbol s; do { - cmd = command(inFunction, inMethod, forInLevel, false, variables); + cmd = command(inFunction, inMethod, forInLevel, false, variables, functions); if (cmd != null) { expr.add(cmd); } @@ -1549,14 +1552,14 @@ public class ActionScript2Parser { } while (s.type == SymbolType.COMMA && cmd != null); lexer.pushback(s); if (cmd == null) { - expr.add(expression(inFunction, inMethod, true, variables)); + expr.add(expression(inFunction, inMethod, true, variables, functions)); } else if (!cmd.hasReturnValue()) { throw new ActionParseException("Expression expected", lexer.yyline()); } return new CommaExpressionItem(null, null, expr); } - private GraphTargetItem expressionPrimary(boolean allowEmpty, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, ActionParseException { + private GraphTargetItem expressionPrimary(boolean allowEmpty, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables, List functions) throws IOException, ActionParseException { if (debugMode) { System.out.println("primary:"); } @@ -1570,14 +1573,14 @@ public class ActionScript2Parser { switch ("" + s.value) { //AS 1/2: case "enumerate": - ret = new EnumerateActionItem(null, null, expression(inFunction, inMethod, allowRemainder, variables)); + ret = new EnumerateActionItem(null, null, expression(inFunction, inMethod, allowRemainder, variables, functions)); break; //Both ASs case "dup": - ret = new DuplicateItem(null, null, expression(inFunction, inMethod, allowRemainder, variables)); + ret = new DuplicateItem(null, null, expression(inFunction, inMethod, allowRemainder, variables, functions)); break; case "push": - ret = new PushItem(expression(inFunction, inMethod, allowRemainder, variables)); + ret = new PushItem(expression(inFunction, inMethod, allowRemainder, variables, functions)); break; case "pop": ret = new PopItem(null, null); @@ -1592,7 +1595,7 @@ public class ActionScript2Parser { break; case NEGATE: versionRequired(s, 5); - ret = expressionPrimary(false, inFunction, inMethod, false, variables); + ret = expressionPrimary(false, inFunction, inMethod, false, variables, functions); ret = new BitXorActionItem(null, null, ret, new DirectValueActionItem(4.294967295E9)); break; @@ -1606,7 +1609,7 @@ public class ActionScript2Parser { } else { lexer.pushback(s); - GraphTargetItem num = expressionPrimary(false, inFunction, inMethod, true, variables); + GraphTargetItem num = expressionPrimary(false, inFunction, inMethod, true, variables, functions); if ((num instanceof DirectValueActionItem) && (((DirectValueActionItem) num).value instanceof Long)) { ((DirectValueActionItem) num).value = -(Long) ((DirectValueActionItem) num).value; @@ -1630,7 +1633,7 @@ public class ActionScript2Parser { } break; case TYPEOF: - ret = new TypeOfActionItem(null, null, expressionPrimary(false, inFunction, inMethod, false, variables)); + ret = new TypeOfActionItem(null, null, expressionPrimary(false, inFunction, inMethod, false, variables, functions)); allowMemberOrCall = true; break; case TRUE: @@ -1660,7 +1663,7 @@ public class ActionScript2Parser { expected(s, lexer.yyline(), SymbolType.IDENTIFIER); objectNames.add(0, pushConst((String) s.value)); expectedType(SymbolType.COLON); - objectValues.add(0, expression(inFunction, inMethod, true, variables)); + objectValues.add(0, expression(inFunction, inMethod, true, variables, functions)); s = lex(); if (!s.isType(SymbolType.COMMA, SymbolType.CURLY_CLOSE)) { expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.CURLY_CLOSE); @@ -1672,7 +1675,7 @@ public class ActionScript2Parser { case BRACKET_OPEN: //Array literal or just brackets lexer.pushback(s); List inBrackets = new ArrayList<>(); - int arrCnt = brackets(inBrackets, inFunction, inMethod, variables); + int arrCnt = brackets(inBrackets, inFunction, inMethod, variables, functions); ret = new InitArrayActionItem(null, null, inBrackets); allowMemberOrCall = true; break; @@ -1684,7 +1687,7 @@ public class ActionScript2Parser { } else { lexer.pushback(s); } - ret = function(true, fname, false, variables); + ret = function(true, fname, false, variables, functions); allowMemberOrCall = true; break; case STRING: @@ -1709,7 +1712,7 @@ public class ActionScript2Parser { break; case DELETE: - GraphTargetItem varDel = expressionPrimary(false, inFunction, inMethod, false, variables); + GraphTargetItem varDel = expressionPrimary(false, inFunction, inMethod, false, variables, functions); if (varDel instanceof GetMemberActionItem) { GetMemberActionItem gm = (GetMemberActionItem) varDel; ret = new DeleteActionItem(null, null, gm.object, gm.memberName); @@ -1719,7 +1722,7 @@ public class ActionScript2Parser { break; case INCREMENT: case DECREMENT: //preincrement - GraphTargetItem prevar = expressionPrimary(false, inFunction, inMethod, false, variables);//variable(inFunction, inMethod, variables); + GraphTargetItem prevar = expressionPrimary(false, inFunction, inMethod, false, variables, functions);//variable(inFunction, inMethod, variables, functions); if (s.type == SymbolType.INCREMENT) { ret = new PreIncrementActionItem(null, null, prevar); } @@ -1729,17 +1732,17 @@ public class ActionScript2Parser { break; case NOT: - ret = new NotItem(null, null, expressionPrimary(false, inFunction, inMethod, false, variables)); + ret = new NotItem(null, null, expressionPrimary(false, inFunction, inMethod, false, variables, functions)); break; case PARENT_OPEN: - ret = new ParenthesisItem(null, null, expression(inFunction, inMethod, true, variables)); + ret = new ParenthesisItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); - //ret = memberOrCall(ret, inFunction, inMethod, variables); + //ret = memberOrCall(ret, inFunction, inMethod, variables, functions); allowMemberOrCall = true; break; case NEW: - GraphTargetItem newvar = expressionPrimary(false, inFunction, inMethod, false, variables);//variable(inFunction, inMethod, variables); + GraphTargetItem newvar = expressionPrimary(false, inFunction, inMethod, false, variables, functions);//variable(inFunction, inMethod, variables, functions); if (newvar instanceof CallMethodActionItem) { CallMethodActionItem ca = (CallMethodActionItem) newvar; ret = new NewMethodActionItem(null, null, ca.scriptObject, ca.methodName, ca.arguments); @@ -1753,9 +1756,9 @@ public class ActionScript2Parser { break; case EVAL: expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem evar = new EvalActionItem(null, null, expression(inFunction, inMethod, true, variables)); + GraphTargetItem evar = new EvalActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); expectedType(SymbolType.PARENT_CLOSE); - //evar = memberOrCall(evar, inFunction, inMethod, variables); + //evar = memberOrCall(evar, inFunction, inMethod, variables, functions); ret = evar; allowMemberOrCall = true; @@ -1764,7 +1767,7 @@ public class ActionScript2Parser { case THIS: case SUPER: if (s.value.equals("not")) { - ret = new NotItem(null, null, expressionPrimary(false, inFunction, inMethod, false, variables)); + ret = new NotItem(null, null, expressionPrimary(false, inFunction, inMethod, false, variables, functions)); } else { ret = new VariableActionItem(s.value.toString(), null, false); variables.add((VariableActionItem) ret); @@ -1773,7 +1776,7 @@ public class ActionScript2Parser { break; default: - GraphTargetItem excmd = expressionCommands(s, inFunction, inMethod, -1, variables); + GraphTargetItem excmd = expressionCommands(s, inFunction, inMethod, -1, variables, functions); if (excmd != null) { //? ret = excmd; @@ -1784,7 +1787,7 @@ public class ActionScript2Parser { } if (allowMemberOrCall && ret != null) { - ret = memberOrCall(ret, inFunction, inMethod, variables); + ret = memberOrCall(ret, inFunction, inMethod, variables, functions); } if (debugMode) { System.out.println("/primary"); @@ -1792,11 +1795,11 @@ public class ActionScript2Parser { return ret; } - private GraphTargetItem memberOrCall(GraphTargetItem ret, boolean inFunction, boolean inMethod, List variables) throws IOException, ActionParseException { + private GraphTargetItem memberOrCall(GraphTargetItem ret, boolean inFunction, boolean inMethod, List variables, List functions) throws IOException, ActionParseException { ParsedSymbol op = lex(); while (op.isType(SymbolType.PARENT_OPEN, SymbolType.BRACKET_OPEN, SymbolType.DOT)) { if (op.type == SymbolType.PARENT_OPEN) { - List args = call(inFunction, inMethod, variables); + List args = call(inFunction, inMethod, variables, functions); if (ret instanceof GetMemberActionItem) { GetMemberActionItem mem = (GetMemberActionItem) ret; ret = new CallMethodActionItem(null, null, mem.object, mem.memberName, args); @@ -1808,7 +1811,7 @@ public class ActionScript2Parser { } } if (op.type == SymbolType.BRACKET_OPEN) { - GraphTargetItem rhs = expression(inFunction, inMethod, false, variables); + GraphTargetItem rhs = expression(inFunction, inMethod, false, variables, functions); ret = new GetMemberActionItem(null, null, ret, rhs); expectedType(SymbolType.BRACKET_CLOSE); } @@ -1851,7 +1854,8 @@ public class ActionScript2Parser { lexer = new ActionScriptLexer(new StringReader(str)); List vars = new ArrayList<>(); - retTree.addAll(commands(false, false, 0, vars)); + List functions = new ArrayList<>(); + retTree.addAll(commands(false, false, 0, vars, functions)); for (VariableActionItem v : vars) { String varName = v.getVariableName(); GraphTargetItem stored = v.getStoreValue(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index b2ce733c4..febab9b1f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -170,7 +170,14 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta @Override public void translateContainer(List> content, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions) { - FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, 1, new ArrayList<>()); + List funcList = new ArrayList<>(); + for (String key : functions.keySet()) { + GraphTargetItem val = functions.get(key); + if (val instanceof FunctionActionItem) { + funcList.add((FunctionActionItem) val); + } + } + FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, 1, new ArrayList<>(), funcList); //ActionGraph.translateViaGraph(regNames, variables, functions, code, version) stack.push(fti); functions.put(functionName, fti); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 80f653bf4..abdc9988c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -310,7 +310,14 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont @Override public void translateContainer(List> content, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions) { - FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, getFirstRegister(), new ArrayList<>()); + List funcList = new ArrayList<>(); + for (String key : functions.keySet()) { + GraphTargetItem val = functions.get(key); + if (val instanceof FunctionActionItem) { + funcList.add((FunctionActionItem) val); + } + } + FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, getFirstRegister(), new ArrayList<>(), funcList); functions.put(functionName, fti); stack.push(fti); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java new file mode 100644 index 000000000..b0651009a --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2CompilerTest.java @@ -0,0 +1,151 @@ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.parser.ActionParseException; +import com.jpexs.decompiler.flash.action.parser.script.ActionScript2Parser; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.DoActionTag; +import com.jpexs.decompiler.flash.tags.base.ASMSource; +import com.jpexs.decompiler.graph.CompilationException; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.testng.Assert; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript2CompilerTest extends ActionScript2TestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + //Main.initLogging(false); + Configuration.autoDeobfuscate.set(false); + Configuration.simplifyExpressions.set(false); + Configuration.decompile.set(true); + Configuration.registerNameFormat.set("_loc%d_"); + swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2/as2.swf")), false); + } + + private void testCompilation(String sourceAsToCompile, String expectedPCode) { + try { + SWF swf = new SWF(); + ASMSource asm = new DoActionTag(swf); + + ActionScript2Parser par = new ActionScript2Parser(swf.version); + try { + asm.setActions(par.actionsFromString(sourceAsToCompile)); + } catch (ActionParseException | CompilationException ex) { + fail("Unable to parse: " + sourceAsToCompile + "/" + asm.toString(), ex); + } + + asm.setActionBytes(Action.actionsToBytes(asm.getActions(), true, swf.version)); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + asm.getASMSource(ScriptExportMode.PCODE, writer, asm.getActions()); + String actualResult = normalizeLabels(writer.toString()); + actualResult = cleanPCode(actualResult); + String expectedResult = cleanPCode(expectedPCode); + + Assert.assertEquals(actualResult, expectedResult); + } catch (IOException | InterruptedException ex) { + fail(); + } + + } + + private String normalizeLabels(String actions) { + int labelCnt = 1; + while (true) { + Pattern pattern = Pattern.compile("^([a-z][0-9a-z]+):", Pattern.MULTILINE); + Matcher matcher = pattern.matcher(actions); + if (matcher.find()) { + String str = matcher.group(1); + actions = actions.replaceAll(str, "label_" + labelCnt++); + } else { + break; + } + } + return actions; + } + + @Test + public void variableInInnerFuncMustNotBeStoredInRegister() { + testCompilation("function outfunc() {\n" + + " var v1 = function (){\n" + + " var a = 1;\n" + + " var v3 = 2;\n" + + " \n" + + " var v4 = function (){\n" + + " var v5 = a + 3;\n" + + " }\n" + + " }\n" + + "}", "ConstantPool \"v1\" \"a\"\n" + + "DefineFunction \"outfunc\" 0 {\n" + + "Push \"v1\"\n" + + "DefineFunction2 \"\" 0 3 false false true false true false true false false {\n" + + "Push \"a\" 1\n" + + "DefineLocal\n" //critical + + "Push 2\n" + + "StoreRegister 1\n" + + "Pop\n" + + "DefineFunction2 \"\" 0 2 false false true false true false true false false {\n" + + "Push \"a\"\n" + + "GetVariable\n" + + "Push 3\n" + + "Add2\n" + + "StoreRegister 1\n" + + "Pop\n" + + "}\n" + + "StoreRegister 2\n" + + "Pop\n" + + "}\n" + + "DefineLocal\n" + + "}"); + } + + @Test + public void parameterInInnerFuncMustNotBeStoredInRegister() { + testCompilation("function outfunc() {\n" + + " var g = function (a,p2){\n" + + " var v1 = a + 1 + p2;\n" + + " \n" + + " var f = function (){\n" + + " var v2 = a + 2;\n" + + " }\n" + + " }\n" + + "}", "ConstantPool \"g\" \"a\"\n" + + "DefineFunction \"outfunc\" 0 {\n" + + "Push \"g\"\n" + + "DefineFunction2 \"\" 2 4 false false true false true false true false false 0 \"a\" 1 \"p2\" {\n" + + "Push \"a\"\n" + + "GetVariable\n" //critical + + "Push 1\n" + + "Add2\n" + + "Push register1\n" + + "Add2\n" + + "StoreRegister 2\n" + + "Pop\n" + + "DefineFunction2 \"\" 0 2 false false true false true false true false false {\n" + + "Push \"a\"\n" + + "GetVariable\n" + + "Push 2\n" + + "Add2\n" + + "StoreRegister 1\n" + + "Pop\n" + + "}\n" + + "StoreRegister 3\n" + + "Pop\n" + + "}\n" + + "DefineLocal\n" + + "}"); + } +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index ece0623a0..f3c96ca83 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -845,4 +845,46 @@ public class ActionScript2Test extends ActionScript2TestBase { + "trace(\"afterSwitch\");\r\n" ); } + + public void frame63_functionVariablesTest() { + compareSrc(63, "function outfunc()\r\n" + + "{\r\n" + + "var _loc2_ = function()\r\n" + + "{\r\n" + + "var a = 5;\r\n" + + "var _loc3_ = 6;\r\n" + + "var _loc2_ = function()\r\n" + + "{\r\n" + + "var _loc1_ = a + 2;\r\n" + + "trace(_loc1_);\r\n" + + "return _loc1_;\r\n" + + "};\r\n" + + "return _loc2_();\r\n" + + "};\r\n" + + "return _loc2_();\r\n" + + "}\r\n" + + "trace(\"functionVariablesTest\");\r\n" + ); + } + + @Test + public void frame64_functionInnerParametersTest() { + compareSrc(64, "function outfunc()\r\n" + + "{\r\n" + + "var _loc2_ = function(a, x)\r\n" + + "{\r\n" + + "var _loc3_ = a + 3 + x;\r\n" + + "var _loc2_ = function()\r\n" + + "{\r\n" + + "var _loc1_ = a + 2;\r\n" + + "trace(_loc1_);\r\n" + + "return _loc1_;\r\n" + + "};\r\n" + + "return _loc2_();\r\n" + + "};\r\n" + + "return _loc2_(5,2);\r\n" + + "}\r\n" + + "trace(\"functionInnerParametersTest\");\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index 634514d8341470fbd70e6d44907ef8f4adf35489..72b8eca2ac0e3e6e327561248d696e664c32eaf7 100644 GIT binary patch delta 17549 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 b(j-7lA7u}Jag|H*GSj2cWS;*5%cu!im1WpJ