Skip to content

Commit 18fe0c8

Browse files
author
Antoine Brunner
committed
Try to reduce function bodies so that the JIT compiler optimizes them better
1 parent fe4eaa4 commit 18fe0c8

File tree

1 file changed

+138
-39
lines changed

1 file changed

+138
-39
lines changed

library/src/scala/runtime/DynamicTuple.scala

Lines changed: 138 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,28 @@ object DynamicTuple {
1414
}
1515
}
1616

17+
def dynamicToArray(self: Tuple): Array[Object] = (self: Any) match {
18+
case self: Unit => Array.emptyObjectArray
19+
case self: TupleXXL => self.toArray
20+
case self: Product => productToArray(self)
21+
}
22+
23+
def dynamicToIArray(self: Tuple): IArray[Object] = (self: Any) match {
24+
case self: Unit => Array.emptyObjectArray.asInstanceOf[IArray[Object]] // TODO use IArray.emptyObjectIArray
25+
case self: TupleXXL => self.elems
26+
case self: Product => productToArray(self).asInstanceOf[IArray[Object]]
27+
}
28+
29+
def productToArray(self: Product): Array[Object] = {
30+
val arr = new Array[Object](self.productArity)
31+
var i = 0
32+
while (i < arr.length) {
33+
arr(i) = self.productElement(i).asInstanceOf[Object]
34+
i += 1
35+
}
36+
arr
37+
}
38+
1739
def dynamicFromArray[T <: Tuple](xs: Array[Object]): T = xs.length match {
1840
case 0 => ().asInstanceOf[T]
1941
case 1 => Tuple1(xs(0)).asInstanceOf[T]
@@ -163,45 +185,79 @@ object DynamicTuple {
163185
}
164186
}).asInstanceOf[T]
165187

166-
167-
def dynamicToArray(self: Tuple): Array[Object] = (self: Any) match {
168-
case self: Unit => Array.emptyObjectArray
169-
case self: TupleXXL => self.toArray
170-
case self: Product => productToArray(self)
171-
}
172-
173-
def dynamicToIArray(self: Tuple): IArray[Object] = (self: Any) match {
174-
case self: Unit => Array.emptyObjectArray.asInstanceOf[IArray[Object]] // TODO use IArray.emptyObjectIArray
175-
case self: TupleXXL => self.elems
176-
case self: Product => productToArray(self).asInstanceOf[IArray[Object]]
177-
}
178-
179-
def productToArray(self: Product): Array[Object] = {
180-
val arr = new Array[Object](self.productArity)
181-
var i = 0
182-
while (i < arr.length) {
183-
arr(i) = self.productElement(i).asInstanceOf[Object]
184-
i += 1
188+
def specialCaseCons[H, This <: Tuple](x: H, self: This): H *: This = {
189+
type Result = H *: This
190+
val res = (self: Any) match {
191+
case () =>
192+
Tuple1(x)
193+
case self: Tuple1[_] =>
194+
Tuple2(x, self._1)
195+
case self: Tuple2[_, _] =>
196+
Tuple3(x, self._1, self._2)
197+
case self: Tuple3[_, _, _] =>
198+
Tuple4(x, self._1, self._2, self._3)
199+
case self: Tuple4[_, _, _, _] =>
200+
Tuple5(x, self._1, self._2, self._3, self._4)
201+
case self: Tuple5[_, _, _, _, _] =>
202+
Tuple6(x, self._1, self._2, self._3, self._4, self._5)
203+
case self: Tuple6[_, _, _, _, _, _] =>
204+
Tuple7(x, self._1, self._2, self._3, self._4, self._5, self._6)
205+
case self: Tuple7[_, _, _, _, _, _, _] =>
206+
Tuple8(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7)
207+
case self: Tuple8[_, _, _, _, _, _, _, _] =>
208+
Tuple9(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8)
209+
case self: Tuple9[_, _, _, _, _, _, _, _, _] =>
210+
Tuple10(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9)
211+
case self: Tuple10[_, _, _, _, _, _, _, _, _, _] =>
212+
Tuple11(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10)
213+
case self: Tuple11[_, _, _, _, _, _, _, _, _, _, _] =>
214+
Tuple12(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11)
215+
case self: Tuple12[_, _, _, _, _, _, _, _, _, _, _, _] =>
216+
Tuple13(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12)
217+
case self: Tuple13[_, _, _, _, _, _, _, _, _, _, _, _, _] =>
218+
Tuple14(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13)
219+
case self: Tuple14[_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
220+
Tuple15(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14)
221+
case self: Tuple15[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
222+
Tuple16(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15)
223+
case self: Tuple16[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
224+
Tuple17(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16)
225+
case self: Tuple17[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
226+
Tuple18(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17)
227+
case self: Tuple18[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
228+
Tuple19(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18)
229+
case self: Tuple19[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
230+
Tuple20(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19)
231+
case self: Tuple20[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
232+
Tuple21(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20)
233+
case self: Tuple21[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
234+
Tuple22(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21)
235+
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
236+
val arr: Array[Object] = Array(
237+
x.asInstanceOf[Object], self._1.asInstanceOf[Object], self._2.asInstanceOf[Object],
238+
self._3.asInstanceOf[Object], self._4.asInstanceOf[Object], self._5.asInstanceOf[Object],
239+
self._6.asInstanceOf[Object], self._7.asInstanceOf[Object], self._8.asInstanceOf[Object],
240+
self._9.asInstanceOf[Object], self._10.asInstanceOf[Object], self._11.asInstanceOf[Object],
241+
self._12.asInstanceOf[Object], self._13.asInstanceOf[Object], self._14.asInstanceOf[Object],
242+
self._15.asInstanceOf[Object], self._16.asInstanceOf[Object], self._17.asInstanceOf[Object],
243+
self._18.asInstanceOf[Object], self._19.asInstanceOf[Object], self._20.asInstanceOf[Object],
244+
self._21.asInstanceOf[Object], self._22.asInstanceOf[Object],
245+
)
246+
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]])
185247
}
186-
arr
248+
res.asInstanceOf[Result]
187249
}
188250

189251
def dynamicCons[H, This <: Tuple](x: H, self: This): H *: This = {
190252
type Result = H *: This
191-
val res = (self: Any) match {
253+
(self: Any) match {
192254
case xxl: TupleXXL =>
193255
val arr = new Array[Object](xxl.productArity + 1)
194256
System.arraycopy(xxl.elems, 0, arr, 1, xxl.productArity)
195257
arr(0) = x.asInstanceOf[Object]
196-
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]])
197-
case () =>
198-
Tuple1(x)
199-
case _ =>
200-
val arr = new Array[Object](self.size + 1)
201-
itToArray(self.asInstanceOf[Product].productIterator, self.size, arr, 1)
202-
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]])
258+
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]]).asInstanceOf[Result]
259+
case _ => specialCaseCons(x, self)
203260
}
204-
res.asInstanceOf[Result]
205261
}
206262

207263
def dynamicConcat[This <: Tuple, That <: Tuple](self: This, that: That): Concat[This, That] = {
@@ -240,11 +296,60 @@ object DynamicTuple {
240296
case self: Product => self.productArity.asInstanceOf[Size[This]]
241297
}
242298

243-
def dynamicTail[This <: NonEmptyTuple] (self: This): Tail[This] = {
299+
def specialCaseTail[This <: NonEmptyTuple] (self: This): Tail[This] = {
244300
type Result = Tail[This]
245301
val res = (self: Any) match {
246302
case self: Tuple1[_] =>
247303
()
304+
case self: Tuple2[_, _] =>
305+
Tuple1(self._2)
306+
case self: Tuple3[_, _, _] =>
307+
Tuple2(self._2, self._3)
308+
case self: Tuple4[_, _, _, _] =>
309+
Tuple3(self._2, self._3, self._4)
310+
case self: Tuple5[_, _, _, _, _] =>
311+
Tuple4(self._2, self._3, self._4, self._5)
312+
case self: Tuple6[_, _, _, _, _, _] =>
313+
Tuple5(self._2, self._3, self._4, self._5, self._6)
314+
case self: Tuple7[_, _, _, _, _, _, _] =>
315+
Tuple6(self._2, self._3, self._4, self._5, self._6, self._7)
316+
case self: Tuple8[_, _, _, _, _, _, _, _] =>
317+
Tuple7(self._2, self._3, self._4, self._5, self._6, self._7, self._8)
318+
case self: Tuple9[_, _, _, _, _, _, _, _, _] =>
319+
Tuple8(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9)
320+
case self: Tuple10[_, _, _, _, _, _, _, _, _, _] =>
321+
Tuple9(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10)
322+
case self: Tuple11[_, _, _, _, _, _, _, _, _, _, _] =>
323+
Tuple10(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11)
324+
case self: Tuple12[_, _, _, _, _, _, _, _, _, _, _, _] =>
325+
Tuple11(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12)
326+
case self: Tuple13[_, _, _, _, _, _, _, _, _, _, _, _, _] =>
327+
Tuple12(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13)
328+
case self: Tuple14[_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
329+
Tuple13(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14)
330+
case self: Tuple15[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
331+
Tuple14(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15)
332+
case self: Tuple16[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
333+
Tuple15(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16)
334+
case self: Tuple17[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
335+
Tuple16(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17)
336+
case self: Tuple18[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
337+
Tuple17(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18)
338+
case self: Tuple19[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
339+
Tuple18(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19)
340+
case self: Tuple20[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
341+
Tuple19(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20)
342+
case self: Tuple21[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
343+
Tuple20(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21)
344+
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
345+
Tuple21(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21, self._22)
346+
}
347+
res.asInstanceOf[Result]
348+
}
349+
350+
def dynamicTail[This <: NonEmptyTuple] (self: This): Tail[This] = {
351+
type Result = Tail[This]
352+
(self: Any) match {
248353
case xxl: TupleXXL =>
249354
if (xxl.productArity == 23) {
250355
val elems = xxl.elems
@@ -253,20 +358,14 @@ object DynamicTuple {
253358
elems(8), elems(9), elems(10), elems(11), elems(12), elems(13), elems(14),
254359
elems(15), elems(16), elems(17), elems(18), elems(19), elems(20),
255360
elems(21), elems(22)
256-
)
361+
).asInstanceOf[Result]
257362
} else {
258363
val arr = new Array[Object](self.size - 1)
259364
System.arraycopy(xxl.elems, 1, arr, 0, self.size - 1)
260-
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]])
365+
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]]).asInstanceOf[Result]
261366
}
262-
case _ =>
263-
val arr = new Array[Object](self.size - 1)
264-
val it = self.asInstanceOf[Product].productIterator
265-
it.next()
266-
itToArray(it, self.size - 1, arr, 0)
267-
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]])
367+
case _ => specialCaseTail(self)
268368
}
269-
res.asInstanceOf[Result]
270369
}
271370

272371
def dynamicApply[This <: NonEmptyTuple, N <: Int] (self: This, n: Int): Elem[This, N] = {

0 commit comments

Comments
 (0)