Skip to content

Commit d2bc81f

Browse files
committed
Optimize some operations on TupleXXL
1 parent 3ff85db commit d2bc81f

File tree

4 files changed

+18
-12
lines changed

4 files changed

+18
-12
lines changed

compiler/src/dotty/tools/dotc/Compiler.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class Compiler {
8787
new AugmentScala2Traits, // Augments Scala2 traits with additional members needed for mixin composition.
8888
new ResolveSuper, // Implement super accessors
8989
new FunctionXXLForwarders, // Add forwarders for FunctionXXL apply method
90-
new TuplesOptimizations, // Optimize generic operations on tuples
90+
new TupleOptimizations, // Optimize generic operations on tuples
9191
new ArrayConstructors) :: // Intercept creation of (non-generic) arrays and intrinsify.
9292
List(new Erasure) :: // Rewrite types to JVM model, erasing all type parameters, abstract types and refinements.
9393
List(new ElimErasedValueType, // Expand erased value types to their underlying implmementation types

compiler/src/dotty/tools/dotc/transform/TuplesOptimizations.scala renamed to compiler/src/dotty/tools/dotc/transform/TupleOptimizations.scala

+7-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import dotty.tools.dotc.ast.tpd
1818
import scala.annotation.tailrec
1919

2020
/** Optimize generic operations on tuples */
21-
class TuplesOptimizations extends MiniPhase with IdentityDenotTransformer {
21+
class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
2222
import tpd._
2323

2424
def phaseName: String = "genericTuples"
@@ -80,7 +80,7 @@ class TuplesOptimizations extends MiniPhase with IdentityDenotTransformer {
8080
val elements = (1 until size).map(i => tup.select(nme.selectorName(i))).toList
8181
knownTupleFromElements(tpes.tail, elements)
8282
}
83-
} else {
83+
} else if (size <= MaxTupleArity + 1) {
8484
// val it = this.asInstanceOf[Product].productIterator
8585
// it.next()
8686
// TupleN-1(it.next(), ..., it.next())
@@ -90,6 +90,9 @@ class TuplesOptimizations extends MiniPhase with IdentityDenotTransformer {
9090
knownTupleFromIterator(size - 1, it).asInstance(tree.tpe)
9191
)
9292
}
93+
} else {
94+
// tup.asInstanceOf[TupleXXL].tailXXL
95+
tup.asInstance(defn.TupleXXLType).select("tailXXL".toTermName)
9396
}
9497
case None =>
9598
// No optimization, keep:
@@ -183,8 +186,8 @@ class TuplesOptimizations extends MiniPhase with IdentityDenotTransformer {
183186
// DynamicTuple.productToArray(tup.asInstanceOf[Product])
184187
ref(defn.DynamicTuple_productToArray).appliedTo(tup.asInstance(defn.ProductType))
185188
} else {
186-
// tup.asInstanceOf[TupleXXL].elems
187-
tup.asInstance(defn.TupleXXLType).select(nme.elems)
189+
// tup.asInstanceOf[TupleXXL].elems.clone()
190+
tup.asInstance(defn.TupleXXLType).select(nme.toArray)
188191
}
189192
case None =>
190193
// No optimization, keep:

library/src-3.x/scala/runtime/DynamicTuple.scala

+3-7
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,9 @@ object DynamicTuple {
175175

176176

177177
def dynamicToArray(self: Tuple): Array[Object] = (self: Any) match {
178-
case self: Unit =>
179-
Array.emptyObjectArray
180-
case self: TupleXXL =>
181-
self.elems
182-
case self: Product =>
183-
productToArray(self)
178+
case self: Unit => Array.emptyObjectArray
179+
case self: TupleXXL => self.toArray
180+
case self: Product => productToArray(self)
184181
}
185182

186183
def productToArray(self: Product): Array[Object] = {
@@ -222,7 +219,6 @@ object DynamicTuple {
222219

223220
def dynamicSize[This <: Tuple](self: This): Size[This] = (self: Any) match {
224221
case self: Unit => 0.asInstanceOf[Size[This]]
225-
case self: TupleXXL => self.elems.length.asInstanceOf[Size[This]]
226222
case self: Product => self.productArity.asInstanceOf[Size[This]]
227223
}
228224

library/src/scala/TupleXXL.scala

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ final class TupleXXL private (es: Array[Object]) extends Product {
1919
case _ => false
2020
}
2121
def elems: Array[Object] = es
22+
23+
def tailXXL: TupleXXL = {
24+
assert(es.length > 23)
25+
new TupleXXL(es.tail)
26+
}
27+
28+
def toArray: Array[Object] = es.clone
2229
}
2330
object TupleXXL {
2431
def fromIterator(elems: Iterator[Any]) = new TupleXXL(elems.map(_.asInstanceOf[Object]).toArray)

0 commit comments

Comments
 (0)