summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-01-08 01:08:31 +0000
committerRich Hickey <richhickey@gmail.com>2009-01-08 01:08:31 +0000
commit59f0b4054666b684a16500c84f51134f099a0191 (patch)
tree372d91872a42a7943ba1a5e7168fd4478f3cb608
parent3c0439b77fd9dfb520e8a1bfc9656bfc6d9b0c42 (diff)
fixed Integer/LongOps.Negate overflow when MIN_VALUE
-rw-r--r--src/jvm/clojure/lang/Numbers.java10
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){