diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-01-08 01:08:31 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-01-08 01:08:31 +0000 |
commit | 59f0b4054666b684a16500c84f51134f099a0191 (patch) | |
tree | 372d91872a42a7943ba1a5e7168fd4478f3cb608 | |
parent | 3c0439b77fd9dfb520e8a1bfc9656bfc6d9b0c42 (diff) |
fixed Integer/LongOps.Negate overflow when MIN_VALUE
-rw-r--r-- | src/jvm/clojure/lang/Numbers.java | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java index 8462a4be..e40fe39a 100644 --- a/src/jvm/clojure/lang/Numbers.java +++ b/src/jvm/clojure/lang/Numbers.java @@ -457,7 +457,10 @@ final static class IntegerOps implements Ops{ //public Number subtract(Number x, Number y); final public Number negate(Number x){ - return -x.intValue(); + int val = x.intValue(); + if(val > Integer.MIN_VALUE) + return -val; + return -((long) val); } public Number inc(Number x){ @@ -583,7 +586,10 @@ final static class LongOps implements Ops{ //public Number subtract(Number x, Number y); final public Number negate(Number x){ - return -x.longValue(); + long val = x.longValue(); + if(val > Long.MIN_VALUE) + return -val; + return BigInteger.valueOf(val).negate(); } public Number inc(Number x){ |