8000 Avoid generic array instantation in hot paths · scala/scala@4155af0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4155af0

Browse files
committed
Avoid generic array instantation in hot paths
1 parent c3d3878 commit 4155af0

File tree

7 files changed

+26
-< 10000 !-- -->10
lines changed

7 files changed

+26
-10
lines changed

src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,9 +1349,20 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
13491349
lambdaTarget.name.toString,
13501350
methodBTypeFromSymbol(lambdaTarget).descriptor,
13511351
/* itf = */ isInterface)
1352-
val receiver = if (isStaticMethod) Nil else lambdaTarget.owner :: Nil
1353-
val (capturedParams, lambdaParams) = lambdaTarget.paramss.head.splitAt(lambdaTarget.paramss.head.length - arity)
1354-
val invokedType = asm.Type.getMethodDescriptor(asmType(functionalInterface), (receiver ::: capturedParams).map(sym => typeToBType(sym.info).toASMType): _*)
1352+
val numCapturedParams = lambdaTarget.paramss.head.length - arity
1353+
val (capturedParams, lambdaParams) = lambdaTarget.paramss.head.splitAt(numCapturedParams)
1354+
1355+
val invokedTypeArgs: Array[asm.Type] = if (isStaticMethod) {
1356+
val result = new Array[asm.Type](numCapturedParams)
1357+
capturedParams.iterator.map(sym => typeToBType(sym.info).toASMType).copyToArray(result)
1358+
result
1359+
} else {
1360+
val result = new Array[asm.Type](numCapturedParams)
1361+
result(0) = typeToBType(lambdaTarget.owner.info).toASMType
1362+
capturedParams.iterator.map(sym => typeToBType(sym.info).toASMType).copyToArray(result, 1)
1363+
result
1364+
}
1365+
val invokedType = asm.Type.getMethodDescriptor(asmType(functionalInterface), invokedTypeArgs: _*)
13551366
val constrainedType = new MethodBType(lambdaParams.map(p => typeToBType(p.tpe)), typeToBType(lambdaTarget.tpe.resultType)).toASMType
13561367
val samMethodType = methodBTypeFromSymbol(sam).toASMType
13571368
val markers = if (addScalaSerializableMarker) classBTypeFromSymbol(definitions.SerializableClass).toASMType :: Nil else Nil

src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
501501
currentRun.symData get sym match {
502502
case Some(pickle) if !nme.isModuleName(newTermName(jclassName)) =>
503503
val scalaAnnot = {
504-
val sigBytes = ScalaSigBytes(pickle.bytes.take(pickle.writeIndex))
504+
val sigBytes = ScalaSigBytes(java.util.Arrays.copyOf(pickle.bytes, pickle.writeIndex))
505505
AnnotationInfo(sigBytes.sigAnnot, Nil, (nme.bytes, sigBytes) :: Nil)
506506
}
507507
pickledBytes += pickle.writeIndex

src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,14 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
132132
val flags = javaFlags(claszSymbol)
133133

134134
val thisSignature = getGenericSignature(claszSymbol, claszSymbol.owner)
135+
val interfaceNamesArray = if (interfaceNames.isEmpty) EMPTY_STRING_ARRAY else {
136+
val result = new Array[String](interfaceNames.length)
137+
interfaceNames.copyToArray(result)
138+
result
139+
}
135140
cnode.visit(classfileVersion, flags,
136141
thisBType.internalName, thisSignature,
137-
superClass, interfaceNames.toArray)
142+
superClass, interfaceNamesArray)
138143

139144
if (emitSource) {
140145
cnode.visitSource(cunit.source.toString, null /* SourceDebugExtension */)

src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ abstract class Pickler extends SubComponent {
531531
writeNat(MinorVersion)
532532
writeNat(ep)
533533

534-
entries take ep foreach writeEntry
534+
entries.iterator.take(ep).foreach(writeEntry)
535535
}
536536

537537
override def toString = "" + rootName + " in " + rootOwner

src/compiler/scala/tools/nsc/transform/TypeAdaptingTransformer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ trait TypeAdaptingTransformer { self: TreeDSL =>
4646
case _ => tree.tpe.typeSymbol match {
4747
case UnitClass =>
4848
if (treeInfo isExprSafeToInline tree) REF(BoxedUnit_UNIT)
49-
else BLOCK(tree, REF(BoxedUnit_UNIT))
49+
else Block(tree :: Nil, REF(BoxedUnit_UNIT))
5050
case NothingClass => tree // a non-terminating expression doesn't need boxing
5151
case x =>
5252
assert(x != ArrayClass)

src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,8 @@ trait MatchOptimization extends MatchTreeMaking with MatchAnalysis {
534534
val scrutToInt: Tree =
535535
if (scrutSym.tpe =:= IntTpe) REF(scrutSym)
536536
else (REF(scrutSym) DOT (nme.toInt))
537-
Some(BLOCK(
538-
ValDef(scrutSym, scrut),
537+
Some(Block(
538+
ValDef(scrutSym, scrut) :: Nil,
539539
Match(scrutToInt, caseDefsWithDefault) // a switch
540540
))
541541
}

src/reflect/scala/reflect/internal/Symbols.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2745,7 +2745,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
27452745
def defStringSeenAs(info: Type) = defStringCompose(infoString(info))
27462746

27472747
/** Concatenate strings separated by spaces */
2748-
private def compose(ss: String*) = ss filter (_ != "") mkString " "
2748+
private def compose(ss: String*) = ss.iterator filter (_ != "") mkString " "
27492749

27502750
def isSingletonExistential =
27512751
nme.isSingletonName(name) && (info.bounds.hi.typeSymbol isSubClass SingletonClass)

0 commit comments

Comments
 (0)
0