summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Gruntz <dominik.gruntz@fhnw.ch>2012-05-10 11:45:49 +0200
committerDominik Gruntz <dominik.gruntz@fhnw.ch>2012-05-10 11:45:49 +0200
commitebfc16f6709f928a8ba1aa9d40f6bfddec69848b (patch)
tree28c3f7b31b61782d9bc46c049e2cd3bc0b7f4c58
parentb0dd0452fd14ad46c4be782f9227a0540782a2d7 (diff)
downloadscala-ebfc16f6709f928a8ba1aa9d40f6bfddec69848b.tar.gz
scala-ebfc16f6709f928a8ba1aa9d40f6bfddec69848b.tar.bz2
scala-ebfc16f6709f928a8ba1aa9d40f6bfddec69848b.zip
Fixes SI-5640
-rw-r--r--src/library/scala/runtime/BoxesRunTime.java5
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala11
-rw-r--r--test/files/run/hashhash.scala8
3 files changed, 16 insertions, 8 deletions
diff --git a/src/library/scala/runtime/BoxesRunTime.java b/src/library/scala/runtime/BoxesRunTime.java
index 258a176671..8fe9a017d0 100644
--- a/src/library/scala/runtime/BoxesRunTime.java
+++ b/src/library/scala/runtime/BoxesRunTime.java
@@ -228,7 +228,7 @@ public final class BoxesRunTime
* as yet have not.
*
* Note: Among primitives, Float.NaN != Float.NaN, but the boxed
- * verisons are equal. This still needs reconciliation.
+ * versions are equal. This still needs reconciliation.
*/
public static int hashFromLong(java.lang.Long n) {
int iv = n.intValue();
@@ -242,6 +242,9 @@ public final class BoxesRunTime
long lv = n.longValue();
if (lv == dv) return java.lang.Long.valueOf(lv).hashCode();
+
+ float fv = n.floatValue();
+ if (fv == dv) return java.lang.Float.valueOf(fv).hashCode();
else return n.hashCode();
}
public static int hashFromFloat(java.lang.Float n) {
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index a04fd23710..4c5e0e408b 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -234,13 +234,10 @@ object ScalaRunTime {
// Note that these are the implementations called by ##, so they
// must not call ## themselves.
- @inline def hash(x: Any): Int = x match {
- case null => 0
- case x: Double => hash(x)
- case x: Float => hash(x)
- case x: java.lang.Number => hash(x)
- case _ => x.hashCode
- }
+ @inline def hash(x: Any): Int =
+ if (x == null) 0
+ else if (x.isInstanceOf[java.lang.Number]) BoxesRunTime.hashFromNumber(x.asInstanceOf[java.lang.Number])
+ else x.hashCode
@inline def hash(dv: Double): Int = {
val iv = dv.toInt
diff --git a/test/files/run/hashhash.scala b/test/files/run/hashhash.scala
index dc31df8cfa..f9fc067398 100644
--- a/test/files/run/hashhash.scala
+++ b/test/files/run/hashhash.scala
@@ -9,7 +9,15 @@ object Test {
val x = (BigInt(1) << 64).toDouble
val y: Any = x
+ val f: Float = x.toFloat
+ val jn: java.lang.Number = x
+ val jf: java.lang.Float = x.toFloat
+ val jd: java.lang.Double = x
assert(x.## == y.##, ((x, y)))
+ assert(x.## == f.##, ((x, f)))
+ assert(x.## == jn.##, ((x, jn)))
+ assert(x.## == jf.##, ((x, jf)))
+ assert(x.## == jd.##, ((x, jd)))
}
}