Skip to content

Commit 7fd5d68

Browse files
authored
Merge pull request #8316 from dotty-staging/fix-#8314
Fix #8314: Define TupleXXL equals and hashCode as in case classes
2 parents 0404238 + 80f78ff commit 7fd5d68

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

library/src/scala/runtime/TupleXXL.scala

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,36 @@
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+
override def productPrefix: String = "TupleXXL"
9+
10+
override def toString: String =
11+
elems.asInstanceOf[Array[Object]].mkString("(", ",", ")")
12+
13+
override def hashCode: Int =
14+
scala.runtime.ScalaRunTime._hashCode(this)
915

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

17-
override def equals(that: Any) = that match {
18-
case that: TupleXXL => deepEquals(this.elems.asInstanceOf[Array[Object]], that.elems.asInstanceOf[Array[Object]])
21+
override def equals(that: Any): Boolean = that match {
22+
case that: TupleXXL =>
23+
es.asInstanceOf[AnyRef].eq(that.elems.asInstanceOf[AnyRef]) || {
24+
if es.length != that.elems.length then return false
25+
var i = 0
26+
while i < es.length do
27+
if es(i) != that.elems(i) then return false
28+
i += 1
29+
true
30+
}
1931
case _ => false
2032
}
33+
2134
def elems: IArray[Object] = es
2235

2336
def tailXXL: TupleXXL = {

tests/run/i8314.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
assert(t1.hashCode == t2.hashCode)
11+
assert(t1.hashCode == t3.hashCode)
12+
13+
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)
14+
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)
15+
assert((1, (1, 2)) == (1, (1, 2.0)))
16+
assert(t4 == t5)
17+
assert(t4.hashCode == t5.hashCode)
18+
19+
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))
20+
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))
21+
assert((1, 2, Array(3, 4)) != (1, 2, Array(3, 4)))
22+
assert(t6 != t7)
23+
assert(t6.hashCode != t7.hashCode)
24+
25+
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)
26+
assert(t1 != t8)
27+
assert(t1.hashCode != t8.hashCode)
28+
}

0 commit comments

Comments
 (0)