Fixed AS1/2 - Registers in for..in clause, proper define

This commit is contained in:
Jindra Petřík
2021-11-22 20:11:31 +01:00
parent 87caae7c02
commit 891a0f1ed8
3 changed files with 22 additions and 6 deletions
@@ -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) {
@@ -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<Action> 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)));