diff options
author | Martin Odersky <odersky@gmail.com> | 2009-11-09 11:39:02 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-11-09 11:39:02 +0000 |
commit | 1754e3f49082e76fec87a87ea6b63299e37a2eb9 (patch) | |
tree | 085f55eb6013b1dd4ccd69db31c6a0a9cad910aa /src/library | |
parent | fe8ed5a8f992ae1a11620cb954e1b4a543327496 (diff) | |
download | scala-1754e3f49082e76fec87a87ea6b63299e37a2eb9.tar.gz scala-1754e3f49082e76fec87a87ea6b63299e37a2eb9.tar.bz2 scala-1754e3f49082e76fec87a87ea6b63299e37a2eb9.zip |
Better implementation of Predef.hash
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/Predef.scala | 4 | ||||
-rw-r--r-- | src/library/scala/runtime/BoxesRunTime.java | 23 |
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); |