Skip to content

Commit 5c5d6a0

Browse files
committed
VarArgsBuilder specialized classes, adapt posttyper
Returning anonymous classes mean that virtual calls are always made, with specialised type the specialised method is immediately selected. fixes #24501
1 parent 0470ec1 commit 5c5d6a0

File tree

2 files changed

+63
-63
lines changed

2 files changed

+63
-63
lines changed

compiler/src/dotty/tools/dotc/transform/PostTyper.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -438,18 +438,18 @@ class PostTyper extends MacroTransform with InfoTransformer { thisPhase =>
438438
lengthCalls.foldLeft(singleElemCount): (acc, len) =>
439439
acc.select(defn.Int_+).appliedTo(len)
440440

441-
def makeBuilder(name: String) =
442-
ref(defn.VarArgsBuilderModule).select(name.toTermName)
441+
def builderType(name: String) =
442+
defn.VarArgsBuilderModule.termRef.select(name.toTypeName)
443443

444-
val builder =
444+
def builder(len: Tree) =
445445
if defn.ScalaValueClasses().contains(elemCls) then
446-
makeBuilder(s"of${elemCls.name}")
446+
tpd.New(builderType(s"of${elemCls.name}"), len :: Nil)
447447
else if elemCls.derivesFrom(defn.ObjectClass) then
448-
makeBuilder("ofRef").appliedToType(elemType)
448+
tpd.New(AppliedType(builderType("ofRef"), List(elemType)), len :: Nil)
449449
else
450-
makeBuilder("generic").appliedToType(elemType)
450+
tpd.New(AppliedType(builderType("generic"), List(elemType)), len :: Nil)
451451

452-
elems.foldLeft(builder.appliedTo(totalLength)): (bldr, elem) =>
452+
elems.foldLeft(builder(totalLength)): (bldr, elem) =>
453453
elem match
454454
case spread(arg) =>
455455
if arg.tpe.derivesFrom(defn.SeqClass) then

library/src/scala/runtime/VarArgsBuilder.scala

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,213 +11,213 @@ sealed abstract class VarArgsBuilder[T]:
1111

1212
object VarArgsBuilder:
1313

14-
def generic[T](n: Int): VarArgsBuilder[T] = new VarArgsBuilder[T]:
14+
class generic[T](n: Int) extends VarArgsBuilder[T]:
1515
private val xs = new Array[AnyRef](n)
16-
def result() = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
16+
override def result(): Seq[T] = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
1717
private var i = 0
18-
def add(elem: T): this.type =
18+
override def add(elem: T): this.type =
1919
xs(i) = elem.asInstanceOf[AnyRef]
2020
i += 1
2121
this
22-
def addSeq(elems: Seq[T]): this.type =
22+
override def addSeq(elems: Seq[T]): this.type =
2323
for elem <- elems do
2424
xs(i) = elem.asInstanceOf[AnyRef]
2525
i += 1
2626
this
27-
def addArray(elems: Array[T]): this.type =
27+
override def addArray(elems: Array[T]): this.type =
2828
for elem <- elems do
2929
xs(i) = elem.asInstanceOf[AnyRef]
3030
i += 1
3131
this
3232

33-
def ofRef[T <: AnyRef](n: Int): VarArgsBuilder[T] = new VarArgsBuilder[T]:
33+
class ofRef[T <: AnyRef](n: Int) extends VarArgsBuilder[T]:
3434
private val xs = new Array[AnyRef](n)
35-
def result() = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
35+
override def result(): Seq[T] = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
3636
private var i = 0
37-
def add(elem: T): this.type =
37+
override def add(elem: T): this.type =
3838
xs(i) = elem
3939
i += 1
4040
this
41-
def addSeq(elems: Seq[T]): this.type =
41+
override def addSeq(elems: Seq[T]): this.type =
4242
for elem <- elems do
4343
xs(i) = elem
4444
i += 1
4545
this
46-
def addArray(elems: Array[T]): this.type =
46+
override def addArray(elems: Array[T]): this.type =
4747
for elem <- elems do
4848
xs(i) = elem
4949
i += 1
5050
this
5151

52-
def ofByte(n: Int): VarArgsBuilder[Byte] = new VarArgsBuilder[Byte]:
52+
class ofByte(n: Int) extends VarArgsBuilder[Byte]:
5353
private val xs = new Array[Byte](n)
54-
def result() = ArraySeq.ofByte(xs)
54+
override def result(): Seq[Byte] = ArraySeq.ofByte(xs)
5555
private var i = 0
56-
def add(elem: Byte): this.type =
56+
override def add(elem: Byte): this.type =
5757
xs(i) = elem
5858
i += 1
5959
this
60-
def addSeq(elems: Seq[Byte]): this.type =
60+
override def addSeq(elems: Seq[Byte]): this.type =
6161
for elem <- elems do
6262
xs(i) = elem
6363
i += 1
6464
this
65-
def addArray(elems: Array[Byte]): this.type =
65+
override def addArray(elems: Array[Byte]): this.type =
6666
for elem <- elems do
6767
xs(i) = elem
6868
i += 1
6969
this
7070

71-
def ofShort(n: Int): VarArgsBuilder[Short] = new VarArgsBuilder[Short]:
71+
class ofShort(n: Int) extends VarArgsBuilder[Short]:
7272
private val xs = new Array[Short](n)
73-
def result() = ArraySeq.ofShort(xs)
73+
override def result(): Seq[Short] = ArraySeq.ofShort(xs)
7474
private var i = 0
75-
def add(elem: Short): this.type =
75+
override def add(elem: Short): this.type =
7676
xs(i) = elem
7777
i += 1
7878
this
79-
def addSeq(elems: Seq[Short]): this.type =
79+
override def addSeq(elems: Seq[Short]): this.type =
8080
for elem <- elems do
8181
xs(i) = elem
8282
i += 1
8383
this
84-
def addArray(elems: Array[Short]): this.type =
84+
override def addArray(elems: Array[Short]): this.type =
8585
for elem <- elems do
8686
xs(i) = elem
8787
i += 1
8888
this
8989

90-
def ofChar(n: Int): VarArgsBuilder[Char] = new VarArgsBuilder[Char]:
90+
class ofChar(n: Int) extends VarArgsBuilder[Char]:
9191
private val xs = new Array[Char](n)
92-
def result() = ArraySeq.ofChar(xs)
92+
override def result(): Seq[Char] = ArraySeq.ofChar(xs)
9393
private var i = 0
94-
def add(elem: Char): this.type =
94+
override def add(elem: Char): this.type =
9595
xs(i) = elem
9696
i += 1
9797
this
98-
def addSeq(elems: Seq[Char]): this.type =
98+
override def addSeq(elems: Seq[Char]): this.type =
9999
for elem <- elems do
100100
xs(i) = elem
101101
i += 1
102102
this
103-
def addArray(elems: Array[Char]): this.type =
103+
override def addArray(elems: Array[Char]): this.type =
104104
for elem <- elems do
105105
xs(i) = elem
106106
i += 1
107107
this
108108

109-
def ofInt(n: Int): VarArgsBuilder[Int] = new VarArgsBuilder[Int]:
109+
class ofInt(n: Int) extends VarArgsBuilder[Int]:
110110
private val xs = new Array[Int](n)
111-
def result() = ArraySeq.ofInt(xs)
111+
override def result(): Seq[Int] = ArraySeq.ofInt(xs)
112112
private var i = 0
113-
def add(elem: Int): this.type =
113+
override def add(elem: Int): this.type =
114114
xs(i) = elem
115115
i += 1
116116
this
117-
def addSeq(elems: Seq[Int]): this.type =
117+
override def addSeq(elems: Seq[Int]): this.type =
118118
for elem <- elems do
119119
xs(i) = elem
120120
i += 1
121121
this
122-
def addArray(elems: Array[Int]): this.type =
122+
override def addArray(elems: Array[Int]): this.type =
123123
for elem <- elems do
124124
xs(i) = elem
125125
i += 1
126126
this
127127

128-
def ofLong(n: Int): VarArgsBuilder[Long] = new VarArgsBuilder[Long]:
128+
class ofLong(n: Int) extends VarArgsBuilder[Long]:
129129
private val xs = new Array[Long](n)
130-
def result() = ArraySeq.ofLong(xs)
130+
override def result(): Seq[Long] = ArraySeq.ofLong(xs)
131131
private var i = 0
132-
def add(elem: Long): this.type =
132+
override def add(elem: Long): this.type =
133133
xs(i) = elem
134134
i += 1
135135
this
136-
def addSeq(elems: Seq[Long]): this.type =
136+
override def addSeq(elems: Seq[Long]): this.type =
137137
for elem <- elems do
138138
xs(i) = elem
139139
i += 1
140140
this
141-
def addArray(elems: Array[Long]): this.type =
141+
override def addArray(elems: Array[Long]): this.type =
142142
for elem <- elems do
143143
xs(i) = elem
144144
i += 1
145145
this
146146

147-
def ofFloat(n: Int): VarArgsBuilder[Float] = new VarArgsBuilder[Float]:
147+
class ofFloat(n: Int) extends VarArgsBuilder[Float]:
148148
private val xs = new Array[Float](n)
149-
def result() = ArraySeq.ofFloat(xs)
149+
override def result(): Seq[Float] = ArraySeq.ofFloat(xs)
150150
private var i = 0
151-
def add(elem: Float): this.type =
151+
override def add(elem: Float): this.type =
152152
xs(i) = elem
153153
i += 1
154154
this
155-
def addSeq(elems: Seq[Float]): this.type =
155+
override def addSeq(elems: Seq[Float]): this.type =
156156
for elem <- elems do
157157
xs(i) = elem
158158
i += 1
159159
this
160-
def addArray(elems: Array[Float]): this.type =
160+
override def addArray(elems: Array[Float]): this.type =
161161
for elem <- elems do
162162
xs(i) = elem
163163
i += 1
164164
this
165165

166-
def ofDouble(n: Int): VarArgsBuilder[Double] = new VarArgsBuilder[Double]:
166+
class ofDouble(n: Int) extends VarArgsBuilder[Double]:
167167
private val xs = new Array[Double](n)
168-
def result() = ArraySeq.ofDouble(xs)
168+
override def result(): Seq[Double] = ArraySeq.ofDouble(xs)
169169
private var i = 0
170-
def add(elem: Double): this.type =
170+
override def add(elem: Double): this.type =
171171
xs(i) = elem
172172
i += 1
173173
this
174-
def addSeq(elems: Seq[Double]): this.type =
174+
override def addSeq(elems: Seq[Double]): this.type =
175175
for elem <- elems do
176176
xs(i) = elem
177177
i += 1
178178
this
179-
def addArray(elems: Array[Double]): this.type =
179+
override def addArray(elems: Array[Double]): this.type =
180180
for elem <- elems do
181181
xs(i) = elem
182182
i += 1
183183
this
184184

185-
def ofBoolean(n: Int): VarArgsBuilder[Boolean] = new VarArgsBuilder[Boolean]:
185+
class ofBoolean(n: Int) extends VarArgsBuilder[Boolean]:
186186
private val xs = new Array[Boolean](n)
187-
def result() = ArraySeq.ofBoolean(xs)
187+
override def result(): Seq[Boolean] = ArraySeq.ofBoolean(xs)
188188
private var i = 0
189-
def add(elem: Boolean): this.type =
189+
override def add(elem: Boolean): this.type =
190190
xs(i) = elem
191191
i += 1
192192
this
193-
def addSeq(elems: Seq[Boolean]): this.type =
193+
override def addSeq(elems: Seq[Boolean]): this.type =
194194
for elem <- elems do
195195
xs(i) = elem
196196
i += 1
197197
this
198-
def addArray(elems: Array[Boolean]): this.type =
198+
override def addArray(elems: Array[Boolean]): this.type =
199199
for elem <- elems do
200200
xs(i) = elem
201201
i += 1
202202
this
203203

204-
def ofUnit(n: Int): VarArgsBuilder[Unit] = new VarArgsBuilder[Unit]:
204+
class ofUnit(n: Int) extends VarArgsBuilder[Unit]:
205205
private val xs = new Array[Unit](n)
206-
def result() = ArraySeq.ofUnit(xs)
206+
override def result(): Seq[Unit] = ArraySeq.ofUnit(xs)
207207
private var i = 0
208-
def add(elem: Unit): this.type =
208+
override def add(elem: Unit): this.type =
209209
xs(i) = elem
210210
i += 1
211211
this
212-
def addSeq(elems: Seq[Unit]): this.type =
212+
override def addSeq(elems: Seq[Unit]): this.type =
213213
for elem <- elems do
214214
xs(i) = elem
215215
i += 1
216216
this
217-
def addArray(elems: Array[Unit]): this.type =
217+
override def addArray(elems: Array[Unit]): this.type =
218218
for elem <- elems do
219219
xs(i) = elem
220220
i += 1
221221
this
222222

223-
end VarArgsBuilder
223+
end VarArgsBuilder

0 commit comments

Comments
 (0)