From 95b440239041a97a8808401f3b2ee850724d262b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 16 Jan 2016 19:51:11 +0100 Subject: [PATCH] =?UTF-8?q?Issue=20#1134=20compiling=20=C2=A7=C2=A7=20inst?= =?UTF-8?q?ructions=20back=20while=20direct=20editation=20(=C2=A7=C2=A7got?= =?UTF-8?q?o=20is=20still=20missing)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flash/abc/avm2/graph/AVM2Graph.java | 14 ++--- .../abc/avm2/model/FullMultinameAVM2Item.java | 2 +- .../flash/abc/avm2/model/HasNextAVM2Item.java | 33 +++++++--- .../abc/avm2/model/NewActivationAVM2Item.java | 12 +++- .../abc/avm2/model/NextNameAVM2Item.java | 10 +++ .../abc/avm2/model/NextValueAVM2Item.java | 10 +++ .../parser/script/AVM2SourceGenerator.java | 14 +++++ .../parser/script/ActionScript3Parser.java | 53 ++++++++++++++++ .../action/model/EnumerateActionItem.java | 15 ++++- .../parser/script/ActionScript2Parser.java | 63 +++++++++++++------ .../parser/script/ActionSourceGenerator.java | 14 +++++ .../decompiler/graph/SourceGenerator.java | 6 ++ .../jpexs/decompiler/graph/model/PopItem.java | 9 +++ .../decompiler/graph/model/PushItem.java | 15 ++++- 14 files changed, 229 insertions(+), 41 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 0f8e13ed0..4bf0be975 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -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 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); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index 632002b7d..053bfd858 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -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; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java index 4b6021365..7529357f2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java @@ -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 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"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java index 33cf36ba1..af5d1f4f9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java @@ -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 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 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextNameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextNameAVM2Item.java index ee841c8b4..cc822c0b5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextNameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextNameAVM2Item.java @@ -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 toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return toSourceMerge(localData, generator, obj, index, ins(AVM2Instructions.NextName)); + } + @Override public GraphTargetItem returnType() { return TypeItem.UNBOUNDED; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextValueAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextValueAVM2Item.java index e74254257..02fa9c23e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextValueAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NextValueAVM2Item.java @@ -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 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"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 073326e86..28592c97d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -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 generate(SourceGeneratorLocalData localData, PushItem item) throws CompilationException { + return item.value.toSource(localData, this); + } + + @Override + public List generate(SourceGeneratorLocalData localData, PopItem item) throws CompilationException { + List ret = new ArrayList<>(); + return ret; + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index 3310a49a6..9093d24ef 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -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); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java index e84709fee..2447e9978 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java @@ -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 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; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index e3b1bf0dd..5a80e5f1a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -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) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index 794840a87..0b244b0c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -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 generate(SourceGeneratorLocalData localData, PushItem item) throws CompilationException { + return item.value.toSource(localData, this); + } + + @Override + public List generate(SourceGeneratorLocalData localData, PopItem item) throws CompilationException { + List ret = new ArrayList<>(); + return ret; + + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java index 271a5b971..2c4a23e1d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java @@ -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 generate(SourceGeneratorLocalData localData, PushItem item) throws CompilationException; + + public List generate(SourceGeneratorLocalData localData, PopItem item) throws CompilationException; + public List generate(SourceGeneratorLocalData localData, TrueItem item) throws CompilationException; public List generate(SourceGeneratorLocalData localData, FalseItem item) throws CompilationException; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java index 0064af87c..ce0c304d6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java @@ -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 toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return generator.generate(localData, this); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java index 9b2e88129..bf18ea8e4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java @@ -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 toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return generator.generate(localData, this); } @Override public GraphTargetItem returnType() { - return value.returnType(); + return TypeItem.UNBOUNDED; } @Override