Skip to content

Commit f24c260

Browse files
szeigeradriaanm
authored andcommitted
Handle WrappedArray the same way as ArrayOps for binary compatibility
We introduce a package-private superclass with the overridden implementations. This is public at the bytecode level, so it needs to be whitelisted.
1 parent 7e89663 commit f24c260

File tree

2 files changed

+67
-33
lines changed

2 files changed

+67
-33
lines changed

bincompat-forward.whitelist.conf

+44-12
Original file line numberDiff line numberDiff line change
@@ -769,18 +769,6 @@ filter {
769769
matchName="scala.collection.mutable.WrappedArray#ofShort.emptyImpl"
770770
problemName=DirectMissingMethodProblem
771771
},
772-
{
773-
matchName="scala.collection.mutable.WrappedArray.sliceImpl"
774-
problemName=DirectMissingMethodProblem
775-
},
776-
{
777-
matchName="scala.collection.mutable.WrappedArray.emptyImpl"
778-
problemName=DirectMissingMethodProblem
779-
},
780-
{
781-
matchName="scala.collection.mutable.WrappedArray.slice"
782-
problemName=IncompatibleResultTypeProblem
783-
},
784772
{
785773
matchName="scala.collection.mutable.WrappedArray#ofRef.sliceImpl"
786774
problemName=DirectMissingMethodProblem
@@ -893,6 +881,50 @@ filter {
893881
matchName="scala.collection.mutable.ArrayOps#ofBoolean.emptyImpl$extension"
894882
problemName=DirectMissingMethodProblem
895883
},
884+
{
885+
matchName="scala.collection.mutable.WrappedArray$ofByte"
886+
problemName=MissingTypesProblem
887+
},
888+
{
889+
matchName="scala.collection.mutable.WrappedArray$ofBoolean"
890+
problemName=MissingTypesProblem
891+
},
892+
{
893+
matchName="scala.collection.mutable.WrappedArray$ofChar"
894+
problemName=MissingTypesProblem
895+
},
896+
{
897+
matchName="scala.collection.mutable.WrappedArray$ofDouble"
898+
problemName=MissingTypesProblem
899+
},
900+
{
901+
matchName="scala.collection.mutable.WrappedArray$ofShort"
902+
problemName=MissingTypesProblem
903+
},
904+
{
905+
matchName="scala.collection.mutable.WrappedArray$ofRef"
906+
problemName=MissingTypesProblem
907+
},
908+
{
909+
matchName="scala.collection.mutable.WrappedArray$ofUnit"
910+
problemName=MissingTypesProblem
911+
},
912+
{
913+
matchName="scala.collection.mutable.WrappedArray$ofInt"
914+
problemName=MissingTypesProblem
915+
},
916+
{
917+
matchName="scala.collection.mutable.WrappedArrayImpl"
918+
problemName=MissingClassProblem
919+
},
920+
{
921+
matchName="scala.collection.mutable.WrappedArray$ofLong"
922+
problemName=MissingTypesProblem
923+
},
924+
{
925+
matchName="scala.collection.mutable.WrappedArray$ofFloat"
926+
problemName=MissingTypesProblem
927+
},
896928
{
897929
matchName="scala.collection.mutable.WrappedArray#ofFloat.sliceImpl"
898930
problemName=DirectMissingMethodProblem

src/library/scala/collection/mutable/WrappedArray.scala

+23-21
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,6 @@ extends AbstractSeq[T]
7272
else
7373
super.toArray[U]
7474
}
75-
override def slice(from: Int, until: Int): WrappedArray[T] = {
76-
val start = if (from < 0) 0 else from
77-
if (until <= start || start >= repr.length)
78-
return emptyImpl
79-
val end = if (until > length) length else until
80-
sliceImpl(start, end)
81-
}
82-
//retain existing functionallity for existing implementations outside this file
83-
protected def emptyImpl: WrappedArray[T] = newBuilder.result()
84-
//retain existing functionallity for existing implementations outside this file
85-
protected def sliceImpl(from: Int, until: Int): WrappedArray[T] = super.slice(from, until)
8675

8776
override def stringPrefix = "WrappedArray"
8877

@@ -93,7 +82,20 @@ extends AbstractSeq[T]
9382
*/
9483
override protected[this] def newBuilder: Builder[T, WrappedArray[T]] =
9584
new WrappedArrayBuilder[T](elemTag)
85+
}
86+
87+
private[mutable] abstract class WrappedArrayImpl[T] extends WrappedArray[T] {
88+
override def slice(from: Int, until: Int): WrappedArray[T] = {
89+
val start = if (from < 0) 0 else from
90+
if (until <= start || start >= repr.length)
91+
return emptyImpl
92+
val end = if (until > length) length else until
93+
sliceImpl(start, end)
94+
}
95+
96+
protected def emptyImpl: WrappedArray[T]
9697

98+
protected def sliceImpl(from: Int, until: Int): WrappedArray[T]
9799
}
98100

99101
/** A companion object used to create instances of `WrappedArray`.
@@ -143,7 +145,7 @@ object WrappedArray {
143145
private val emptyWrappedChar = new ofChar(new Array[Char](0))
144146
private val emptyWrappedBoolean = new ofBoolean(new Array[Boolean](0))
145147

146-
final class ofRef[T <: AnyRef](val array: Array[T]) extends WrappedArray[T] with Serializable {
148+
final class ofRef[T <: AnyRef](val array: Array[T]) extends WrappedArrayImpl[T] with Serializable {
147149
lazy val elemTag = ClassTag[T](arrayElementClass(array.getClass))
148150
def length: Int = array.length
149151
def apply(index: Int): T = array(index).asInstanceOf[T]
@@ -152,7 +154,7 @@ object WrappedArray {
152154
protected override def sliceImpl(from: Int, until: Int) = new ofRef[T](util.Arrays.copyOfRange[T](array, from, until))
153155
}
154156

155-
final class ofByte(val array: Array[Byte]) extends WrappedArray[Byte] with Serializable {
157+
final class ofByte(val array: Array[Byte]) extends WrappedArrayImpl[Byte] with Serializable {
156158
def elemTag = ClassTag.Byte
157159
def length: Int = array.length
158160
def apply(index: Int): Byte = array(index)
@@ -161,7 +163,7 @@ object WrappedArray {
161163
protected override def sliceImpl(from: Int, until: Int) = new ofByte(util.Arrays.copyOfRange(array, from, until))
162164
}
163165

164-
final class ofShort(val array: Array[Short]) extends WrappedArray[Short] with Serializable {
166+
final class ofShort(val array: Array[Short]) extends WrappedArrayImpl[Short] with Serializable {
165167
def elemTag = ClassTag.Short
166168
def length: Int = array.length
167169
def apply(index: Int): Short = array(index)
@@ -170,7 +172,7 @@ object WrappedArray {
170172
protected override def sliceImpl(from: Int, until: Int) = new ofShort(util.Arrays.copyOfRange(array, from, until))
171173
}
172174

173-
final class ofChar(val array: Array[Char]) extends WrappedArray[Char] with Serializable {
175+
final class ofChar(val array: Array[Char]) extends WrappedArrayImpl[Char] with Serializable {
174176
def elemTag = ClassTag.Char
175177
def length: Int = array.length
176178
def apply(index: Int): Char = array(index)
@@ -179,7 +181,7 @@ object WrappedArray {
179181
protected override def sliceImpl(from: Int, until: Int) = new ofChar(util.Arrays.copyOfRange(array, from, until))
180182
}
181183

182-
final class ofInt(val array: Array[Int]) extends WrappedArray[Int] with Serializable {
184+
final class ofInt(val array: Array[Int]) extends WrappedArrayImpl[Int] with Serializable {
183185
def elemTag = ClassTag.Int
184186
def length: Int = array.length
185187
def apply(index: Int): Int = array(index)
@@ -188,7 +190,7 @@ object WrappedArray {
188190
protected override def sliceImpl(from: Int, until: Int) = new ofInt(util.Arrays.copyOfRange(array, from, until))
189191
}
190192

191-
final class ofLong(val array: Array[Long]) extends WrappedArray[Long] with Serializable {
193+
final class ofLong(val array: Array[Long]) extends WrappedArrayImpl[Long] with Serializable {
192194
def elemTag = ClassTag.Long
193195
def length: Int = array.length
194196
def apply(index: Int): Long = array(index)
@@ -197,7 +199,7 @@ object WrappedArray {
197199
protected override def sliceImpl(from: Int, until: Int) = new ofLong(util.Arrays.copyOfRange(array, from, until))
198200
}
199201

200-
final class ofFloat(val array: Array[Float]) extends WrappedArray[Float] with Serializable {
202+
final class ofFloat(val array: Array[Float]) extends WrappedArrayImpl[Float] with Serializable {
201203
def elemTag = ClassTag.Float
202204
def length: Int = array.length
203205
def apply(index: Int): Float = array(index)
@@ -206,7 +208,7 @@ object WrappedArray {
206208
protected override def sliceImpl(from: Int, until: Int) = new ofFloat(util.Arrays.copyOfRange(array, from, until))
207209
}
208210

209-
final class ofDouble(val array: Array[Double]) extends WrappedArray[Double] with Serializable {
211+
final class ofDouble(val array: Array[Double]) extends WrappedArrayImpl[Double] with Serializable {
210212
def elemTag = ClassTag.Double
211213
def length: Int = array.length
212214
def apply(index: Int): Double = array(index)
@@ -215,7 +217,7 @@ object WrappedArray {
215217
protected override def sliceImpl(from: Int, until: Int) = new ofDouble(util.Arrays.copyOfRange(array, from, until))
216218
}
217219

218-
final class ofBoolean(val array: Array[Boolean]) extends WrappedArray[Boolean] with Serializable {
220+
final class ofBoolean(val array: Array[Boolean]) extends WrappedArrayImpl[Boolean] with Serializable {
219221
def elemTag = ClassTag.Boolean
220222
def length: Int = array.length
221223
def apply(index: Int): Boolean = array(index)
@@ -224,7 +226,7 @@ object WrappedArray {
224226
protected override def sliceImpl(from: Int, until: Int) = new ofBoolean(util.Arrays.copyOfRange(array, from, until))
225227
}
226228

227-
final class ofUnit(val array: Array[Unit]) extends WrappedArray[Unit] with Serializable {
229+
final class ofUnit(val array: Array[Unit]) extends WrappedArrayImpl[Unit] with Serializable {
228230
def elemTag = ClassTag.Unit
229231
def length: Int = array.length
230232
def apply(index: Int): Unit = array(index)

0 commit comments

Comments
 (0)