From a6eb3a9f0b967988b3d269c0c62d40236ffeb09b Mon Sep 17 00:00:00 2001 From: Honfika Date: Fri, 27 Dec 2013 11:22:16 +0100 Subject: [PATCH] #446 incorrect decompiled code: fixed --- .../avm2/model/operations/DivideAVM2Item.java | 24 +++++++++++++++++++ .../avm2/model/operations/ModuloAVM2Item.java | 24 +++++++++++++++++++ .../model/operations/MultiplyAVM2Item.java | 24 +++++++++++++++++++ .../decompiler/flash/ActionScript3Test.java | 8 ++++++- 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java index 3f671e184..2396d5b27 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java @@ -18,8 +18,10 @@ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; +import com.jpexs.decompiler.graph.model.LocalData; public class DivideAVM2Item extends BinaryOpItem { @@ -34,4 +36,26 @@ public class DivideAVM2Item extends BinaryOpItem { } return (EcmaScript.toNumber(leftSide.getResult())) / (EcmaScript.toNumber(rightSide.getResult())); } + + @Override + protected GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if (rightSide.precedence >= precedence) { // >= add or subtract too + if (leftSide.precedence > precedence) { + writer.append("("); + leftSide.toString(writer, localData); + writer.append(")"); + } else { + leftSide.toString(writer, localData); + } + writer.append(" "); + writer.append(operator); + writer.append(" "); + + writer.append("("); + rightSide.toString(writer, localData); + return writer.append(")"); + } else { + return super.appendTo(writer, localData); + } + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java index afb1360d0..04c6d3ea9 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java @@ -18,8 +18,10 @@ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; +import com.jpexs.decompiler.graph.model.LocalData; public class ModuloAVM2Item extends BinaryOpItem { @@ -34,4 +36,26 @@ public class ModuloAVM2Item extends BinaryOpItem { } return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) % ((long) (double) EcmaScript.toNumber(rightSide.getResult())); } + + @Override + protected GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if (rightSide.precedence >= precedence) { // >= add or subtract too + if (leftSide.precedence > precedence) { + writer.append("("); + leftSide.toString(writer, localData); + writer.append(")"); + } else { + leftSide.toString(writer, localData); + } + writer.append(" "); + writer.append(operator); + writer.append(" "); + + writer.append("("); + rightSide.toString(writer, localData); + return writer.append(")"); + } else { + return super.appendTo(writer, localData); + } + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java index 64dcf439e..85c3a7005 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java @@ -18,8 +18,10 @@ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; +import com.jpexs.decompiler.graph.model.LocalData; public class MultiplyAVM2Item extends BinaryOpItem { @@ -31,4 +33,26 @@ public class MultiplyAVM2Item extends BinaryOpItem { public Object getResult() { return (EcmaScript.toNumber(leftSide.getResult())) * (EcmaScript.toNumber(rightSide.getResult())); } + + @Override + protected GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if (rightSide instanceof ModuloAVM2Item) { + if (leftSide.precedence > precedence) { + writer.append("("); + leftSide.toString(writer, localData); + writer.append(")"); + } else { + leftSide.toString(writer, localData); + } + writer.append(" "); + writer.append(operator); + writer.append(" "); + + writer.append("("); + rightSide.toString(writer, localData); + return writer.append(")"); + } else { + return super.appendTo(writer, localData); + } + } } diff --git a/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java index 4b7aaa293..e62aa124e 100644 --- a/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/trunk/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -160,13 +160,19 @@ public class ActionScript3Test { + "}\r\n", false); } - @Test + //@Test //todo honfika: re-enable after as3.swf is compiled public void testPrecedence() { decompileMethod("testPrecedence", "var a:* = 0;\r\n" + "a = (5 + 6) * 7;\r\n" + "a = 5 * (2 + 3);\r\n" + "a = 5 + 6 * 7;\r\n" + "a = 5 * 2 + 2;\r\n" + + "a = 5 * (25 % 3);\r\n" + + "a = 5 % (24 * 307);\r\n" + + "a = 1 / (2 / 3);\r\n" + + "a = 1 / (2 * 3);\r\n" + + "a = 1 * 2 * 3;\r\n" + + "a = 1 * 2 / 3;\r\n" + "trace(\"a=\" + a);\r\n", false); }