summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-11-09 11:39:02 +0000
committerMartin Odersky <odersky@gmail.com>2009-11-09 11:39:02 +0000
commit1754e3f49082e76fec87a87ea6b63299e37a2eb9 (patch)
tree085f55eb6013b1dd4ccd69db31c6a0a9cad910aa /src
parentfe8ed5a8f992ae1a11620cb954e1b4a543327496 (diff)
downloadscala-1754e3f49082e76fec87a87ea6b63299e37a2eb9.tar.gz
scala-1754e3f49082e76fec87a87ea6b63299e37a2eb9.tar.bz2
scala-1754e3f49082e76fec87a87ea6b63299e37a2eb9.zip
Better implementation of Predef.hash
Diffstat (limited to 'src')
-rw-r--r--src/library/scala/Predef.scala4
-rw-r--r--src/library/scala/runtime/BoxesRunTime.java23
2 files changed, 25 insertions, 2 deletions
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index c3f6ad9eff..df6cc61ee6 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -91,10 +91,10 @@ object Predef extends LowPriorityImplicits {
def currentThread = java.lang.Thread.currentThread()
- // hashcode and equality -------------------------------------------------
+ // hashcode -----------------------------------------------------------
@inline def hash(x: Any): Int =
- if (x.isInstanceOf[Number]) (x.asInstanceOf[Number]).intValue else x.hashCode
+ if (x.isInstanceOf[Number]) runtime.BoxesRunTime.numHash(x.asInstanceOf[Number]) else x.hashCode
// errors and asserts -------------------------------------------------
diff --git a/src/library/scala/runtime/BoxesRunTime.java b/src/library/scala/runtime/BoxesRunTime.java
index b5df9d8ce8..c965bc2e95 100644
--- a/src/library/scala/runtime/BoxesRunTime.java
+++ b/src/library/scala/runtime/BoxesRunTime.java
@@ -178,6 +178,29 @@ public class BoxesRunTime
return x.intValue() == ch;
}
+ public static int numHash(Number n) {
+ if (n instanceof Long) {
+ int iv = n.intValue();
+ long lv = n.longValue();
+ if (lv == iv) return iv;
+ } else if (n instanceof Float) {
+ int iv = n.intValue();
+ float fv = n.floatValue();
+ if (fv == iv) return iv;
+ long lv = n.longValue();
+ if (fv == lv) return new Long(lv).hashCode();
+ } else if (n instanceof Double) {
+ int iv = n.intValue();
+ double dv = n.doubleValue();
+ if (dv == iv) return iv;
+ float fv = n.floatValue();
+ if (dv == fv) return new Float(fv).hashCode();
+ long lv = n.longValue();
+ if (dv == lv) return new Long(lv).hashCode();
+ }
+ return n.hashCode();
+ }
+
private static boolean equalsBonusLogicFromScala27(Object a, Object b) {
if (a instanceof Number || a instanceof Character || b instanceof Number || b instanceof Character) {
int acode = typeCode(a);