AS3: Fixed For each statements

This commit is contained in:
Jindra Pet��k
2011-07-13 10:42:18 +02:00
parent 97efb4c956
commit 61045e72ca
10 changed files with 92 additions and 5 deletions
@@ -42,6 +42,6 @@ public class HasNext2Ins extends InstructionDefinition {
int objectReg = ins.operands[0];
int indexReg = ins.operands[1];
//stack.push("_loc_" + objectReg + ".hasNext(cnt=_loc_" + indexReg + ")");
stack.push(new EachTreeItem(ins, new LocalRegTreeItem(ins, indexReg, localRegs.get(indexReg)), new LocalRegTreeItem(ins, objectReg, localRegs.get(objectReg))));
stack.push(new EachTreeItem(ins, new LocalRegTreeItem(ins, indexReg, localRegs.get(indexReg)), localRegs.get(objectReg)));
}
}
@@ -38,4 +38,10 @@ public class CoerceTreeItem extends TreeItem {
return value.toString(constants);
}
@Override
public TreeItem getNotCoerced() {
return value;
}
}
@@ -22,7 +22,7 @@ import com.jpexs.asdec.abc.avm2.ConstantPool;
import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction;
public class InitPropertyTreeItem extends TreeItem {
public class InitPropertyTreeItem extends TreeItem implements SetTypeTreeItem{
public TreeItem object;
public FullMultinameTreeItem propertyName;
public TreeItem value;
@@ -39,5 +39,13 @@ public class InitPropertyTreeItem extends TreeItem {
return formatProperty(constants, object, propertyName) + hilight("=") + value.toString(constants) + ";";
}
public TreeItem getObject() {
return new GetPropertyTreeItem(instruction, object, propertyName);
}
public TreeItem getValue() {
return value;
}
}
@@ -23,7 +23,7 @@ import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition;
public class SetLocalTreeItem extends TreeItem {
public class SetLocalTreeItem extends TreeItem implements SetTypeTreeItem {
public int regIndex;
public TreeItem value;
@@ -38,5 +38,13 @@ public class SetLocalTreeItem extends TreeItem {
return hilight(InstructionDefinition.localRegName(regIndex) + "=") + value.toString(constants) + ";";
}
public TreeItem getObject() {
return new LocalRegTreeItem(instruction, regIndex, null);
}
public TreeItem getValue() {
return value;
}
}
@@ -22,7 +22,7 @@ import com.jpexs.asdec.abc.avm2.ConstantPool;
import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction;
public class SetPropertyTreeItem extends TreeItem {
public class SetPropertyTreeItem extends TreeItem implements SetTypeTreeItem{
public TreeItem object;
public FullMultinameTreeItem propertyName;
public TreeItem value;
@@ -39,5 +39,13 @@ public class SetPropertyTreeItem extends TreeItem {
return formatProperty(constants, object, propertyName) + hilight("=") + value.toString(constants) + ";";
}
public TreeItem getObject() {
return new GetPropertyTreeItem(instruction, object, propertyName);
}
public TreeItem getValue() {
return value;
}
}
@@ -23,7 +23,7 @@ import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.asdec.abc.types.Multiname;
public class SetSlotTreeItem extends TreeItem {
public class SetSlotTreeItem extends TreeItem implements SetTypeTreeItem {
public Multiname slotName;
public TreeItem value;
public TreeItem scope;
@@ -52,4 +52,12 @@ public class SetSlotTreeItem extends TreeItem {
return ret + hilight(slotName.getName(constants)) + hilight("=") + value.toString(constants) + ";";
}
public TreeItem getObject() {
return new GetSlotTreeItem(instruction, scope, slotName);
}
public TreeItem getValue() {
return value;
}
}
@@ -43,4 +43,5 @@ public class SetSuperTreeItem extends TreeItem {
return calee + hilight("super.") + propertyName.toString(constants) + hilight("=") + value.toString(constants) + ";";
}
}
@@ -0,0 +1,28 @@
/*
* Copyright (C) 2011 JPEXS
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package com.jpexs.asdec.abc.avm2.treemodel;
/**
*
* @author JPEXS
*/
public interface SetTypeTreeItem {
public TreeItem getObject();
public TreeItem getValue();
}
@@ -91,4 +91,7 @@ public abstract class TreeItem {
return obStr + "[" + propertyName.toString(constants) + "]";
}
}
public TreeItem getNotCoerced(){
return this;
}
}
@@ -22,6 +22,9 @@ import com.jpexs.asdec.abc.avm2.ConstantPool;
import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.asdec.abc.avm2.treemodel.ContinueTreeItem;
import com.jpexs.asdec.abc.avm2.treemodel.EachTreeItem;
import com.jpexs.asdec.abc.avm2.treemodel.LocalRegTreeItem;
import com.jpexs.asdec.abc.avm2.treemodel.SetLocalTreeItem;
import com.jpexs.asdec.abc.avm2.treemodel.SetTypeTreeItem;
import com.jpexs.asdec.abc.avm2.treemodel.TreeItem;
import java.util.ArrayList;
@@ -35,6 +38,20 @@ public class ForEachTreeItem extends LoopTreeItem implements Block {
public ForEachTreeItem(AVM2Instruction instruction, int loopBreak, int loopContinue, EachTreeItem expression, List<TreeItem> commands) {
super(instruction, loopBreak, loopContinue);
TreeItem firstAssign=commands.get(0);
if(firstAssign instanceof SetTypeTreeItem){
if(expression.object instanceof LocalRegTreeItem){
if(((SetTypeTreeItem)firstAssign).getValue().getNotCoerced() instanceof LocalRegTreeItem)
{
if(((LocalRegTreeItem)((SetTypeTreeItem)firstAssign).getValue().getNotCoerced()).regIndex==((LocalRegTreeItem)expression.object).regIndex){
commands.remove(0);
expression.object=((SetTypeTreeItem)firstAssign).getObject();
}
}
}
//locAssign.
}
this.expression = expression;
this.commands = commands;
}