Issue #1134 compiling §§ instructions back while direct editation

(§§goto is still missing)
This commit is contained in:
Jindra Petřík
2016-01-16 19:51:11 +01:00
parent 7c1146618c
commit 95b4402390
14 changed files with 229 additions and 41 deletions

View File

@@ -521,8 +521,8 @@ public class AVM2Graph extends Graph {
if ((!w.expression.isEmpty()) && (w.expression.get(w.expression.size() - 1) instanceof HasNextAVM2Item)) {
HasNextAVM2Item hn = (HasNextAVM2Item) w.expression.get(w.expression.size() - 1);
if (((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection != null) {
if (((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection.getNotCoerced().getThroughRegister() instanceof FilteredCheckAVM2Item) {
if (((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).obj != null) {
if (((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).obj.getNotCoerced().getThroughRegister() instanceof FilteredCheckAVM2Item) {
if (w.commands.size() >= 3) {
int pos = 0;
while (w.commands.get(pos) instanceof SetLocalAVM2Item) {
@@ -545,7 +545,7 @@ public class AVM2Graph extends Graph {
int regIndex = ((LocalRegAVM2Item) spt.object).regIndex;
HasNextAVM2Item iti = (HasNextAVM2Item) w.expression.get(w.expression.size() - 1);
HashMap<Integer, GraphTargetItem> localRegs = aLocalData.localRegs;
localRegs.put(regIndex, new FilterAVM2Item(null, null, iti.collection.getThroughRegister(), ift.expression));
localRegs.put(regIndex, new FilterAVM2Item(null, null, iti.obj.getThroughRegister(), ift.expression));
return null;
}
}
@@ -558,9 +558,9 @@ public class AVM2Graph extends Graph {
SetTypeAVM2Item sti = (SetTypeAVM2Item) w.commands.remove(0);
GraphTargetItem gti = sti.getValue().getNotCoerced();
if (gti instanceof NextValueAVM2Item) {
return new ForEachInAVM2Item(w.getSrc(), w.getLineStartItem(), w.loop, new InAVM2Item(hn.getInstruction(), hn.getLineStartIns(), sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection), w.commands);
return new ForEachInAVM2Item(w.getSrc(), w.getLineStartItem(), w.loop, new InAVM2Item(hn.getInstruction(), hn.getLineStartIns(), sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).obj), w.commands);
} else if (gti instanceof NextNameAVM2Item) {
return new ForInAVM2Item(w.getSrc(), w.getLineStartItem(), w.loop, new InAVM2Item(hn.getInstruction(), hn.getLineStartIns(), sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection), w.commands);
return new ForInAVM2Item(w.getSrc(), w.getLineStartItem(), w.loop, new InAVM2Item(hn.getInstruction(), hn.getLineStartIns(), sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).obj), w.commands);
}
}
}
@@ -687,9 +687,9 @@ public class AVM2Graph extends Graph {
GraphTargetItem repl = null;
if (gti instanceof NextValueAVM2Item) {
repl = new ForEachInAVM2Item(ifi.getSrc(), ifi.getLineStartItem(), new Loop(0, null, null), new InAVM2Item(null, null, sti.getObject(), hnt.collection), body);
repl = new ForEachInAVM2Item(ifi.getSrc(), ifi.getLineStartItem(), new Loop(0, null, null), new InAVM2Item(null, null, sti.getObject(), hnt.obj), body);
} else if (gti instanceof NextNameAVM2Item) {
repl = new ForInAVM2Item(ifi.getSrc(), ifi.getLineStartItem(), new Loop(0, null, null), new InAVM2Item(null, null, sti.getObject(), hnt.collection), body);
repl = new ForInAVM2Item(ifi.getSrc(), ifi.getLineStartItem(), new Loop(0, null, null), new InAVM2Item(null, null, sti.getObject(), hnt.obj), body);
}
if (repl != null) {
list.remove(i);

View File

@@ -114,7 +114,7 @@ public class FullMultinameAVM2Item extends AVM2Item {
if (multinameIndex > 0 && multinameIndex < constants.getMultinameCount()) {
writer.append(constants.getMultiname(multinameIndex).getName(constants, fullyQualifiedNames, false));
} else {
writer.append("§§unknown_multiname");
writer.append("§§multiname(").append(multinameIndex).append(")");
}
}
return writer;

View File

@@ -16,11 +16,16 @@
*/
package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.TypeItem;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.List;
/**
*
@@ -28,28 +33,38 @@ import com.jpexs.decompiler.graph.model.LocalData;
*/
public class HasNextAVM2Item extends AVM2Item {
public GraphTargetItem object;
public GraphTargetItem index;
public GraphTargetItem collection;
public GraphTargetItem obj;
public HasNextAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem collection) {
public HasNextAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem index, GraphTargetItem obj) {
super(instruction, lineStartIns, NOPRECEDENCE);
this.object = object;
this.collection = collection;
this.index = index;
this.obj = obj;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
if ((index instanceof LocalRegAVM2Item) && (obj instanceof LocalRegAVM2Item)) {
int indexReg = ((LocalRegAVM2Item) index).regIndex;
int objectReg = ((LocalRegAVM2Item) obj).regIndex;
return toSourceMerge(localData, generator, ins(AVM2Instructions.HasNext2, objectReg, indexReg));
}
return toSourceMerge(localData, generator, obj, index, ins(AVM2Instructions.HasNext));
}
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
writer.append("§§hasnext(");
if (collection != null) {
collection.appendTo(writer, localData);
if (obj != null) {
obj.appendTo(writer, localData);
} else {
writer.append("null");
}
writer.append(",");
if (object != null) {
object.appendTo(writer, localData);
if (index != null) {
index.appendTo(writer, localData);
} else {
writer.append("null");
}

View File

@@ -16,12 +16,17 @@
*/
package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.TypeItem;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.HashMap;
import java.util.List;
/**
*
@@ -35,9 +40,14 @@ public class NewActivationAVM2Item extends AVM2Item {
super(instruction, lineStartIns, NOPRECEDENCE);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
return toSourceMerge(localData, generator, ins(AVM2Instructions.NewActivation));
}
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("§§activation");
return writer.append("§§newactivation()");
}
@Override

View File

@@ -16,11 +16,16 @@
*/
package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.TypeItem;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.List;
/**
*
@@ -49,6 +54,11 @@ public class NextNameAVM2Item extends AVM2Item {
return writer.append(")");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
return toSourceMerge(localData, generator, obj, index, ins(AVM2Instructions.NextName));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;

View File

@@ -16,11 +16,16 @@
*/
package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.TypeItem;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.List;
/**
*
@@ -38,6 +43,11 @@ public class NextValueAVM2Item extends AVM2Item {
this.obj = obj;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
return toSourceMerge(localData, generator, obj, index, ins(AVM2Instructions.NextValue));
}
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
writer.append("§§nextvalue");

View File

@@ -94,6 +94,8 @@ import com.jpexs.decompiler.graph.model.IfItem;
import com.jpexs.decompiler.graph.model.LocalData;
import com.jpexs.decompiler.graph.model.NotItem;
import com.jpexs.decompiler.graph.model.OrItem;
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;
@@ -2639,4 +2641,16 @@ public class AVM2SourceGenerator implements SourceGenerator {
ret.add(ins(AVM2Instructions.Pop));
return ret;
}
@Override
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, PushItem item) throws CompilationException {
return item.value.toSource(localData, this);
}
@Override
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, PopItem item) throws CompilationException {
List<GraphSourceItem> ret = new ArrayList<>();
return ret;
}
}

View File

@@ -30,14 +30,17 @@ import com.jpexs.decompiler.flash.abc.avm2.model.EscapeXElemAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.FloatValueAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.GetDescendantsAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.HasNextAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.InitVectorAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NameValuePair;
import com.jpexs.decompiler.flash.abc.avm2.model.NanAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NewArrayAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NewObjectAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NextNameAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.PostDecrementAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item;
@@ -96,11 +99,14 @@ import com.jpexs.decompiler.graph.model.BreakItem;
import com.jpexs.decompiler.graph.model.CommaExpressionItem;
import com.jpexs.decompiler.graph.model.ContinueItem;
import com.jpexs.decompiler.graph.model.DoWhileItem;
import com.jpexs.decompiler.graph.model.DuplicateItem;
import com.jpexs.decompiler.graph.model.ForItem;
import com.jpexs.decompiler.graph.model.IfItem;
import com.jpexs.decompiler.graph.model.NotItem;
import com.jpexs.decompiler.graph.model.OrItem;
import com.jpexs.decompiler.graph.model.ParenthesisItem;
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.UnboundedTypeItem;
@@ -2185,6 +2191,53 @@ public class ActionScript3Parser {
ParsedSymbol s = lex();
boolean allowMemberOrCall = false;
switch (s.type) {
case PREPROCESSOR:
expectedType(SymbolType.PARENT_OPEN);
switch ("" + s.value) {
//AS3
case "hasnext":
GraphTargetItem hnIndex = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);
expectedType(SymbolType.COMMA);
GraphTargetItem hnObject = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);
ret = new HasNextAVM2Item(null, null, hnIndex, hnObject);
break;
case "newactivation":
ret = new NewActivationAVM2Item(null, null);
break;
case "nextname":
GraphTargetItem nnIndex = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);
expectedType(SymbolType.COMMA);
GraphTargetItem nnObject = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);
ret = new NextNameAVM2Item(null, null, nnIndex, nnObject);
allowMemberOrCall = true;
break;
case "nextvalue":
GraphTargetItem nvIndex = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);
expectedType(SymbolType.COMMA);
GraphTargetItem nvObject = expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);
ret = new NextNameAVM2Item(null, null, nvIndex, nvObject);
allowMemberOrCall = true;
break;
//Both ASs
case "dup":
ret = new DuplicateItem(null, null, expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables));
break;
case "push":
ret = new PushItem(expression(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables));
break;
case "pop":
ret = new PopItem(null, null);
break;
case "goto": //TODO
case "multiname":
throw new AVM2ParseException("Compiling §§" + s.value + " is not available, sorry", lexer.yyline());
default:
throw new AVM2ParseException("Unknown preprocessor instruction: §§" + s.value, lexer.yyline());
}
expectedType(SymbolType.PARENT_CLOSE);
break;
case REGEXP:
String p = (String) s.value;
p = p.substring(1);

View File

@@ -16,10 +16,15 @@
*/
package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.swf5.ActionEnumerate;
import com.jpexs.decompiler.flash.action.swf6.ActionEnumerate2;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphSourceItemPos;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.ArrayList;
import java.util.List;
@@ -58,8 +63,16 @@ public class EnumerateActionItem extends ActionItem {
return ret;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
if ((object instanceof DirectValueActionItem) && (((DirectValueActionItem) object).isString())) {
return toSourceMerge(localData, generator, value, new ActionEnumerate());
}
return toSourceMerge(localData, generator, value, new ActionEnumerate2());
}
@Override
public boolean hasReturnValue() {
return true;
return false;
}
}

View File

@@ -28,6 +28,7 @@ import com.jpexs.decompiler.flash.action.model.CloneSpriteActionItem;
import com.jpexs.decompiler.flash.action.model.DefineLocalActionItem;
import com.jpexs.decompiler.flash.action.model.DeleteActionItem;
import com.jpexs.decompiler.flash.action.model.DirectValueActionItem;
import com.jpexs.decompiler.flash.action.model.EnumerateActionItem;
import com.jpexs.decompiler.flash.action.model.EvalActionItem;
import com.jpexs.decompiler.flash.action.model.FSCommandActionItem;
import com.jpexs.decompiler.flash.action.model.FunctionActionItem;
@@ -135,12 +136,15 @@ import com.jpexs.decompiler.graph.model.BreakItem;
import com.jpexs.decompiler.graph.model.CommaExpressionItem;
import com.jpexs.decompiler.graph.model.ContinueItem;
import com.jpexs.decompiler.graph.model.DoWhileItem;
import com.jpexs.decompiler.graph.model.DuplicateItem;
import com.jpexs.decompiler.graph.model.ForItem;
import com.jpexs.decompiler.graph.model.IfItem;
import com.jpexs.decompiler.graph.model.LocalData;
import com.jpexs.decompiler.graph.model.NotItem;
import com.jpexs.decompiler.graph.model.OrItem;
import com.jpexs.decompiler.graph.model.ParenthesisItem;
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.WhileItem;
@@ -367,17 +371,15 @@ public class ActionScript2Parser {
String fname = s.value.toString();
if (fname.equals(classNameStr)) { //constructor
constr = (function(!isInterface, "", true, variables));
} else {
if (!isInterface) {
if (isStatic) {
FunctionActionItem ft = function(!isInterface, "", true, variables);
ft.calculatedFunctionName = pushConst(fname);
staticFunctions.add(ft);
} else {
FunctionActionItem ft = function(!isInterface, "", true, variables);
ft.calculatedFunctionName = pushConst(fname);
functions.add(ft);
}
} else if (!isInterface) {
if (isStatic) {
FunctionActionItem ft = function(!isInterface, "", true, variables);
ft.calculatedFunctionName = pushConst(fname);
staticFunctions.add(ft);
} else {
FunctionActionItem ft = function(!isInterface, "", true, variables);
ft.calculatedFunctionName = pushConst(fname);
functions.add(ft);
}
}
break;
@@ -1553,10 +1555,8 @@ public class ActionScript2Parser {
lexer.pushback(s);
if (cmd == null) {
expr.add(expression(inFunction, inMethod, true, variables));
} else {
if (!cmd.hasReturnValue()) {
throw new ActionParseException("Expression expected", lexer.yyline());
}
} else if (!cmd.hasReturnValue()) {
throw new ActionParseException("Expression expected", lexer.yyline());
}
return new CommaExpressionItem(null, null, expr);
}
@@ -1570,6 +1570,31 @@ public class ActionScript2Parser {
ParsedSymbol s = lex();
switch (s.type) {
case PREPROCESSOR:
expectedType(SymbolType.PARENT_OPEN);
switch ("" + s.value) {
//AS 1/2:
case "enumerate":
ret = new EnumerateActionItem(null, null, expression(inFunction, inMethod, allowRemainder, variables));
break;
//Both ASs
case "dup":
ret = new DuplicateItem(null, null, expression(inFunction, inMethod, allowRemainder, variables));
break;
case "push":
ret = new PushItem(expression(inFunction, inMethod, allowRemainder, variables));
break;
case "pop":
ret = new PopItem(null, null);
break;
case "goto": //TODO
throw new ActionParseException("Compiling §§" + s.value + " is not available, sorry", lexer.yyline());
default:
throw new ActionParseException("Unknown preprocessor instruction: §§" + s.value, lexer.yyline());
}
expectedType(SymbolType.PARENT_CLOSE);
break;
case NEGATE:
versionRequired(s, 5);
ret = expressionPrimary(false, inFunction, inMethod, false, variables);
@@ -1837,12 +1862,10 @@ public class ActionScript2Parser {
GraphTargetItem stored = v.getStoreValue();
if (v.isDefinition()) {
v.setBoxedValue(new DefineLocalActionItem(null, null, pushConst(varName), stored));
} else if (stored != null) {
v.setBoxedValue(new SetVariableActionItem(null, null, pushConst(varName), stored));
} else {
if (stored != null) {
v.setBoxedValue(new SetVariableActionItem(null, null, pushConst(varName), stored));
} else {
v.setBoxedValue(new GetVariableActionItem(null, null, pushConst(varName)));
}
v.setBoxedValue(new GetVariableActionItem(null, null, pushConst(varName)));
}
}
if (lexer.lex().type != SymbolType.EOF) {

View File

@@ -61,6 +61,8 @@ import com.jpexs.decompiler.graph.model.ForItem;
import com.jpexs.decompiler.graph.model.IfItem;
import com.jpexs.decompiler.graph.model.NotItem;
import com.jpexs.decompiler.graph.model.OrItem;
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;
@@ -803,4 +805,16 @@ public class ActionSourceGenerator implements SourceGenerator {
ret.add(new ActionPop());
return ret;
}
@Override
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, PushItem item) throws CompilationException {
return item.value.toSource(localData, this);
}
@Override
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, PopItem item) throws CompilationException {
List<GraphSourceItem> ret = new ArrayList<>();
return ret;
}
}

View File

@@ -28,6 +28,8 @@ import com.jpexs.decompiler.graph.model.ForItem;
import com.jpexs.decompiler.graph.model.IfItem;
import com.jpexs.decompiler.graph.model.NotItem;
import com.jpexs.decompiler.graph.model.OrItem;
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;
@@ -40,6 +42,10 @@ import java.util.List;
*/
public interface SourceGenerator {
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, PushItem item) throws CompilationException;
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, PopItem item) throws CompilationException;
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, TrueItem item) throws CompilationException;
public List<GraphSourceItem> generate(SourceGeneratorLocalData localData, FalseItem item) throws CompilationException;

View File

@@ -16,11 +16,15 @@
*/
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.ecma.Null;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.TypeItem;
import java.util.List;
/**
*
@@ -53,4 +57,9 @@ public class PopItem extends GraphTargetItem {
public Object getResult() {
return Null.INSTANCE;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
return generator.generate(localData, this);
}
}

View File

@@ -16,8 +16,14 @@
*/
package com.jpexs.decompiler.graph.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.TypeItem;
import java.util.List;
/**
*
@@ -40,12 +46,17 @@ public class PushItem extends GraphTargetItem {
@Override
public boolean hasReturnValue() {
return true;
return false;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
return generator.generate(localData, this);
}
@Override
public GraphTargetItem returnType() {
return value.returnType();
return TypeItem.UNBOUNDED;
}
@Override