From cce701650143d13c8b292bffd590bf7c8eb532d7 Mon Sep 17 00:00:00 2001 From: Sébastien Doeraene Date: Wed, 20 Apr 2016 15:12:14 +0200 Subject: Remove the duplicate implem of hash codes for numbers. Previously, there were two separate implementations of hash code for boxed number classes: * One in Statics, used by the codegen of case class methods. * One in ScalaRunTime + BoxesRunTime, used by everything else. This commit removes the variant implemented in ScalaRunTime + BoxesRunTime, and always uses Statics instead. We use Statics because the one from ScalaRunTime causes an unnecessary module load. The entry point ScalaRunTime.hash() is kept, as deprecated, for bootstrapping reasons. --- test/files/run/equality.scala | 2 +- test/files/run/hashCodeBoxesRunTime.scala | 29 ----------------------------- test/files/run/hashCodeStatics.scala | 28 ++++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 30 deletions(-) delete mode 100644 test/files/run/hashCodeBoxesRunTime.scala create mode 100644 test/files/run/hashCodeStatics.scala (limited to 'test/files') diff --git a/test/files/run/equality.scala b/test/files/run/equality.scala index ff59898821..2af73691d8 100644 --- a/test/files/run/equality.scala +++ b/test/files/run/equality.scala @@ -1,7 +1,7 @@ // a quickly assembled test of equality. Needs work. object Test { - import scala.runtime.ScalaRunTime.hash + def hash(x: Any): Int = x.## // forces upcast to Any def makeFromInt(x: Int) = List( x.toByte, x.toShort, x.toInt, x.toLong, x.toFloat, x.toDouble, BigInt(x), BigDecimal(x) diff --git a/test/files/run/hashCodeBoxesRunTime.scala b/test/files/run/hashCodeBoxesRunTime.scala deleted file mode 100644 index 8ad94c252a..0000000000 --- a/test/files/run/hashCodeBoxesRunTime.scala +++ /dev/null @@ -1,29 +0,0 @@ -// This only tests direct access to the methods in BoxesRunTime, -// not the whole scheme. -object Test -{ - import java.{ lang => jl } - import scala.runtime.BoxesRunTime.hashFromNumber - import scala.runtime.ScalaRunTime.{ hash => hashFromAny } - - def allSame[T](xs: List[T]) = assert(xs.distinct.size == 1, "failed: " + xs) - - def mkNumbers(x: Int): List[Number] = - List(x.toByte, x.toShort, x, x.toLong, x.toFloat, x.toDouble) - - def testLDF(x: Long) = allSame(List[Number](x, x.toDouble, x.toFloat) map hashFromNumber) - - def main(args: Array[String]): Unit = { - List(Byte.MinValue, -1, 0, 1, Byte.MaxValue) foreach { n => - val hashes = mkNumbers(n) map hashFromNumber - allSame(hashes) - if (n >= 0) { - val charCode = hashFromAny(n.toChar: Character) - assert(charCode == hashes.head) - } - } - - testLDF(Short.MaxValue.toLong) - testLDF(Short.MinValue.toLong) - } -} diff --git a/test/files/run/hashCodeStatics.scala b/test/files/run/hashCodeStatics.scala new file mode 100644 index 0000000000..bff62cce18 --- /dev/null +++ b/test/files/run/hashCodeStatics.scala @@ -0,0 +1,28 @@ +// This only tests direct access to the methods in Statics, +// not the whole scheme. +object Test +{ + import java.{ lang => jl } + import scala.runtime.Statics.anyHash + + def allSame[T](xs: List[T]) = assert(xs.distinct.size == 1, "failed: " + xs) + + def mkNumbers(x: Int): List[Number] = + List(x.toByte, x.toShort, x, x.toLong, x.toFloat, x.toDouble) + + def testLDF(x: Long) = allSame(List[Number](x, x.toDouble, x.toFloat) map anyHash) + + def main(args: Array[String]): Unit = { + List(Byte.MinValue, -1, 0, 1, Byte.MaxValue) foreach { n => + val hashes = mkNumbers(n) map anyHash + allSame(hashes) + if (n >= 0) { + val charCode = anyHash(n.toChar: Character) + assert(charCode == hashes.head) + } + } + + testLDF(Short.MaxValue.toLong) + testLDF(Short.MinValue.toLong) + } +} -- cgit v1.2.3