Direct AS1/2 editing - Increment/Decrement fix after issue #304 changes

This commit is contained in:
Jindra Pet��k
2014-02-24 19:23:09 +01:00
parent 7980ad0a0e
commit fd3711a104
10 changed files with 86 additions and 112 deletions
@@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.model.operations.SubtractActionItem;
import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem;
import com.jpexs.decompiler.flash.action.swf4.ActionPop;
import com.jpexs.decompiler.flash.action.swf4.ActionPush;
import com.jpexs.decompiler.flash.action.swf4.ActionSetProperty;
@@ -91,28 +92,33 @@ public class PostDecrementActionItem extends ActionItem implements SetTypeAction
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
List<GraphSourceItem> ret = new ArrayList<>();
if (object instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) object;
GraphTargetItem val = object;
if (val instanceof VariableActionItem) {
val = ((VariableActionItem) val).getBoxedValue();
}
if (val instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) val;
ret.addAll(gv.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetVariable
ret.addAll(gv.toSource(localData, generator));
ret.add(new ActionDecrement());
ret.add(new ActionSetVariable());
} else if (object instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) object;
} else if (val instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) val;
ret.addAll(mem.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetMember
ret.addAll(mem.toSource(localData, generator));
ret.add(new ActionDecrement());
ret.add(new ActionSetMember());
} else if ((object instanceof DirectValueActionItem) && ((DirectValueActionItem) object).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) object).value;
} else if ((val instanceof DirectValueActionItem) && ((DirectValueActionItem) val).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) val).value;
ret.add(new ActionPush(new RegisterNumber(rn.number)));
ret.add(new ActionDecrement());
ret.add(new ActionStoreRegister(rn.number));
ret.add(new ActionPop());
} else if (object instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) object;
} else if (val instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) val;
ret.addAll(gp.toSource(localData, generator));
ret.remove(ret.size() - 1);
ret.addAll(gp.toSource(localData, generator));
@@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.model.operations.AddActionItem;
import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem;
import com.jpexs.decompiler.flash.action.swf4.ActionPop;
import com.jpexs.decompiler.flash.action.swf4.ActionPush;
import com.jpexs.decompiler.flash.action.swf4.ActionSetProperty;
@@ -91,28 +92,33 @@ public class PostIncrementActionItem extends ActionItem implements SetTypeAction
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
List<GraphSourceItem> ret = new ArrayList<>();
if (object instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) object;
GraphTargetItem val = object;
if (val instanceof VariableActionItem) {
val = ((VariableActionItem) val).getBoxedValue();
}
if (val instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) val;
ret.addAll(gv.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetVariable
ret.addAll(gv.toSource(localData, generator));
ret.add(new ActionIncrement());
ret.add(new ActionSetVariable());
} else if (object instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) object;
} else if (val instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) val;
ret.addAll(mem.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetMember
ret.addAll(mem.toSource(localData, generator));
ret.add(new ActionIncrement());
ret.add(new ActionSetMember());
} else if ((object instanceof DirectValueActionItem) && ((DirectValueActionItem) object).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) object).value;
} else if ((val instanceof DirectValueActionItem) && ((DirectValueActionItem) val).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) val).value;
ret.add(new ActionPush(new RegisterNumber(rn.number)));
ret.add(new ActionIncrement());
ret.add(new ActionStoreRegister(rn.number));
ret.add(new ActionPop());
} else if (object instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) object;
} else if (val instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) val;
ret.addAll(gp.toSource(localData, generator));
ret.remove(ret.size() - 1);
ret.addAll(gp.toSource(localData, generator));
@@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
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.ActionPush;
import com.jpexs.decompiler.flash.action.swf4.ActionSetVariable;
import com.jpexs.decompiler.flash.action.swf4.RegisterNumber;
@@ -71,7 +72,7 @@ public class SetVariableActionItem extends ActionItem implements SetTypeActionIt
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if (name instanceof DirectValueActionItem || name instanceof GetVariableActionItem) {
if (name instanceof DirectValueActionItem || name instanceof VariableActionItem) {
stripQuotes(name, localData, writer);
writer.append(" = ");
return value.toString(writer, localData);
@@ -19,13 +19,11 @@ package com.jpexs.decompiler.flash.action.model.clauses;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.Action;
import com.jpexs.decompiler.flash.action.model.ActionItem;
import com.jpexs.decompiler.flash.action.model.DirectValueActionItem;
import com.jpexs.decompiler.flash.action.model.FunctionActionItem;
import com.jpexs.decompiler.flash.action.model.GetMemberActionItem;
import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
import com.jpexs.decompiler.flash.action.model.SetMemberActionItem;
import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator;
import com.jpexs.decompiler.flash.action.swf4.RegisterNumber;
import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.flash.helpers.collections.MyEntry;
import com.jpexs.decompiler.graph.Block;
@@ -97,23 +95,8 @@ public class ClassActionItem extends ActionItem implements Block {
}
private boolean isThis(GraphTargetItem item) {
if (item instanceof DirectValueActionItem) {
DirectValueActionItem di = (DirectValueActionItem) item;
if (di.value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) di.value;
if ("this".equals(rn.name)) {
return true;
}
}
}
if (item instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) item;
if (gv.name instanceof DirectValueActionItem) {
DirectValueActionItem di = (DirectValueActionItem) gv.name;
if ("this".equals(di.toStringNoH(null))) {
return true;
}
}
if (item instanceof VariableActionItem) {
return "this".equals(((VariableActionItem) item).getVariableName());
}
return false;
}
@@ -140,7 +140,7 @@ public class ForInActionItem extends LoopActionItem implements Block {
loopExpr.add(forInEndIf);
List<Action> loopBody = new ArrayList<>();
loopBody.add(new ActionPush(new RegisterNumber(exprReg)));
if (asGenerator.isInFunction(localData)==2) {
if (asGenerator.isInFunction(localData) == 2) {
loopBody.add(new ActionStoreRegister(innerExprReg));
loopBody.add(new ActionPop());
} else {
@@ -22,6 +22,7 @@ import com.jpexs.decompiler.flash.action.model.GetMemberActionItem;
import com.jpexs.decompiler.flash.action.model.GetPropertyActionItem;
import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
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.ActionPush;
import com.jpexs.decompiler.flash.action.swf4.ActionSetProperty;
import com.jpexs.decompiler.flash.action.swf4.ActionSetVariable;
@@ -52,9 +53,12 @@ public class PreDecrementActionItem extends UnaryOpItem {
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
ActionSourceGenerator asGenerator = (ActionSourceGenerator) generator;
List<GraphSourceItem> ret = new ArrayList<>();
if (value instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) value;
GraphTargetItem val = value;
if (val instanceof VariableActionItem) {
val = ((VariableActionItem) val).getBoxedValue();
}
if (val instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) val;
ret.addAll(gv.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetVariable
ret.addAll(gv.toSource(localData, generator));
@@ -63,8 +67,8 @@ public class PreDecrementActionItem extends UnaryOpItem {
ret.add(new ActionStoreRegister(tmpReg));
ret.add(new ActionSetVariable());
ret.add(new ActionPush(new RegisterNumber(tmpReg)));
} else if (value instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) value;
} else if (val instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) val;
ret.addAll(mem.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetMember
ret.addAll(mem.toSource(localData, generator));
@@ -73,13 +77,13 @@ public class PreDecrementActionItem extends UnaryOpItem {
ret.add(new ActionStoreRegister(tmpReg));
ret.add(new ActionSetMember());
ret.add(new ActionPush(new RegisterNumber(tmpReg)));
} else if ((value instanceof DirectValueActionItem) && ((DirectValueActionItem) value).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) value).value;
} else if ((val instanceof DirectValueActionItem) && ((DirectValueActionItem) val).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) val).value;
ret.add(new ActionPush(new RegisterNumber(rn.number)));
ret.add(new ActionDecrement());
ret.add(new ActionStoreRegister(rn.number));
} else if (value instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) value;
} else if (val instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) val;
ret.addAll(gp.toSource(localData, generator)); // old value
ret.addAll(gp.toSource(localData, generator));
ret.remove(ret.size() - 1);
@@ -22,6 +22,7 @@ import com.jpexs.decompiler.flash.action.model.GetMemberActionItem;
import com.jpexs.decompiler.flash.action.model.GetPropertyActionItem;
import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
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.ActionPush;
import com.jpexs.decompiler.flash.action.swf4.ActionSetProperty;
import com.jpexs.decompiler.flash.action.swf4.ActionSetVariable;
@@ -52,9 +53,12 @@ public class PreIncrementActionItem extends UnaryOpItem {
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
ActionSourceGenerator asGenerator = (ActionSourceGenerator) generator;
List<GraphSourceItem> ret = new ArrayList<>();
if (value instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) value;
GraphTargetItem val = value;
if (val instanceof VariableActionItem) {
val = ((VariableActionItem) val).getBoxedValue();
}
if (val instanceof GetVariableActionItem) {
GetVariableActionItem gv = (GetVariableActionItem) val;
ret.addAll(gv.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetVariable
ret.addAll(gv.toSource(localData, generator));
@@ -63,8 +67,8 @@ public class PreIncrementActionItem extends UnaryOpItem {
ret.add(new ActionStoreRegister(tmpReg));
ret.add(new ActionSetVariable());
ret.add(new ActionPush(new RegisterNumber(tmpReg)));
} else if (value instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) value;
} else if (val instanceof GetMemberActionItem) {
GetMemberActionItem mem = (GetMemberActionItem) val;
ret.addAll(mem.toSource(localData, generator));
ret.remove(ret.size() - 1); //ActionGetMember
ret.addAll(mem.toSource(localData, generator));
@@ -73,13 +77,13 @@ public class PreIncrementActionItem extends UnaryOpItem {
ret.add(new ActionStoreRegister(tmpReg));
ret.add(new ActionSetMember());
ret.add(new ActionPush(new RegisterNumber(tmpReg)));
} else if ((value instanceof DirectValueActionItem) && ((DirectValueActionItem) value).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) value).value;
} else if ((val instanceof DirectValueActionItem) && ((DirectValueActionItem) val).value instanceof RegisterNumber) {
RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) val).value;
ret.add(new ActionPush(new RegisterNumber(rn.number)));
ret.add(new ActionIncrement());
ret.add(new ActionStoreRegister(rn.number));
} else if (value instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) value;
} else if (val instanceof GetPropertyActionItem) {
GetPropertyActionItem gp = (GetPropertyActionItem) val;
ret.addAll(gp.toSource(localData, generator)); // old value
ret.addAll(gp.toSource(localData, generator));
ret.remove(ret.size() - 1);
@@ -1194,6 +1194,7 @@ public final class ActionScriptLexer {
/**
* Closes the input stream.
*
* @throws java.io.IOException
*/
public final void yyclose() throws java.io.IOException {
@@ -1229,7 +1230,8 @@ public final class ActionScriptLexer {
/**
* Returns the current lexical state.
* @return
*
* @return
*/
public final int yystate() {
return zzLexicalState;
@@ -1246,7 +1248,8 @@ public final class ActionScriptLexer {
/**
* Returns the text matched by the current regular expression.
* @return
*
* @return
*/
public final String yytext() {
return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
@@ -1268,7 +1271,8 @@ public final class ActionScriptLexer {
/**
* Returns the length of the matched text region.
* @return
*
* @return
*/
public final int yylength() {
return zzMarkedPos - zzStartRead;
@@ -141,12 +141,6 @@ import java.util.List;
*/
public class ActionScriptParser {
public static final int REGISTER_THIS = 1;
public static final int REGISTER_ARGUMENTS = 2;
public static final int REGISTER_SUPER = 3;
public static final int REGISTER_ROOT = 4;
public static final int REGISTER_PARENT = 5;
public static final int REGISTER_GLOBAL = 6;
private long uniqLast = 0;
private final boolean debugMode = false;
@@ -335,22 +329,12 @@ public class ActionScriptParser {
expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.PARENT_CLOSE);
}
}
HashMap<String, Integer> registerVars = new HashMap<>();
registerVars.put("_parent", REGISTER_PARENT);
registerVars.put("_root", REGISTER_ROOT);
registerVars.put("super", REGISTER_SUPER);
registerVars.put("arguments", REGISTER_ARGUMENTS);
registerVars.put("this", REGISTER_THIS);
registerVars.put("_global", REGISTER_GLOBAL);
for (int i = 0; i < paramNames.size(); i++) {
registerVars.put(paramNames.get(i), (7 + i)); //(paramNames.size() - i)));
}
List<GraphTargetItem> body = null;
List<VariableActionItem> subvariables = new ArrayList<>();
if (withBody) {
expectedType(SymbolType.CURLY_OPEN);
body = commands(registerVars, true, isMethod, 0, subvariables);
body = commands(new HashMap<String, Integer>(), true, isMethod, 0, subvariables);
expectedType(SymbolType.CURLY_CLOSE);
}
@@ -14,7 +14,6 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.action.parser.script;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
@@ -34,23 +33,20 @@ import java.util.List;
public class VariableActionItem extends ActionItem {
private ActionItem it;
private final String variableName;
private final String variableName;
private GraphTargetItem storeValue;
private final boolean definition;
public void setStoreValue(GraphTargetItem storeValue) {
this.storeValue = storeValue;
}
public String getVariableName(){
public String getVariableName() {
return variableName;
}
public VariableActionItem(String variableName, GraphTargetItem storeValue, boolean definition){
public VariableActionItem(String variableName, GraphTargetItem storeValue, boolean definition) {
this.variableName = variableName;
this.storeValue = storeValue;
this.definition = definition;
@@ -59,8 +55,6 @@ public class VariableActionItem extends ActionItem {
public boolean isDefinition() {
return definition;
}
public void setBoxedValue(ActionItem it) {
this.it = it;
@@ -74,57 +68,45 @@ public class VariableActionItem extends ActionItem {
return storeValue;
}
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if(it == null){
if (it == null) {
return writer;
}
return it.appendTo(writer, localData);
return it.appendTo(writer, localData);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
if(it==null){
if (it == null) {
return new ArrayList<>();
}
}
return it.toSource(localData, generator);
}
}
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
if(it==null){
if (it == null) {
return new ArrayList<>();
}
}
return it.toSourceIgnoreReturnValue(localData, generator);
}
@Override
public boolean hasReturnValue() {
if(it==null){
if (it == null) {
return false;
}else{
} else {
return it.hasReturnValue();
}
}
@Override
public boolean needsSemicolon() {
if(it==null){
if (it == null) {
return super.needsSemicolon();
}
return it.needsSemicolon();
return it.needsSemicolon();
}
}