diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index eedeae61e..fdfa8b118 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -710,10 +710,12 @@ public abstract class Action implements GraphSourceItem { return toString(); } - public boolean execute(LocalDataArea lda) { + public abstract boolean execute(LocalDataArea lda); + + /* { //throw new UnsupportedOperationException("Action " + toString() + " not implemented"); return false; - } + }*/ /** * Translates this function to stack and output. @@ -1061,7 +1063,7 @@ public abstract class Action implements GraphSourceItem { } /*ActionJump && ActionIf removed*/ - /*if ((action instanceof ActionEnumerate2) || (action instanceof ActionEnumerate)) { + /*if ((action instanceof ActionEnumerate2) || (action instanceof ActionEnumerate)) { loopStart = ip + 1; isForIn = true; ip += 4; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptArray.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptArray.java new file mode 100644 index 000000000..5584ecf33 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptArray.java @@ -0,0 +1,77 @@ +package com.jpexs.decompiler.flash.action; + +import com.jpexs.decompiler.flash.ecma.Undefined; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class ActionScriptArray extends ActionScriptObject { + + protected List values = new ArrayList<>(); + + //TODO: implement some methods? + @Override + public List enumerate() { + List ret = super.enumerate(); + for (int i = 0; i < values.size(); i++) { + ret.add("" + i); + } + return ret; + } + + @Override + public Object getMember(String path) { + if (path.matches("[1-9][0-9]*|0")) { + return getValueAtIndex(Integer.parseInt(path)); + } + return super.getMember(path); + } + + @Override + public void setMember(String path, Object value) { + if (path.matches("[1-9][0-9]*|0")) { + setValueAtIndex(Integer.parseInt(path), value); + return; + } + super.setMember(path, value); + } + + public void setValueAtIndex(int index, Object value) { + if (index < 0) { + return; + } + if (index >= values.size()) { + int delta = 1 + index - values.size(); + for (int i = 0; i < delta - 1; i++) { + values.add(Undefined.INSTANCE); + } + values.add(value); + } else { + values.set(index, value); + } + trim(); + } + + public void trim() { + for (int i = values.size() - 1; i >= 0; i--) { + if (values.get(i) == Undefined.INSTANCE) { + values.remove(i); + } else { + break; + } + } + } + + public Object getValueAtIndex(int index) { + if (index < 0) { + return Undefined.INSTANCE; //throw error? + } + if (index >= values.size()) { + return Undefined.INSTANCE; + } + return values.get(index); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptFunction.java new file mode 100644 index 000000000..9e919008b --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptFunction.java @@ -0,0 +1,39 @@ +package com.jpexs.decompiler.flash.action; + +import java.util.List; +import java.util.Map; + +/** + * + * @author JPEXS + */ +public class ActionScriptFunction extends ActionScriptObject { + + protected long functionOffset; + protected long functionLength; + protected String functionName; + protected List paramNames; + protected Map funcRegNames; + + public ActionScriptFunction(long functionOffset, long functionLength, String functionName, List paramNames, Map funcRegNames) { + this.functionOffset = functionOffset; + this.functionLength = functionLength; + this.functionName = functionName; + this.paramNames = paramNames; + this.funcRegNames = funcRegNames; + } + + public Object execute(Object thisObj, List args) { + //TODO!!! + return null; + } + + public long getFunctionLength() { + return functionLength; + } + + public long getFunctionOffset() { + return functionOffset; + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java new file mode 100644 index 000000000..a11e19291 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java @@ -0,0 +1,145 @@ +package com.jpexs.decompiler.flash.action; + +import com.jpexs.decompiler.flash.ecma.Undefined; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + * @author JPEXS + */ +public class ActionScriptObject implements Cloneable { + + protected Map properties = new HashMap<>(); + protected Map members = new HashMap<>(); + + protected Object extendsObj; + protected List implementsObjs = new ArrayList<>(); + + public List getImplementsObjs() { + return implementsObjs; + } + + public void setImplementsObjs(List implementsObjs) { + this.implementsObjs = implementsObjs; + } + + public void setExtendsObj(Object extendsObj) { + this.extendsObj = extendsObj; + } + + public Object getExtendsObj() { + return extendsObj; + } + + public void removeMember(String path) { + String pathParts[]; + if (path.startsWith("/")) { + pathParts = path.substring(1).split("/"); + } else { + pathParts = path.split("."); + } + ActionScriptObject obj = this; + for (int i = 0; i < pathParts.length; i++) { + String part = pathParts[i]; + Object member = obj.getMember(part); + if (i == pathParts.length - 1) { + obj.members.remove(part); + } else if (member instanceof ActionScriptObject) { + obj = (ActionScriptObject) member; + } else { + break; + } + } + } + + public List enumerate() { + return new ArrayList<>(members.keySet()); + } + + public void setProperty(int index, Object value) { + properties.put(index, value); + } + + public Object getProperty(int index) { + if (!properties.containsKey(index)) { + return Undefined.INSTANCE; + } + return properties.get(index); + } + + public void setMember(String path, Object value) { + String pathParts[]; + if (path.startsWith("/")) { + pathParts = path.substring(1).split("/"); + } else { + pathParts = path.split("."); + } + ActionScriptObject obj = this; + for (int i = 0; i < pathParts.length; i++) { + String part = pathParts[i]; + Object member = obj.getMember(part); + if (i == pathParts.length - 1) { + obj.members.put(part, value); + } else if (member instanceof ActionScriptObject) { + obj = (ActionScriptObject) member; + } else { + break; + } + } + } + + @Override + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException ex) { + //ignore + } + return null; + } + + public String getMemberPath(Object obj) { + if (obj == this) { + return ""; + } + + for (String memberName : members.keySet()) { + Object member = members.get(memberName); + if (member == obj) { + return memberName; + } + if (member instanceof ActionScriptObject) { + String ret = ((ActionScriptObject) member).getMemberPath(obj); + if (ret != null) { + return memberName + "." + ret; + } + } + } + return null; + } + + public Object getMember(String path) { + String pathParts[]; + if (path.startsWith("/")) { + pathParts = path.substring(1).split("/"); + } else { + pathParts = path.split("."); + } + ActionScriptObject obj = this; + for (int i = 0; i < pathParts.length; i++) { + String part = pathParts[i]; + Object member = obj.getMember(part); + if (i == pathParts.length - 1) { + return member; + } else if (member instanceof ActionScriptObject) { + obj = (ActionScriptObject) member; + } else { + break; + } + } + return null; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptWith.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptWith.java new file mode 100644 index 000000000..0a2ea3230 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptWith.java @@ -0,0 +1,19 @@ +package com.jpexs.decompiler.flash.action; + +/** + * + * @author JPEXS + */ +public class ActionScriptWith { + + protected ActionScriptObject obj; + protected long startAddr; + protected long length; + + public ActionScriptWith(ActionScriptObject obj, long startAddr, long length) { + this.obj = obj; + this.startAddr = startAddr; + this.length = length; + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/DisplayObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/DisplayObject.java new file mode 100644 index 000000000..c8e4d286c --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/DisplayObject.java @@ -0,0 +1,72 @@ +package com.jpexs.decompiler.flash.action; + +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author JPEXS + */ +public class DisplayObject extends ActionScriptObject { + + protected Map displayList = new HashMap<>(); + + protected int totalFrames; + protected int currentFrame; + protected boolean paused = false; + protected boolean dragging = false; + + public void startDrag() { + dragging = true; + } + + public void stopDrag() { + dragging = false; + } + + public int getCurrentFrame() { + return currentFrame; + } + + public int getTotalFrames() { + return totalFrames; + } + + public void gotoLabel(String label) { + //TODO + } + + public void gotoFrame(int frame) { + if (frame < 1) { + frame = 1; + } + if (frame > totalFrames) { + frame = totalFrames; + } + this.currentFrame = frame; + } + + public void pause() { + paused = true; + } + + public void play() { + paused = false; + } + + public void callFrame(int frame) { + //TODO + } + + public void addToDisplayList(int depth, Object obj) { + displayList.put(depth, obj); + } + + public Object removeFromDisplayList(int depth) { + return displayList.remove(depth); + } + + public Object getFromDisplayList(int depth) { + return displayList.get(depth); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/LocalDataArea.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/LocalDataArea.java index fe400423b..3d3e8c85b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/LocalDataArea.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/LocalDataArea.java @@ -17,9 +17,12 @@ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.ecma.Undefined; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Stack; /** @@ -32,7 +35,17 @@ public class LocalDataArea { public Stack stack = new Stack<>(); - public HashMap localVariables = new HashMap<>(); + public List functions = new ArrayList<>(); + + public Map localVariables = new HashMap<>(); + + public List withs = new ArrayList<>(); + + public Map localRegisters = new HashMap<>(); + + public Object target; + + public Stage stage; public Long jump; @@ -40,10 +53,14 @@ public class LocalDataArea { public String executionException; - public LocalDataArea() { + public LocalDataArea(Stage stage) { + this.stage = stage; + this.target = this.stage; } - public LocalDataArea(boolean preserveVariableOrder) { + public LocalDataArea(Stage stage, boolean preserveVariableOrder) { + this.stage = stage; + target = this.stage; if (preserveVariableOrder) { localVariables = new LinkedHashMap<>(); } @@ -56,6 +73,7 @@ public class LocalDataArea { jump = null; returnValue = null; executionException = null; + target = stage; } public Object pop() { @@ -65,4 +83,8 @@ public class LocalDataArea { public Double popAsNumber() { return EcmaScript.toNumberAs2(stack.pop()); } + + public String popAsString() { + return EcmaScript.toString(stack.pop()); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Stage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Stage.java new file mode 100644 index 000000000..f7c6bbd11 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Stage.java @@ -0,0 +1,34 @@ +package com.jpexs.decompiler.flash.action; + +/** + * + * @author JPEXS + */ +public class Stage extends DisplayObject { + + protected long startTime; + + public Stage() { + startTime = System.currentTimeMillis(); + } + + public long getTime() { + return System.currentTimeMillis() - startTime; + } + + public void stopSounds() { + + } + + public void toggleQuality() { + + } + + public void getURL(String url, String target) { + + } + + public void trace(Object... val) { + + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java index d5e4d9d32..65f135056 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionList; import com.jpexs.decompiler.flash.action.ActionListReader; import com.jpexs.decompiler.flash.action.LocalDataArea; +import com.jpexs.decompiler.flash.action.Stage; import com.jpexs.decompiler.flash.action.fastactionlist.ActionItem; import com.jpexs.decompiler.flash.action.fastactionlist.FastActionList; import com.jpexs.decompiler.flash.action.fastactionlist.FastActionListIterator; @@ -195,7 +196,7 @@ public class ActionDeobfuscator extends SWFDecompilerAdapter { actions.removeZeroJumps(); ActionConstantPool cPool = getConstantPool(actions); - LocalDataArea localData = new LocalDataArea(true); + LocalDataArea localData = new LocalDataArea(new Stage(), true); localData.stack = new FixItemCounterStack(); ExecutionResult result = new ExecutionResult(); FastActionListIterator iterator = actions.iterator(); @@ -222,7 +223,8 @@ public class ActionDeobfuscator extends SWFDecompilerAdapter { newIstructionCount++; } - newIstructionCount += 3 * result.variables.size(); /* 2x Push + Set or Define */ + newIstructionCount += 3 * result.variables.size(); + /* 2x Push + Set or Define */ boolean allValueValid = true; for (Object value : result.variables.values()) { @@ -381,7 +383,7 @@ public class ActionDeobfuscator extends SWFDecompilerAdapter { Map results = new HashMap<>(); - LocalDataArea localData = new LocalDataArea(); + LocalDataArea localData = new LocalDataArea(new Stage()); localData.stack = new FixItemCounterStack(); ExecutionResult result = new ExecutionResult(); for (ActionItem actionItem : actions) { @@ -505,10 +507,8 @@ public class ActionDeobfuscator extends SWFDecompilerAdapter { } else { break; } - } else { - if (!action.execute(localData)) { - break; - } + } else if (!action.execute(localData)) { + break; } if (!useVariables && (action instanceof ActionDefineLocal diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java index b9e25f527..e66859882 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.flashlite; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.FSCommand2ActionItem; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -66,4 +67,10 @@ public class ActionFSCommand2 extends Action { public int getStackPushCount(BaseLocalData localData, TranslateStack stack) { return 1; } + + @Override + public boolean execute(LocalDataArea lda) { + return true; //TODO? + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java index c924e1c39..87186f0e6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.action.flashlite; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.StrictModeActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -67,6 +68,11 @@ public class ActionStrictMode extends Action { return "StrictMode " + mode; } + @Override + public boolean execute(LocalDataArea lda) { + return true; //TODO? + } + @Override public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StrictModeActionItem(this, lineStartItem, mode)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java index eb3927927..f61b0ccb4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.swf4.ActionRandomNumber; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -26,6 +27,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.model.LocalData; import java.util.List; +import java.util.Random; /** * @@ -33,10 +35,16 @@ import java.util.List; */ public class RandomNumberActionItem extends ActionItem { + private static Random rnd = new Random(); + public RandomNumberActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem maximum) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY, maximum); } + public static Integer getResult(Object maximum) { + return rnd.nextInt(EcmaScript.toInt32(maximum)); + } + @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { writer.append("random"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java index 2885588c2..180a52112 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.action.special; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; @@ -38,6 +39,11 @@ public class ActionNop extends Action { return "Nop"; } + @Override + public boolean execute(LocalDataArea lda) { + return true; + } + @Override public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "nop();")); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java index 824ef4342..34cd99905 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.FSCommandActionItem; import com.jpexs.decompiler.flash.action.model.GetURLActionItem; @@ -49,6 +50,12 @@ public class ActionGetURL extends Action { public String targetString; + @Override + public boolean execute(LocalDataArea lda) { + lda.stage.getURL(urlString, targetString); + return true; + } + public ActionGetURL(String urlString, String targetString) { super(0x83, 0); this.urlString = urlString; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java index 692982df8..22bf343a7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java @@ -19,6 +19,8 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.GotoLabelActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -53,6 +55,12 @@ public class ActionGoToLabel extends Action { label = sis.readString("label"); } + @Override + public boolean execute(LocalDataArea lda) { + ((DisplayObject) lda.target).gotoLabel(label); + return true; + } + @Override public String toString() { return "GoToLabel \"" + Helper.escapeActionScriptString(label) + "\""; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java index 2018dcac8..d181c7bdf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java @@ -19,6 +19,8 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.GotoFrameActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -44,6 +46,12 @@ public class ActionGotoFrame extends Action { this.frame = frame; } + @Override + public boolean execute(LocalDataArea lda) { + ((DisplayObject) lda.target).gotoFrame(frame); + return true; + } + public ActionGotoFrame(int actionLength, SWFInputStream sis) throws IOException { super(0x81, actionLength); frame = sis.readUI16("frame"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java index 68c464171..8c87b01fc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java @@ -17,6 +17,8 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.NextFrameActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -41,6 +43,15 @@ public class ActionNextFrame extends Action { return "NextFrame"; } + @Override + public boolean execute(LocalDataArea lda) { + int f = ((DisplayObject) lda.target).getCurrentFrame(); + if (f < ((DisplayObject) lda.target).getTotalFrames()) { + ((DisplayObject) lda.target).gotoFrame(f + 1); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new NextFrameActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java index ad0af843f..0360d002a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java @@ -17,6 +17,8 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.GotoFrame2ActionItem; import com.jpexs.decompiler.flash.action.model.GotoFrameActionItem; @@ -44,6 +46,12 @@ public class ActionPlay extends Action { return "Play"; } + @Override + public boolean execute(LocalDataArea lda) { + ((DisplayObject) lda.target).play(); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { if (!output.isEmpty() && (output.get(output.size() - 1) instanceof GotoFrameActionItem)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java index 1bbaf8b53..91c9b241e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java @@ -17,6 +17,8 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.PrevFrameActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -41,6 +43,15 @@ public class ActionPrevFrame extends Action { return "PrevFrame"; } + @Override + public boolean execute(LocalDataArea lda) { + int f = ((DisplayObject) lda.target).getCurrentFrame(); + if (f > 1) { + ((DisplayObject) lda.target).gotoFrame(f - 1); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new PrevFrameActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java index 1ba0f97a2..812923c99 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.SetTargetActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -46,6 +47,16 @@ public class ActionSetTarget extends Action { this.targetName = targetName; } + @Override + public boolean execute(LocalDataArea lda) { + if (targetName.equals("/")) { + lda.target = lda.stage; + return true; + } + lda.target = lda.stage.getMember(targetName); + return true; + } + public ActionSetTarget(int actionLength, SWFInputStream sis, int version) throws IOException { super(0x8B, actionLength); //byte[] data = sis.readBytes(actionLength); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java index 0d2a72ad4..706d59625 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java @@ -17,6 +17,8 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.StopActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -41,6 +43,12 @@ public class ActionStop extends Action { return "Stop"; } + @Override + public boolean execute(LocalDataArea lda) { + ((DisplayObject) lda.target).pause(); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java index bc68e5852..d4ca7aaa3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.StopAllSoundsActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -41,6 +42,12 @@ public class ActionStopSounds extends Action { return "StopSounds"; } + @Override + public boolean execute(LocalDataArea lda) { + lda.stage.stopSounds(); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopAllSoundsActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java index ce3771964..067c91630 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.ToggleHighQualityActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -41,6 +42,12 @@ public class ActionToggleQuality extends Action { return "ToggleQuality"; } + @Override + public boolean execute(LocalDataArea lda) { + lda.stage.toggleQuality(); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new ToggleHighQualityActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index 0f219b971..10bdeb066 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -22,6 +22,7 @@ import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionGraph; import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.clauses.IfFrameLoadedActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; @@ -51,6 +52,12 @@ public class ActionWaitForFrame extends Action implements ActionStore { public List skipped; + @Override + public boolean execute(LocalDataArea lda) { + //it's already loaded. TODO: check real loaded? + return true; + } + public ActionWaitForFrame(int actionLength, SWFInputStream sis) throws IOException { super(0x8A, actionLength); frame = sis.readUI16("frame"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java index a31126ccc..34a9df955 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java @@ -18,7 +18,9 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.CallActionItem; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -46,6 +48,12 @@ public class ActionCall extends Action { return "Call"; } + @Override + public boolean execute(LocalDataArea lda) { + lda.stage.callFrame(EcmaScript.toInt32(lda.stack.pop())); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new CallActionItem(this, lineStartAction, stack.pop())); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java index 284484ea2..e037259ca 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.CloneSpriteActionItem; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +45,19 @@ public class ActionCloneSprite extends Action { return "CloneSprite"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 3) { + return false; + } + int depth = EcmaScript.toInt32(lda.stack.pop()); + String source = EcmaScript.toString(lda.stack.pop()); + String target = EcmaScript.toString(lda.stack.pop()); + lda.stage.setMember(target, ((ActionScriptObject) lda.stage.getMember(source)).clone()); + lda.stage.addToDisplayList(depth, lda.stage.getMember(target)); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem depth = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java index 2ddce5dd6..72daebb09 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java @@ -17,6 +17,8 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.StopDragActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -41,6 +43,14 @@ public class ActionEndDrag extends Action { return "EndDrag"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.target instanceof DisplayObject) { + ((DisplayObject) lda.target).stopDrag(); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopDragActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java index 633667773..e2981c573 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java @@ -18,8 +18,12 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.GetPropertyActionItem; +import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -43,6 +47,22 @@ public class ActionGetProperty extends Action { return "GetProperty"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + int index = EcmaScript.toInt32(lda.stack.pop()); + String target = EcmaScript.toString(lda.stack.pop()); + Object movieClip = lda.stage.getMember(target); + if (movieClip instanceof ActionScriptObject) { + lda.stack.push(((ActionScriptObject) movieClip).getProperty(index)); + return true; + } + lda.stack.push(Undefined.INSTANCE); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem index = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java index fb9c71c85..2c65f1a61 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.GetTimeActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +43,12 @@ public class ActionGetTime extends Action { return "GetTime"; } + @Override + public boolean execute(LocalDataArea lda) { + lda.stack.push(lda.stage.getTime()); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { stack.push(new GetTimeActionItem(this, lineStartAction)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java index 835fb7b92..86d9606d1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.GetURL2ActionItem; import com.jpexs.decompiler.flash.action.model.LoadMovieActionItem; @@ -34,6 +35,7 @@ import com.jpexs.decompiler.flash.action.model.UnLoadMovieActionItem; import com.jpexs.decompiler.flash.action.model.UnLoadMovieNumActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.types.annotations.Reserved; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -109,6 +111,18 @@ public class ActionGetURL2 extends Action { sendVarsMethod = (int) lexLong(lexer); } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + String target = EcmaScript.toString(lda.stack.pop()); + String urlString = EcmaScript.toString(lda.stack.pop()); + + //TODO: Execute - Connection + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem targetString = stack.pop(); @@ -158,14 +172,12 @@ public class ActionGetURL2 extends Action { } else { output.add(new LoadMovieNumActionItem(this, lineStartAction, urlString, new DirectValueActionItem(null, null, 0, (Long) (long) (int) num, new ArrayList<>()), sendVarsMethod)); } + } else if (urlStr != null && urlStr.startsWith(printPrefix)) { + output.add(new PrintActionItem(this, lineStartAction, targetString, new DirectValueActionItem(urlStr.substring(printPrefix.length())))); + } else if (urlStr != null && urlStr.startsWith(printAsBitmapPrefix)) { + output.add(new PrintAsBitmapActionItem(this, lineStartAction, targetString, new DirectValueActionItem(urlStr.substring(printAsBitmapPrefix.length())))); } else { - if (urlStr != null && urlStr.startsWith(printPrefix)) { - output.add(new PrintActionItem(this, lineStartAction, targetString, new DirectValueActionItem(urlStr.substring(printPrefix.length())))); - } else if (urlStr != null && urlStr.startsWith(printAsBitmapPrefix)) { - output.add(new PrintAsBitmapActionItem(this, lineStartAction, targetString, new DirectValueActionItem(urlStr.substring(printAsBitmapPrefix.length())))); - } else { - output.add(new GetURL2ActionItem(this, lineStartAction, urlString, targetString, sendVarsMethod)); - } + output.add(new GetURL2ActionItem(this, lineStartAction, urlString, targetString, sendVarsMethod)); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java index 8b0ded53c..2665a8728 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java @@ -20,9 +20,12 @@ import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.GotoFrame2ActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.types.annotations.Reserved; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -104,6 +107,41 @@ public class ActionGotoFrame2 extends Action { } } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 1) { + return false; + } + String frame = EcmaScript.toString(lda.stack.pop()); + String target = "/"; + if (frame.contains(":")) { + target = frame.substring(0, frame.indexOf(":")); + frame = frame.substring(frame.indexOf(":") + 1); + } + if (frame.matches("[1-9][0-9]*|0")) { + int frameNum = Integer.parseInt(frame); + if (target.equals("/")) { + lda.stage.gotoFrame(frameNum); + } else { + Object member = lda.stage.getMember(target); + if (member instanceof DisplayObject) { + ((DisplayObject) member).gotoFrame(frameNum); + } + } + } else { + String frameLabel = frame; + if (target.equals("/")) { + lda.stage.gotoLabel(frameLabel); + } else { + Object member = lda.stage.getMember(target); + if (member instanceof DisplayObject) { + ((DisplayObject) member).gotoLabel(frameLabel); + } + } + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem frame = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java index 6f2d9187a..1a739a678 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -36,6 +37,15 @@ public class ActionPop extends Action { super(0x17, 0); } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + lda.stack.pop(); + return true; + } + @Override public String toString() { return "Pop"; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index 88f9dbd68..05d2464c1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -367,6 +367,13 @@ public class ActionPush extends Action { ConstantIndex constantIndex = (ConstantIndex) value; List cPool = lda.constantPool != null ? lda.constantPool : constantPool; lda.stack.push(constantIndex.toStringNoQ(cPool, true)); + } else if (value instanceof RegisterNumber) { + int rn = ((RegisterNumber) value).number; + if (lda.localRegisters.containsKey(rn)) { + lda.stack.push(lda.localRegisters.get(rn)); + } else { + lda.stack.push(Undefined.INSTANCE); + } } else { lda.stack.push(value); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java index 51c8a7f6e..92e3807b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.RandomNumberActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +43,15 @@ public class ActionRandomNumber extends Action { return "RandomNumber"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 1) { + return false; + } + lda.stack.push(RandomNumberActionItem.getResult(lda.pop())); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem maximum = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java index 3fc8b6920..6a9f08360 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.RemoveSpriteActionItem; +import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +45,16 @@ public class ActionRemoveSprite extends Action { return "RemoveSprite"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + String target = EcmaScript.toString(lda.stack.pop()); + lda.stage.removeMember(target); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java index a345370ef..5a7f8dd11 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DecrementActionItem; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.GetPropertyActionItem; @@ -29,6 +31,7 @@ import com.jpexs.decompiler.flash.action.model.StoreRegisterActionItem; import com.jpexs.decompiler.flash.action.model.TemporaryRegister; import com.jpexs.decompiler.flash.action.model.operations.PreDecrementActionItem; import com.jpexs.decompiler.flash.action.model.operations.PreIncrementActionItem; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -52,6 +55,21 @@ public class ActionSetProperty extends Action { return "SetProperty"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 3) { + return false; + } + Object value = lda.pop(); + int index = (int) (double) lda.popAsNumber(); + String target = lda.popAsString(); + Object member = lda.stage.getMember(target); + if (member instanceof ActionScriptObject) { + ((ActionScriptObject) member).setProperty(index, value); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java index c0786071c..9b473dd3a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.SetTarget2ActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +43,16 @@ public class ActionSetTarget2 extends Action { return "SetTarget2"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + String target = lda.popAsString(); + lda.target = lda.stage.getMember(target); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java index 96d4c075e..11e51d76c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.DisplayObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.StartDragActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; @@ -43,6 +45,14 @@ public class ActionStartDrag extends Action { return "StartDrag"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.target instanceof DisplayObject) { + ((DisplayObject) lda.target).startDrag(); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java index 5583f2a17..03d434f5f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.TraceActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +43,12 @@ public class ActionTrace extends Action { return "Trace"; } + @Override + public boolean execute(LocalDataArea lda) { + lda.stage.trace(lda.pop()); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index d6e51fc2b..661363f87 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionGraph; import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.clauses.IfFrameLoadedActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -138,6 +139,12 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { return ret; } + @Override + public boolean execute(LocalDataArea lda) { + //TODO: Execute - there's no wait yet + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frame = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java index db2b43ce0..ec78baaa1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java @@ -18,6 +18,9 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptFunction; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.CallMethodActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -43,6 +46,26 @@ public class ActionCallMethod extends Action { return "CallMethod"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 3) { + return false; + } + String methodName = lda.popAsString(); + ActionScriptObject obj = (ActionScriptObject) lda.pop(); + int numArgs = (int) (double) lda.popAsNumber(); + if (lda.stack.size() < numArgs) { + return false; + } + List args = new ArrayList<>(); + for (int i = 0; i < numArgs; i++) { + args.add(lda.pop()); + } + + lda.stack.push(((ActionScriptFunction) obj.getMember(methodName)).execute(obj, args)); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java index 5734af947..04ad11163 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java @@ -113,6 +113,7 @@ public class ActionConstantPool extends Action { @Override public boolean execute(LocalDataArea lda) { + lda.constantPool = constantPool; return true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index 53fcc3d60..42c79a028 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -20,6 +20,9 @@ import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.action.ActionScriptFunction; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.FunctionActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -60,6 +63,15 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta public List constantPool; + @Override + public boolean execute(LocalDataArea lda) { + ActionScriptFunction f = new ActionScriptFunction(fileOffset, codeSize, functionName, paramNames, getRegNames()); + lda.stack.push(f); + lda.functions.add(f); + ((ActionScriptObject) lda.target).setMember(functionName, f); + return true; + } + public ActionDefineFunction(String functionName, List paramNames, int codeSize, int version) { super(0x9B, 0); this.functionName = functionName; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java index 37e4787ea..54fa4a9fd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DefineLocalActionItem; +import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -52,4 +55,14 @@ public class ActionDefineLocal2 extends Action { public int getStackPopCount(BaseLocalData localData, TranslateStack stack) { return 1; } + + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 1) { + return false; + } + + lda.localVariables.put(EcmaScript.toString(lda.pop()), Undefined.INSTANCE); + return true; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java index c4b2e85bd..b7335c377 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DeleteActionItem; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +45,16 @@ public class ActionDelete extends Action { return "Delete"; } + @Override + public boolean execute(LocalDataArea lda) { + String memberName = lda.popAsString(); + Object o = lda.pop(); + if (o instanceof ActionScriptObject) { + ((ActionScriptObject) o).setMember(memberName, Undefined.INSTANCE); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java index 770cb5b86..84a3a975d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DeleteActionItem; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +45,16 @@ public class ActionDelete2 extends Action { return "Delete2"; } + @Override + public boolean execute(LocalDataArea lda) { + String memberName = lda.popAsString(); + Object o = lda.target; //should be current scope + if (o instanceof ActionScriptObject) { + ((ActionScriptObject) o).setMember(memberName, Undefined.INSTANCE); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java index 8e57bb441..e34a13a7e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.EnumerateActionItem; +import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +45,25 @@ public class ActionEnumerate extends Action { return "Enumerate"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + String objectName = lda.popAsString(); + lda.stack.push(Null.INSTANCE); + + Object o = lda.stage.getMember(objectName); + + if (o instanceof ActionScriptObject) { + List members = ((ActionScriptObject) o).enumerate(); + for (String m : members) { + lda.stack.push(m); + } + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java index c176f1d06..cb836cd7b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.GetMemberActionItem; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,11 +45,26 @@ public class ActionGetMember extends Action { return "GetMember"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + String membername = lda.popAsString(); + Object obj = lda.pop(); + if (obj instanceof ActionScriptObject) { + lda.stack.push(((ActionScriptObject) obj).getMember(membername)); + } else { + lda.stack.push(Undefined.INSTANCE); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { - GraphTargetItem functionName = stack.pop(); + GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); - stack.push(new GetMemberActionItem(this, lineStartAction, object, functionName)); + stack.push(new GetMemberActionItem(this, lineStartAction, object, memberName)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java index 39fc197ca..cea2baa4d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptArray; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.InitArrayActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -38,6 +40,23 @@ public class ActionInitArray extends Action { super(0x42, 0); } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + int num = (int) (double) lda.popAsNumber(); + if (lda.stack.size() < num) { + return false; + } + ActionScriptArray arr = new ActionScriptArray(); + for (int i = 0; i < num; i++) { + arr.setValueAtIndex(i, lda.stack.pop()); + } + lda.stack.push(arr); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java index dfb713783..b457a5a9c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.InitObjectActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -43,6 +45,25 @@ public class ActionInitObject extends Action { return "InitObject"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + int num = (int) (double) (Double) lda.popAsNumber(); + if (lda.stack.size() < 2 * num) { + return false; + } + ActionScriptObject obj = new ActionScriptObject(); + for (int i = 0; i < num; i++) { + Object val = lda.pop(); + String name = lda.popAsString(); + obj.setMember(name, val); + } + lda.stack.push(obj); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java index 01ba611e0..9103179ed 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java @@ -18,6 +18,9 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptFunction; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.NewMethodActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -43,6 +46,28 @@ public class ActionNewMethod extends Action { return "NewMethod"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 3) { + return false; + } + String methodName = lda.popAsString(); + ActionScriptObject obj = (ActionScriptObject) lda.pop(); + int numArgs = (int) (double) lda.popAsNumber(); + if (lda.stack.size() < numArgs) { + return false; + } + List args = new ArrayList<>(); + for (int i = 0; i < numArgs; i++) { + args.add(lda.pop()); + } + ActionScriptObject nobj = new ActionScriptObject(); + + ((ActionScriptFunction) obj.getMember(methodName)).execute(nobj, args); + lda.stack.push(nobj); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java index eb647b380..d95328632 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java @@ -18,6 +18,9 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptFunction; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.NewObjectActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -43,6 +46,28 @@ public class ActionNewObject extends Action { return "NewObject"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + String objectName = lda.popAsString(); + int numArgs = (int) (double) (Double) lda.popAsNumber(); + if (lda.stack.size() < numArgs) { + return false; + } + List args = new ArrayList<>(); + for (int i = 0; i < numArgs; i++) { + args.add(lda.stack.pop()); + } + ActionScriptObject obj = new ActionScriptObject(); + //TODO:check type + ActionScriptFunction constructor = (ActionScriptFunction) lda.stage.getMember(objectName); + constructor.execute(obj, args); + lda.stack.push(obj); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem objectName = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java index 985d159c0..dd559f082 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.DecrementActionItem; import com.jpexs.decompiler.flash.action.model.GetMemberActionItem; import com.jpexs.decompiler.flash.action.model.IncrementActionItem; @@ -51,6 +53,20 @@ public class ActionSetMember extends Action { return "SetMember"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 3) { + return false; + } + Object value = lda.pop(); + String memberName = lda.popAsString(); + Object obj = lda.pop(); + if (obj instanceof ActionScriptObject) { + ((ActionScriptObject) obj).setMember(memberName, value); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java index a6b6c990a..d76d8ce99 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.StoreTypeAction; import com.jpexs.decompiler.flash.action.model.ConstantPool; import com.jpexs.decompiler.flash.action.model.DecrementActionItem; @@ -32,6 +33,7 @@ import com.jpexs.decompiler.flash.action.model.TemporaryRegister; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; +import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphSourceItemPos; @@ -50,6 +52,17 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { public int registerNumber; + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 1) { + return false; + } + + Object value = lda.pop(); + lda.localRegisters.put(registerNumber, value); + return true; + } + public ActionStoreRegister(int registerNumber) { super(0x87, 1); this.registerNumber = registerNumber; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java index a0e6bea97..51d2b25bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java @@ -18,7 +18,9 @@ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.TargetPathActionItem; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +44,22 @@ public class ActionTargetPath extends Action { return "TargetPath"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + Object obj = lda.pop(); + + String path = lda.stage.getMemberPath(obj); + if (path == null) { + lda.stack.push(Undefined.INSTANCE); + } else { + lda.stack.push(path); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java index 7f87a1536..5f55be4e5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java @@ -20,6 +20,9 @@ import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.ActionScriptWith; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.clauses.WithActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -51,6 +54,17 @@ public class ActionWith extends Action implements GraphSourceItemContainer { this.codeSize = codeSize; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + ActionScriptObject obj = (ActionScriptObject) lda.pop(); + ActionScriptWith w = new ActionScriptWith(obj, fileOffset, codeSize); + lda.withs.add(w); + return true; + } + @Override public boolean parseDivision(long size, FlasmLexer lexer) { codeSize = (int) (size - getHeaderSize()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java index 4f228d5d8..0f859b0ba 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java @@ -18,7 +18,10 @@ package com.jpexs.decompiler.flash.action.swf6; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.EnumerateActionItem; +import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -52,4 +55,21 @@ public class ActionEnumerate2 extends Action { public int getStackPopCount(BaseLocalData localData, TranslateStack stack) { return 1; } + + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.isEmpty()) { + return false; + } + Object o = lda.pop(); + lda.stack.push(Null.INSTANCE); + + if (o instanceof ActionScriptObject) { + List members = ((ActionScriptObject) o).enumerate(); + for (String m : members) { + lda.stack.push(m); + } + } + return true; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java index 30cb9cdea..0d7c6792c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf6; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.operations.InstanceOfActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +44,45 @@ public class ActionInstanceOf extends Action { return "InstanceOf"; } + public static boolean getInstanceOfResult(Object a, Object b) { + ActionScriptObject type = (ActionScriptObject) b; + ActionScriptObject obj = (ActionScriptObject) a; + + ActionScriptObject pobj = obj; + + if (pobj.getImplementsObjs().contains(type)) { + return true; + } + + while (pobj.getExtendsObj() != null) { + if (pobj.getExtendsObj() == type) { + return true; + } + pobj = (ActionScriptObject) pobj.getExtendsObj(); + if (pobj.getImplementsObjs().contains(type)) { + return true; + } + } + + return false; + } + + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + Object type = lda.stack.pop(); + Object obj = lda.stack.pop(); + if (getInstanceOfResult(obj, type)) { + lda.stack.push(Boolean.TRUE); + } else { + lda.stack.push(Boolean.FALSE); + } + + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java index 9530f2921..df292a444 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java @@ -18,7 +18,11 @@ package com.jpexs.decompiler.flash.action.swf7; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.CastOpActionItem; +import com.jpexs.decompiler.flash.action.swf6.ActionInstanceOf; +import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -42,6 +46,21 @@ public class ActionCastOp extends Action { return "CastOp"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + ActionScriptObject obj = (ActionScriptObject) lda.pop(); + ActionScriptObject constr = (ActionScriptObject) lda.pop(); + if (ActionInstanceOf.getInstanceOfResult(obj, constr)) { + lda.stack.push(obj); + } else { + lda.stack.push(Null.INSTANCE); + } + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 385d549ae..39a0e2c88 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -20,6 +20,9 @@ import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.action.ActionScriptFunction; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.FunctionActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; @@ -85,6 +88,15 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont public List constantPool; + @Override + public boolean execute(LocalDataArea lda) { + ActionScriptFunction f = new ActionScriptFunction(fileOffset, codeSize, functionName, paramNames, getRegNames()); + lda.stack.push(f); + lda.functions.add(f); + ((ActionScriptObject) lda.target).setMember(functionName, f); + return true; + } + public ActionDefineFunction2(String functionName, boolean preloadParentFlag, boolean preloadRootFlag, boolean suppressSuperFlag, boolean preloadSuperFlag, boolean suppressArgumentsFlag, boolean preloadArgumentsFlag, boolean suppressThisFlag, boolean preloadThisFlag, boolean preloadGlobalFlag, int registerCount, int codeSize, int version, List paramNames, List paramRegisters) { super(0x8E, 0); this.functionName = functionName; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java index 18ce58244..f9d2f2795 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf7; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.ExtendsActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +44,24 @@ public class ActionExtends extends Action { return "Extends"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + //TODO: check if its really ActionScriptObject ? + ActionScriptObject superClass = (ActionScriptObject) lda.pop(); + ActionScriptObject subClass = (ActionScriptObject) lda.pop(); + ActionScriptObject newClass = new ActionScriptObject(); + newClass.setMember("proto", superClass.getMember("prototype")); + newClass.setMember("constructor", superClass); + subClass.setMember("prototype", newClass); + + subClass.setExtendsObj(superClass); + + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem superclass = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java index 982a35d8b..ec05053fe 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java @@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.action.swf7; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionScriptObject; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.ImplementsOpActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -43,6 +45,25 @@ public class ActionImplementsOp extends Action { return "ImplementsOp"; } + @Override + public boolean execute(LocalDataArea lda) { + if (lda.stack.size() < 2) { + return false; + } + //TODO: check if its really scriptobject? + ActionScriptObject obj = (ActionScriptObject) lda.pop(); + int num = (int) (double) lda.popAsNumber(); + List interfaces = new ArrayList<>(); + if (lda.stack.size() < num) { + return false; + } + for (int i = 0; i < num; i++) { + interfaces.add(lda.stack.pop()); + } + obj.setImplementsObjs(interfaces); + return true; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem subclass = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java index 1df6d1185..421303d3a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.action.swf7; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.ThrowActionItem; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +43,12 @@ public class ActionThrow extends Action { return "Throw"; } + @Override + public boolean execute(LocalDataArea lda) { + //FIXME!!! + return false; + } + @Override public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java index dcc6fc74e..fd5a04838 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.ActionItem; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.clauses.TryActionItem; @@ -70,6 +71,12 @@ public class ActionTry extends Action implements GraphSourceItemContainer { private final int version; + @Override + public boolean execute(LocalDataArea lda) { + //FIXME!!! + return false; + } + public ActionTry(boolean catchInRegisterFlag, boolean finallyBlockFlag, boolean catchBlockFlag, String catchName, int catchRegister, long trySize, long catchSize, long finallySize, int version) { super(0x8F, 0); this.catchInRegisterFlag = catchInRegisterFlag;