diff options
Diffstat (limited to 'src')
-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); |