diff --git a/trunk/src/com/jpexs/decompiler/flash/action/model/operations/BitXorActionItem.java b/trunk/src/com/jpexs/decompiler/flash/action/model/operations/BitXorActionItem.java index aa7c29827..783b2c1bf 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/model/operations/BitXorActionItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/model/operations/BitXorActionItem.java @@ -17,13 +17,16 @@ package com.jpexs.decompiler.flash.action.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.swf5.ActionBitXor; 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; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.model.BinaryOpItem; +import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import java.util.List; @@ -38,6 +41,25 @@ public class BitXorActionItem extends BinaryOpItem { return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) ^ ((long) (double) EcmaScript.toNumber(rightSide.getResult())); } + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if((rightSide instanceof DirectValueActionItem)&&(((DirectValueActionItem)rightSide).value.equals(4.294967295E9))){ + writer.append("~"); + if(leftSide.getPrecedence()>PRECEDENCE_UNARY){ + writer.append("("); + } + leftSide.appendTo(writer, localData); + if(leftSide.getPrecedence()>PRECEDENCE_UNARY){ + writer.append(")"); + } + return writer; + }else{ + return super.appendTo(writer, localData); + } + } + + + @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { return toSourceMerge(localData, generator, leftSide, rightSide, new ActionBitXor()); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/model/operations/SubtractActionItem.java b/trunk/src/com/jpexs/decompiler/flash/action/model/operations/SubtractActionItem.java index 3776d51ff..0a4c78d18 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/model/operations/SubtractActionItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/model/operations/SubtractActionItem.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.action.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.swf4.ActionSubtract; import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; @@ -42,24 +43,34 @@ public class SubtractActionItem extends BinaryOpItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - if (rightSide.getPrecedence() >= precedence) { // >= add or subtract too - String ret = ""; - if (leftSide.getPrecedence() > precedence) { - writer.append("("); - leftSide.toString(writer, localData); - writer.append(")"); - } else { - leftSide.toString(writer, localData); - } - writer.append(" "); + if ((leftSide instanceof DirectValueActionItem) + && (((((DirectValueActionItem) leftSide).value instanceof Float) && (((Float) ((DirectValueActionItem) leftSide).value) == 0f)) + || ((((DirectValueActionItem) leftSide).value instanceof Double) && (((Double) ((DirectValueActionItem) leftSide).value) == 0.0)) + || ((((DirectValueActionItem) leftSide).value instanceof Long) && (((Long) ((DirectValueActionItem) leftSide).value) == 0L)))) { writer.append(operator); writer.append(" "); - - writer.append("("); - rightSide.toString(writer, localData); - return writer.append(")"); + rightSide.appendTo(writer, localData); + return writer; } else { - return super.appendTo(writer, localData); + if (rightSide.getPrecedence() >= precedence) { // >= add or subtract too + + if (leftSide.getPrecedence() > 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/action/parser/script/ActionScriptParser.java b/trunk/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptParser.java index cd493cd00..ecb6a2e91 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptParser.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptParser.java @@ -1481,6 +1481,11 @@ public class ActionScriptParser { boolean existsRemainder = false; boolean assocRight = false; switch (s.type) { + case NEGATE: + ret = expression(registerVars, inFunction, inMethod, false, variables); + ret = new BitXorActionItem(null, ret, new DirectValueActionItem(4.294967295E9)); + existsRemainder = true; + break; case MINUS: s = lex(); if (s.isType(SymbolType.DOUBLE)) { diff --git a/trunk/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/trunk/test/com/jpexs/decompiler/flash/ActionScript2Test.java index 4baec75fe..e6af4c66f 100644 --- a/trunk/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/trunk/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -795,4 +795,14 @@ public class ActionScript2Test extends ActionStript2TestBase { ); } + @Test + public void frame59_unaryOpTest() { + compareSrc(59, "trace(\"unaryOpTest\");\r\n" + + "var a = 5;\r\n" + + "var c = ~a;\r\n" + + "var d = ~(a + c);\r\n" + + "var e = - c;\r\n" + ); + } + } diff --git a/trunk/testdata/as2/as2.fla b/trunk/testdata/as2/as2.fla index 26d00063d..ea526f900 100644 Binary files a/trunk/testdata/as2/as2.fla and b/trunk/testdata/as2/as2.fla differ diff --git a/trunk/testdata/as2/as2.swf b/trunk/testdata/as2/as2.swf index 41710e660..691758e26 100644 Binary files a/trunk/testdata/as2/as2.swf and b/trunk/testdata/as2/as2.swf differ