Skip to content

Commit 066bad6

Browse files
authored
Merge pull request scala/scala#7027 from NthPortal/scala-dev#532/PR
Use BoxesRunTime.equals for ArraySeq comparison
2 parents ce8db6b + 7183eba commit 066bad6

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
lines changed

library/src/scala/collection/immutable/ArraySeq.scala

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import scala.collection.IterableOnce
99
import scala.annotation.unchecked.uncheckedVariance
1010
import scala.util.hashing.MurmurHash3
1111
import scala.reflect.ClassTag
12-
import scala.runtime.ScalaRunTime
12+
import scala.runtime.{BoxesRunTime, ScalaRunTime}
1313
import java.util.Arrays
1414

1515
/**
@@ -228,9 +228,12 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
228228
def length: Int = unsafeArray.length
229229
@throws[ArrayIndexOutOfBoundsException]
230230
def apply(i: Int): T = unsafeArray(i)
231-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
232-
override def equals(that: Any) = that match {
233-
case that: ofRef[_] => Arrays.equals(unsafeArray.asInstanceOf[Array[AnyRef]], that.unsafeArray.asInstanceOf[Array[AnyRef]])
231+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
232+
override def equals(that: Any): Boolean = that match {
233+
case that: ofRef[_] =>
234+
BoxesRunTime.arraysEquals(
235+
this.unsafeArray.asInstanceOf[Array[AnyRef]],
236+
that.unsafeArray.asInstanceOf[Array[AnyRef]])
234237
case _ => super.equals(that)
235238
}
236239
}
@@ -241,7 +244,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
241244
def length: Int = unsafeArray.length
242245
@throws[ArrayIndexOutOfBoundsException]
243246
def apply(i: Int): Byte = unsafeArray(i)
244-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
247+
override def hashCode = MurmurHash3.byteArraySeqHash(unsafeArray)
245248
override def equals(that: Any) = that match {
246249
case that: ofByte => Arrays.equals(unsafeArray, that.unsafeArray)
247250
case _ => super.equals(that)
@@ -254,7 +257,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
254257
def length: Int = unsafeArray.length
255258
@throws[ArrayIndexOutOfBoundsException]
256259
def apply(i: Int): Short = unsafeArray(i)
257-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
260+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
258261
override def equals(that: Any) = that match {
259262
case that: ofShort => Arrays.equals(unsafeArray, that.unsafeArray)
260263
case _ => super.equals(that)
@@ -267,7 +270,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
267270
def length: Int = unsafeArray.length
268271
@throws[ArrayIndexOutOfBoundsException]
269272
def apply(i: Int): Char = unsafeArray(i)
270-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
273+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
271274
override def equals(that: Any) = that match {
272275
case that: ofChar => Arrays.equals(unsafeArray, that.unsafeArray)
273276
case _ => super.equals(that)
@@ -283,7 +286,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
283286
def length: Int = unsafeArray.length
284287
@throws[ArrayIndexOutOfBoundsException]
285288
def apply(i: Int): Int = unsafeArray(i)
286-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
289+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
287290
override def equals(that: Any) = that match {
288291
case that: ofInt => Arrays.equals(unsafeArray, that.unsafeArray)
289292
case _ => super.equals(that)
@@ -296,7 +299,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
296299
def length: Int = unsafeArray.length
297300
@throws[ArrayIndexOutOfBoundsException]
298301
def apply(i: Int): Long = unsafeArray(i)
299-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
302+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
300303
override def equals(that: Any) = that match {
301304
case that: ofLong => Arrays.equals(unsafeArray, that.unsafeArray)
302305
case _ => super.equals(that)
@@ -309,7 +312,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
309312
def length: Int = unsafeArray.length
310313
@throws[ArrayIndexOutOfBoundsException]
311314
def apply(i: Int): Float = unsafeArray(i)
312-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
315+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
313316
override def equals(that: Any) = that match {
314317
case that: ofFloat => Arrays.equals(unsafeArray, that.unsafeArray)
315318
case _ => super.equals(that)
@@ -322,7 +325,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
322325
def length: Int = unsafeArray.length
323326
@throws[ArrayIndexOutOfBoundsException]
324327
def apply(i: Int): Double = unsafeArray(i)
325-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
328+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
326329
override def equals(that: Any) = that match {
327330
case that: ofDouble => Arrays.equals(unsafeArray, that.unsafeArray)
328331
case _ => super.equals(that)
@@ -335,7 +338,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
335338
def length: Int = unsafeArray.length
336339
@throws[ArrayIndexOutOfBoundsException]
337340
def apply(i: Int): Boolean = unsafeArray(i)
338-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
341+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
339342
override def equals(that: Any) = that match {
340343
case that: ofBoolean => Arrays.equals(unsafeArray, that.unsafeArray)
341344
case _ => super.equals(that)
@@ -348,7 +351,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
348351
def length: Int = unsafeArray.length
349352
@throws[ArrayIndexOutOfBoundsException]
350353
def apply(i: Int): Unit = unsafeArray(i)
351-
override def hashCode = MurmurHash3.arrayHash(unsafeArray, MurmurHash3.seqSeed)
354+
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
352355
override def equals(that: Any) = that match {
353356
case that: ofUnit => unsafeArray.length == that.unsafeArray.length
354357
case _ => super.equals(that)

library/src/scala/collection/mutable/ArraySeq.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package mutable
33

44
import java.io.{ObjectInputStream, ObjectOutputStream}
55

6-
import scala.runtime.ScalaRunTime
6+
import scala.runtime.{BoxesRunTime, ScalaRunTime}
77
import scala.reflect.ClassTag
88
import scala.util.hashing.MurmurHash3
99
import java.util.Arrays
@@ -140,11 +140,14 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
140140
final class ofRef[T <: AnyRef](val array: Array[T]) extends ArraySeq[T] {
141141
lazy val elemTag = ClassTag[T](array.getClass.getComponentType)
142142
def length: Int = array.length
143-
def apply(index: Int): T = array(index).asInstanceOf[T]
143+
def apply(index: Int): T = array(index)
144144
def update(index: Int, elem: T): Unit = { array(index) = elem }
145145
override def hashCode = MurmurHash3.arraySeqHash(array)
146146
override def equals(that: Any) = that match {
147-
case that: ofRef[_] => Arrays.equals(array.asInstanceOf[Array[AnyRef]], that.array.asInstanceOf[Array[AnyRef]])
147+
case that: ofRef[_] =>
148+
BoxesRunTime.arraysEquals(
149+
this.array.asInstanceOf[Array[AnyRef]],
150+
that.array.asInstanceOf[Array[AnyRef]])
148151
case _ => super.equals(that)
149152
}
150153
}

library/src/scala/runtime/BoxesRunTime.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,20 @@ public static boolean equalsNumChar(java.lang.Number xn, java.lang.Character yc)
198198
}
199199
}
200200

201+
public static boolean arraysEquals(Object[] xs, Object[] ys) {
202+
if (xs == ys)
203+
return true;
204+
if (xs.length != ys.length)
205+
return false;
206+
207+
int len = xs.length;
208+
for (int i = 0; i < len; i++) {
209+
if (!equals(xs[i], ys[i]))
210+
return false;
211+
}
212+
return true;
213+
}
214+
201215
private static int unboxCharOrInt(Object arg1, int code) {
202216
if (code == CHAR)
203217
return ((java.lang.Character) arg1).charValue();

0 commit comments

Comments
 (0)