From 59bc3b2010ae7b0c8efb77e82939118b2f435045 Mon Sep 17 00:00:00 2001 From: Alexander Taggart Date: Mon, 25 Apr 2011 13:52:22 -0700 Subject: [PATCH] Fix false-negative test for (long Float/MAX_VALUE) and (long Double/MAX_VALUE). Fix unintentionally unchecked conversion of decimal objects to long. --- src/jvm/clojure/lang/RT.java | 7 ++++++- test/clojure/test_clojure/numbers.clj | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index c467d31..d19319e 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -1000,7 +1000,12 @@ static public long longCast(Object x){ else throw new IllegalArgumentException("Value out of range for long: " + x); } - return ((Number) x).longValue(); + else if (x instanceof Byte || x instanceof Short) + return ((Number) x).longValue(); + else if (x instanceof Ratio) + return longCast(((Ratio)x).bigIntegerValue()); + else + return longCast(((Number)x).doubleValue()); } static public long longCast(int x){ diff --git a/test/clojure/test_clojure/numbers.clj b/test/clojure/test_clojure/numbers.clj index 301f6e4..08cf60c 100644 --- a/test/clojure/test_clojure/numbers.clj +++ b/test/clojure/test_clojure/numbers.clj @@ -106,7 +106,7 @@ [unchecked-short [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE -1 -1 -1 -1]] [int [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE :error :error :error]] [unchecked-int [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE -1 Integer/MAX_VALUE Integer/MAX_VALUE]] - [long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE]] + [long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE :error :error]] [unchecked-long [-1 0 1 Byte/MAX_VALUE Short/MAX_VALUE Integer/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE Long/MAX_VALUE]] ;; 2.14748365E9 if when float/double conversion is avoided... [float [-1.0 0.0 1.0 127.0 32767.0 2.147483648E9 9.223372036854776E18 Float/MAX_VALUE :error]] -- 1.7.3.5