# HG changeset patch # User Martin Soch # Date 1360255301 -3600 # Node ID b9bf26ea01182e2b1608c3ef894e4b4d80eb46ce # Parent 6cad41d877d2b27a3713d99df3fe5d7fcdaa6f2d Fixed negation for Integer.MIN_VALUE diff -r 6cad41d877d2 -r b9bf26ea0118 emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Thu Feb 07 17:24:19 2013 +0100 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Thu Feb 07 17:41:41 2013 +0100 @@ -4,6 +4,7 @@ Number.prototype.mul32 = function(x) { return (((this * (x >> 16)) << 16) + this * (x & 0xFFFF)) | 0; }; +Number.prototype.neg32 = function() { return (-this) | 0; }; Number.prototype.toInt8 = function() { return (this << 24) >> 24; }; Number.prototype.toInt16 = function() { return (this << 16) >> 16; }; diff -r 6cad41d877d2 -r b9bf26ea0118 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Feb 07 17:24:19 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Feb 07 17:41:41 2013 +0100 @@ -598,7 +598,7 @@ emit(out, "@1 = @1.xor64(@2);", smapper.getL(1), smapper.popL()); break; case opc_ineg: - emit(out, "@1 = -@1;", smapper.getI(0)); + emit(out, "@1 = @1.neg32();", smapper.getI(0)); break; case opc_lneg: emit(out, "@1 = @1.neg64();", smapper.getL(0)); diff -r 6cad41d877d2 -r b9bf26ea0118 vmtest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java Thu Feb 07 17:24:19 2013 +0100 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java Thu Feb 07 17:41:41 2013 +0100 @@ -47,6 +47,10 @@ return x % y; } + private static int neg(int x) { + return (-x); + } + @Compare public int addOverflow() { return add(Integer.MAX_VALUE, 1); } @@ -91,6 +95,18 @@ return mod(1, 2); } + @Compare public int negate() { + return neg(123456); + } + + @Compare public int negateMaxInt() { + return neg(Integer.MAX_VALUE); + } + + @Compare public int negateMinInt() { + return neg(Integer.MIN_VALUE); + } + @Compare public int sumTwoDimensions() { int[][] matrix = createMatrix(4, 3); matrix[0][0] += 10;