diff --git a/library/src/scala/runtime/TupleXXL.scala b/library/src/scala/runtime/TupleXXL.scala index 3b548a1ea99f..5a304f6765e1 100644 --- a/library/src/scala/runtime/TupleXXL.scala +++ b/library/src/scala/runtime/TupleXXL.scala @@ -1,23 +1,36 @@ package scala.runtime -import java.util.Arrays.{deepEquals, deepHashCode} final class TupleXXL private (es: IArray[Object]) extends Product { assert(es.length > 22) def productElement(n: Int): Any = es(n) def productArity: Int = es.length + override def productPrefix: String = "TupleXXL" + + override def toString: String = + elems.asInstanceOf[Array[Object]].mkString("(", ",", ")") + + override def hashCode: Int = + scala.runtime.ScalaRunTime._hashCode(this) - override def toString = elems.asInstanceOf[Array[Object]].mkString("(", ",", ")") - override def hashCode = getClass.hashCode * 41 + deepHashCode(elems.asInstanceOf[Array[Object]]) override def canEqual(that: Any): Boolean = that match { case that: TupleXXL => that.productArity == this.productArity case _ => false } - override def equals(that: Any) = that match { - case that: TupleXXL => deepEquals(this.elems.asInstanceOf[Array[Object]], that.elems.asInstanceOf[Array[Object]]) + override def equals(that: Any): Boolean = that match { + case that: TupleXXL => + es.asInstanceOf[AnyRef].eq(that.elems.asInstanceOf[AnyRef]) || { + if es.length != that.elems.length then return false + var i = 0 + while i < es.length do + if es(i) != that.elems(i) then return false + i += 1 + true + } case _ => false } + def elems: IArray[Object] = es def tailXXL: TupleXXL = { diff --git a/tests/run/i8314.scala b/tests/run/i8314.scala new file mode 100644 index 000000000000..0ffb1bd434c3 --- /dev/null +++ b/tests/run/i8314.scala @@ -0,0 +1,28 @@ + +@main def Test = { + + 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) + 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) + 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) + assert((1, 2) == (1, 2.0)) + assert(t1 == t2) + assert(t1 == t3) + assert(t1.hashCode == t2.hashCode) + assert(t1.hashCode == t3.hashCode) + + 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) + 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) + assert((1, (1, 2)) == (1, (1, 2.0))) + assert(t4 == t5) + assert(t4.hashCode == t5.hashCode) + + 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)) + 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)) + assert((1, 2, Array(3, 4)) != (1, 2, Array(3, 4))) + assert(t6 != t7) + assert(t6.hashCode != t7.hashCode) + + 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) + assert(t1 != t8) + assert(t1.hashCode != t8.hashCode) +}