diff options
author | Paul Phillips <paulp@improving.org> | 2009-11-09 22:03:12 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-11-09 22:03:12 +0000 |
commit | a0159da70da18f65863947aa4d016ca52fd7bb4f (patch) | |
tree | 916acfd275d3c0bf3c59aa9d599fed37162c2c9a /test | |
parent | 26a13165f4a00ce8c0336058fbde937ddb59e718 (diff) | |
download | scala-a0159da70da18f65863947aa4d016ca52fd7bb4f.tar.gz scala-a0159da70da18f65863947aa4d016ca52fd7bb4f.tar.bz2 scala-a0159da70da18f65863947aa4d016ca52fd7bb4f.zip |
Breaks down the hash function in BoxesRunTime b...
Breaks down the hash function in BoxesRunTime by type so we can do as
much as possible at compile time. Documents various trouble points I've
identified with trying to get the hashCodes aligned. Test case exercises
the hashCode functions.
Deleted all the code associated with previous equality adventures. Don't
worry, I can put anything back if it turns out we have to change course
again, but for now it's noise.
Also, gives return types to the box and unbox methods which are added to
the primitive companions, so e.g. Int.box(5) now returns a j.l.Integer
instead of an Object.
Diffstat (limited to 'test')
-rw-r--r-- | test/files/run/hashCodeBoxesRunTime.scala | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/test/files/run/hashCodeBoxesRunTime.scala b/test/files/run/hashCodeBoxesRunTime.scala new file mode 100644 index 0000000000..3eacacb663 --- /dev/null +++ b/test/files/run/hashCodeBoxesRunTime.scala @@ -0,0 +1,28 @@ +// 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, hashFromObject } + + def allSame[T](xs: List[T]) = assert(xs.removeDuplicates.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 = hashFromObject(n.toChar: Character) + assert(charCode == hashes.head) + } + } + + testLDF(Short.MaxValue.toLong) + testLDF(Short.MinValue.toLong) + } +} |