From 2d3013e16f6f7ce4d49fb50ca2367afccf19f042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 4 Mar 2021 20:58:15 +0100 Subject: [PATCH] Fixed: #1328 AS1/2/3 direct editation - empty commands (just semicolon) --- CHANGELOG.md | 1 + .../parser/script/ActionScript3Parser.java | 9 +++- .../parser/script/ActionScript2Parser.java | 11 +++-- .../decompiler/graph/model/EmptyCommand.java | 44 +++++++++++++++++++ 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/EmptyCommand.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 29e72036a..e38172b0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ All notable changes to this project will be documented in this file. - #1570 Incorrect shape rendering when edge is reversed - #1643 Separate AS1/2 and AS3 editor hilighting - AS3 direct editation - slot/const default values +- #1328 AS1/2/3 direct editation - empty commands (just semicolon) ### Removed - #1631 ActiveX Flash component download in windows installer 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 31de93005..566a98395 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 @@ -102,6 +102,7 @@ import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DefaultItem; import com.jpexs.decompiler.graph.model.DoWhileItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.EmptyCommand; import com.jpexs.decompiler.graph.model.ForItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.NotItem; @@ -111,6 +112,7 @@ import com.jpexs.decompiler.graph.model.PopItem; import com.jpexs.decompiler.graph.model.PushItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.TernarOpItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import com.jpexs.decompiler.graph.model.WhileItem; import com.jpexs.helpers.Helper; @@ -1579,7 +1581,10 @@ public class ActionScript3Parser { } lexer.pushback(s); //GraphTargetItem firstCommand = command(thisType,pkg,needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables); - forExpr = (expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables, false)); + forExpr = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables, false); + if (forExpr == null) { + forExpr = new TrueItem(null,null); + } expectedType(SymbolType.SEMICOLON); GraphTargetItem fcom = command(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables); if (fcom != null) { @@ -1804,7 +1809,7 @@ public class ActionScript3Parser { break; } if (s.type == SymbolType.SEMICOLON) { - return null; + return new EmptyCommand(); } lexer.pushback(s); ret = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables, true); 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 d73e614d5..23e7b3e2b 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 @@ -153,6 +153,7 @@ import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DefaultItem; import com.jpexs.decompiler.graph.model.DoWhileItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.EmptyCommand; import com.jpexs.decompiler.graph.model.ForItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.LocalData; @@ -163,6 +164,7 @@ import com.jpexs.decompiler.graph.model.PopItem; import com.jpexs.decompiler.graph.model.PushItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.TernarOpItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.io.IOException; import java.io.StringReader; @@ -1164,7 +1166,10 @@ public class ActionScript2Parser { if (fc != null) { //can be empty command forFirstCommands.add(fc); } - forExpr = (expression(inFunction, inMethod, true, variables, functions, false)); + forExpr = expression(inFunction, inMethod, true, variables, functions, false); + if (forExpr == null) { + forExpr = new TrueItem(null,null); + } expectedType(SymbolType.SEMICOLON); GraphTargetItem fcom = command(inFunction, inMethod, forinlevel, true, variables, functions); if (fcom != null) { @@ -1283,7 +1288,7 @@ public class ActionScript2Parser { if (debugMode) { System.out.println("/command"); } - return null; + return new EmptyCommand(); default: GraphTargetItem valcmd = expressionCommands(s, inFunction, inMethod, forinlevel, variables, functions); if (valcmd != null) { @@ -1301,7 +1306,7 @@ public class ActionScript2Parser { buf.pushAllBack(lexer); ret = expression(inFunction, inMethod, true, variables, functions, false); } - s = lex(); + s = lex(); if ((s != null) && (s.type != SymbolType.SEMICOLON)) { lexer.pushback(s); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/EmptyCommand.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/EmptyCommand.java new file mode 100644 index 000000000..242d53028 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/EmptyCommand.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2010-2021 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; + +/** + * + * @author JPEXS + */ +public class EmptyCommand extends GraphTargetItem { + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + return writer; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + +}