From 10fb289ad8c4a7863ccd0a2110532d141ffbd126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 5 Jun 2014 20:20:26 +0200 Subject: [PATCH] Missing few pops after expression as command Issue #527 linkage as duplicate export --- .../abc/avm2/instructions/stack/PopIns.java | 5 +++-- .../parser/script/AVM2SourceGenerator.java | 9 +++++++++ .../parser/script/ActionSourceGenerator.java | 9 +++++++++ .../decompiler/flash/xfl/XFLConverter.java | 20 +++++++++++++++---- .../decompiler/graph/GraphTargetItem.java | 5 ++++- .../decompiler/graph/SourceGenerator.java | 2 ++ 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java b/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java index 435d5b083..6f05aa7f8 100644 --- a/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java +++ b/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java @@ -49,7 +49,8 @@ public class PopIns extends InstructionDefinition { @Override public void translate(boolean isStatic, int scriptIndex, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { if (stack.size() > 0) { - GraphTargetItem top = stack.pop(); + GraphTargetItem top = stack.pop(); + //TODO: handle all values (#585) - beware collision with return inside finally block if (top instanceof CallPropertyAVM2Item) { output.add(top); } else if (top instanceof CallSuperAVM2Item) { @@ -62,9 +63,9 @@ public class PopIns extends InstructionDefinition { output.add(top); } else if (top instanceof AssignmentAVM2Item) { output.add(top); - } } } + } @Override public int getStackDelta(AVM2Instruction ins, ABC abc) { diff --git a/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index dcb8b66f6..3305ab6b5 100644 --- a/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -2421,4 +2421,13 @@ public class AVM2SourceGenerator implements SourceGenerator { return name_index; } + + @Override + public List generateDiscardValue(SourceGeneratorLocalData localData, GraphTargetItem item) throws CompilationException { + List ret=item.toSource(localData, this); + ret.add(ins(new PopIns())); + return ret; + } + + } diff --git a/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index acd78ed4a..48841d3ba 100644 --- a/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -777,4 +777,13 @@ public class ActionSourceGenerator implements SourceGenerator { return new ArrayList<>(); } + @Override + public List generateDiscardValue(SourceGeneratorLocalData localData, GraphTargetItem item) throws CompilationException { + List ret=item.toSource(localData, this); + ret.add(new ActionPop()); + return ret; + } + + + } diff --git a/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 69e616175..0e1943a90 100644 --- a/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -1522,12 +1522,18 @@ public class XFLConverter { mediaLinkStr += "\""; mediaLinkStr += " exportFormat=\"" + format + "\" exportBits=\"" + bits + "\" sampleCount=\"" + soundSampleCount + "\""; + boolean linkageExportForAS = false; if (characterClasses.containsKey(symbol.getCharacterId())) { - mediaLinkStr += " linkageExportForAS=\"true\" linkageClassName=\"" + characterClasses.get(symbol.getCharacterId()) + "\""; + linkageExportForAS = true; + mediaLinkStr += " linkageClassName=\"" + characterClasses.get(symbol.getCharacterId()) + "\""; } if (characterVariables.containsKey(symbol.getCharacterId())) { - mediaLinkStr += " linkageExportForAS=\"true\" linkageIdentifier=\"" + xmlString(characterVariables.get(symbol.getCharacterId())) + "\""; + linkageExportForAS = true; + mediaLinkStr += " linkageIdentifier=\"" + xmlString(characterVariables.get(symbol.getCharacterId())) + "\""; + } + if (linkageExportForAS) { + mediaLinkStr += " linkageExportForAS=\"true\""; } mediaLinkStr += "/>\n"; @@ -1589,11 +1595,17 @@ public class XFLConverter { mediaLinkStr += " height=\"" + video.height + "\""; double len = ((double) video.numFrames) / ((double) swf.frameRate); mediaLinkStr += " length=\"" + len + "\""; + boolean linkageExportForAS = false; if (characterClasses.containsKey(symbol.getCharacterId())) { - mediaLinkStr += " linkageExportForAS=\"true\" linkageClassName=\"" + characterClasses.get(symbol.getCharacterId()) + "\""; + linkageExportForAS = true; + mediaLinkStr += " linkageClassName=\"" + characterClasses.get(symbol.getCharacterId()) + "\""; } if (characterVariables.containsKey(symbol.getCharacterId())) { - mediaLinkStr += " linkageExportForAS=\"true\" linkageIdentifier=\"" + xmlString(characterVariables.get(symbol.getCharacterId())) + "\""; + linkageExportForAS = true; + mediaLinkStr += " linkageIdentifier=\"" + xmlString(characterVariables.get(symbol.getCharacterId())) + "\""; + } + if(linkageExportForAS){ + mediaLinkStr += " linkageExportForAS=\"true\""; } mediaLinkStr += "/>\n"; } diff --git a/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/src/com/jpexs/decompiler/graph/GraphTargetItem.java index 553d7c87a..3d95c3304 100644 --- a/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -206,7 +206,10 @@ public abstract class GraphTargetItem implements Serializable { } public List toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { - return toSource(localData, generator); + if(!hasReturnValue()){ + return toSource(localData, generator); + } + return generator.generateDiscardValue(localData, this); } protected List toSourceBinary(BinaryOp op, GraphSourceItem action) { diff --git a/src/com/jpexs/decompiler/graph/SourceGenerator.java b/src/com/jpexs/decompiler/graph/SourceGenerator.java index 5c6b9d6bd..a4f0a4b6b 100644 --- a/src/com/jpexs/decompiler/graph/SourceGenerator.java +++ b/src/com/jpexs/decompiler/graph/SourceGenerator.java @@ -67,4 +67,6 @@ public interface SourceGenerator { public List generate(SourceGeneratorLocalData localData, CommaExpressionItem item) throws CompilationException; public List generate(SourceGeneratorLocalData localData, TypeItem item) throws CompilationException; + + public List generateDiscardValue(SourceGeneratorLocalData localData, GraphTargetItem item) throws CompilationException; }