summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-05-08 16:02:48 -0700
committerPaul Phillips <paulp@improving.org>2012-05-08 16:31:11 -0700
commit58bb2d1bd2000ac3aa2c64b6c5dc56c91e911860 (patch)
tree2a319566df86ebd6f7b55bc5e46142fdedea5f0f
parent067c2569257f73afee4ae584f6a589980a8e4660 (diff)
downloadscala-58bb2d1bd2000ac3aa2c64b6c5dc56c91e911860.tar.gz
scala-58bb2d1bd2000ac3aa2c64b6c5dc56c91e911860.tar.bz2
scala-58bb2d1bd2000ac3aa2c64b6c5dc56c91e911860.zip
Fix for ## inconsistency.
Hopefully without slowing things down overmuch. Closes SI-5640.
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala11
-rw-r--r--test/files/run/hashhash.scala5
2 files changed, 12 insertions, 4 deletions
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index 4c5e0e408b..a04fd23710 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -234,10 +234,13 @@ object ScalaRunTime {
// Note that these are the implementations called by ##, so they
// must not call ## themselves.
- @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(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(dv: Double): Int = {
val iv = dv.toInt
diff --git a/test/files/run/hashhash.scala b/test/files/run/hashhash.scala
index b9cec99a12..dc31df8cfa 100644
--- a/test/files/run/hashhash.scala
+++ b/test/files/run/hashhash.scala
@@ -6,5 +6,10 @@ object Test {
/** Just a little sanity check, not to be confused with a unit test. */
List(5, 5.5f, "abc", new AnyRef, ()) foreach confirmSame
List(5.0f, 1.0d, -(5.0f), (-1.0d)) foreach confirmDifferent
+
+ val x = (BigInt(1) << 64).toDouble
+ val y: Any = x
+
+ assert(x.## == y.##, ((x, y)))
}
}