From 891a0f1ed89ad60462f26adf7d7a894c49b48e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Nov 2021 22:14:30 +0100 Subject: [PATCH] Fixed AS1/2 - Registers in for..in clause, proper define --- CHANGELOG.md | 1 + .../decompiler/flash/action/ActionGraph.java | 7 ++++++- .../action/model/clauses/ForInActionItem.java | 20 ++++++++++++++----- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 192322b4c..7cc2dffa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. - AS1/2 - Slash syntax colon vs ternar operator collision - AS1/2 - Allow nonstandard identifiers in object literal - AS1/2 - Allow globalfunc names as variable identifiers +- AS1/2 - Registers in for..in clause, proper define ## [14.5.2] - 2021-11-20 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 6c461cfb2..1448773bc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -297,7 +297,8 @@ public class ActionGraph extends Graph { checkedLoop = new Loop(localData.loops.size(), null, null); checkedBody.add(new BreakItem(null, null, checkedLoop.id)); } - list.add(t, new ForInActionItem(null, null, checkedLoop, sti.getObject(), eti.object, checkedBody)); + sti.setValue(new DirectValueActionItem(Null.INSTANCE)); + list.add(t, new ForInActionItem(null, null, checkedLoop, (GraphTargetItem) sti/*sti.getObject()*/, eti.object, checkedBody)); list.remove(t - 1); t--; } @@ -360,6 +361,10 @@ public class ActionGraph extends Graph { if (item instanceof TemporaryRegister) { return; } + //can has definition in for in... + if ((ti instanceof ForInActionItem) && (item == ((ForInActionItem) ti).variableName)) { + return; + } if (item instanceof StoreRegisterActionItem) { StoreRegisterActionItem sr = (StoreRegisterActionItem) item; if (sr.define) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java index 85c6acc44..384583c73 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java @@ -20,7 +20,9 @@ import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; +import com.jpexs.decompiler.flash.action.model.SetTypeActionItem; import com.jpexs.decompiler.flash.action.model.SetVariableActionItem; +import com.jpexs.decompiler.flash.action.model.StoreRegisterActionItem; import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator; import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem; import com.jpexs.decompiler.flash.action.swf4.ActionIf; @@ -111,10 +113,16 @@ public class ForInActionItem extends LoopActionItem implements Block { writer.append(" "); } writer.append("("); - if ((variableName instanceof DirectValueActionItem) && (((DirectValueActionItem) variableName).value instanceof RegisterNumber)) { - writer.append("var "); + if (variableName instanceof SetTypeActionItem) { + GraphTargetItem vn = ((SetTypeActionItem) variableName).getObject(); + + if ((variableName instanceof StoreRegisterActionItem) && ((StoreRegisterActionItem) variableName).define) { + writer.append("var "); + } + + stripQuotes(vn, localData, writer); } - stripQuotes(variableName, localData, writer); + writer.append(" in "); enumVariable.toString(writer, localData); writer.append(")").startBlock(); @@ -161,8 +169,10 @@ public class ForInActionItem extends LoopActionItem implements Block { loopExpr.add(forInEndIf); List loopBody = new ArrayList<>(); - //assuming (variableName instanceof VariableActionItem) - SetVariableActionItem setVar = new SetVariableActionItem(null, null, asGenerator.pushConstTargetItem(((VariableActionItem) variableName).getVariableName()), new DirectValueActionItem(new RegisterNumber(exprReg))); + //assuming (variableName instanceof VariableActionItem) + VariableActionItem vaact = (VariableActionItem) variableName; + GraphTargetItem setVar = vaact.getBoxedValue(); + setVar.value = new DirectValueActionItem(new RegisterNumber(exprReg)); loopBody.addAll(asGenerator.toActionList(setVar.toSourceIgnoreReturnValue(localData, generator))); //loopBody.add(new ActionPush(new RegisterNumber(exprReg)));