Skip to content

Commit 2fddf11

Browse files
committed
Fix #8314: Define TupleXXL equals and hashCode as in case classes
1 parent 26de50a commit 2fddf11

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

library/src/scala/runtime/TupleXXL.scala

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,41 @@
11
package scala.runtime
2-
import java.util.Arrays.{deepEquals, deepHashCode}
32

43
final class TupleXXL private (es: IArray[Object]) extends Product {
54
assert(es.length > 22)
65

76
def productElement(n: Int): Any = es(n)
87
def productArity: Int = es.length
8+
def productPrefix: String = "TupleXXL"
9+
10+
override def toString: String = elems.asInstanceOf[Array[Object]].mkString("(", ",", ")")
11+
12+
override def hashCode: Int = {
13+
var acc: Int = productPrefix.hashCode
14+
var i = 0
15+
while i < es.length do
16+
acc = Statics.mix(acc, Statics.anyHash(es(i)))
17+
i += 1
18+
Statics.finalizeHash(acc, es.length)
19+
}
920

10-
override def toString = elems.asInstanceOf[Array[Object]].mkString("(", ",", ")")
11-
override def hashCode = getClass.hashCode * 41 + deepHashCode(elems.asInstanceOf[Array[Object]])
1221
override def canEqual(that: Any): Boolean = that match {
1322
case that: TupleXXL => that.productArity == this.productArity
1423
case _ => false
1524
}
1625

17-
override def equals(that: Any) = that match {
18-
case that: TupleXXL => deepEquals(this.elems.asInstanceOf[Array[Object]], that.elems.asInstanceOf[Array[Object]])
26+
override def equals(that: Any): Boolean = that match {
27+
case that: TupleXXL =>
28+
es.asInstanceOf[AnyRef].eq(that.elems.asInstanceOf[AnyRef]) || {
29+
if es.length != that.elems.length then return false
30+
var i = 0
31+
while i < es.length do
32+
if es(i) != that.elems(i) then return false
33+
i += 1
34+
true
35+
}
1936
case _ => false
2037
}
38+
2139
def elems: IArray[Object] = es
2240

2341
def tailXXL: TupleXXL = {

tests/run/i8314.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
@main def Test = {
3+
4+
val t1: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
5+
val t2: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25.0)
6+
val t3: Tuple = (1, 2, 3, 4, 5, 6, 7, 8.0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
7+
assert((1, 2) == (1, 2.0))
8+
assert(t1 == t2)
9+
assert(t1 == t3)
10+
11+
val t4: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, t1)
12+
val t5: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, t2)
13+
assert((1, (1, 2)) == (1, (1, 2.0)))
14+
assert(t4 == t5)
15+
16+
val t6: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, Array(1, 2, 3))
17+
val t7: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, Array(1, 2, 3))
18+
assert((1, 2, Array(3, 4)) != (1, 2, Array(3, 4)))
19+
assert(t6 != t7)
20+
21+
val t8: Tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26)
22+
assert(t1 != t8)
23+
}

0 commit comments

Comments
 (0)