summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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);