Skip to content

Commit 880d304

Browse files
committed
Avoid some expensive collection operations in backend
1 parent af1b4a0 commit 880d304

File tree

6 files changed

+46
-43
lines changed

6 files changed

+46
-43
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,9 +1021,15 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
10211021
}
10221022
}
10231023

1024-
def genLoadArguments(args: List[Tree], btpes: List[BType]): Unit = {
1025-
(args zip btpes) foreach { case (arg, btpe) => genLoad(arg, btpe) }
1026-
}
1024+
def genLoadArguments(args: List[Tree], btpes: List[BType]): Unit =
1025+
args match
1026+
case arg :: args1 =>
1027+
btpes match
1028+
case btpe :: btpes1 =>
1029+
genLoad(arg, btpe)
1030+
genLoadArguments(args1, btpes1)
1031+
case _ =>
1032+
case _ =>
10271033

10281034
def genLoadModule(tree: Tree): BType = {
10291035
val module = (

compiler/src/dotty/tools/backend/jvm/BCodeIdiomatic.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ trait BCodeIdiomatic {
3535
lazy val majorVersion: Int = (classfileVersion & 0xFF)
3636
lazy val emitStackMapFrame = (majorVersion >= 50)
3737

38-
val extraProc: Int = GenBCodeOps.mkFlags(
39-
asm.ClassWriter.COMPUTE_MAXS,
40-
if (emitStackMapFrame) asm.ClassWriter.COMPUTE_FRAMES else 0
41-
)
38+
val extraProc: Int =
39+
import GenBCodeOps.addFlagIf
40+
asm.ClassWriter.COMPUTE_MAXS
41+
.addFlagIf(emitStackMapFrame, asm.ClassWriter.COMPUTE_FRAMES)
4242

4343
lazy val JavaStringBuilderClassName = jlStringBuilderRef.internalName
4444

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -690,12 +690,12 @@ trait BCodeSkelBuilder extends BCodeHelpers {
690690

691691
val isNative = methSymbol.hasAnnotation(NativeAttr)
692692
val isAbstractMethod = (methSymbol.is(Deferred) || (methSymbol.owner.isInterface && ((methSymbol.is(Deferred)) || methSymbol.isClassConstructor)))
693-
val flags = GenBCodeOps.mkFlags(
694-
javaFlags(methSymbol),
695-
if (isAbstractMethod) asm.Opcodes.ACC_ABSTRACT else 0,
696-
if (false /*methSymbol.isStrictFP*/) asm.Opcodes.ACC_STRICT else 0,
697-
if (isNative) asm.Opcodes.ACC_NATIVE else 0 // native methods of objects are generated in mirror classes
698-
)
693+
val flags =
694+
import GenBCodeOps.addFlagIf
695+
javaFlags(methSymbol)
696+
.addFlagIf(isAbstractMethod, asm.Opcodes.ACC_ABSTRACT)
697+
.addFlagIf(false /*methSymbol.isStrictFP*/, asm.Opcodes.ACC_STRICT)
698+
.addFlagIf(isNative, asm.Opcodes.ACC_NATIVE) // native methods of objects are generated in mirror classes
699699

700700
// TODO needed? for(ann <- m.symbol.annotations) { ann.symbol.initialize }
701701
initJMethod(flags, params.map(p => p.symbol.annotations))

compiler/src/dotty/tools/backend/jvm/BTypes.scala

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -649,14 +649,13 @@ abstract class BTypes {
649649

650650
def innerClassAttributeEntry: Option[InnerClassEntry] = info.nestedInfo map {
651651
case NestedInfo(_, outerName, innerName, isStaticNestedClass) =>
652+
import GenBCodeOps.addFlagIf
652653
InnerClassEntry(
653654
internalName,
654655
outerName.orNull,
655656
innerName.orNull,
656-
GenBCodeOps.mkFlags(
657-
info.flags,
658-
if (isStaticNestedClass) asm.Opcodes.ACC_STATIC else 0
659-
) & ClassBType.INNER_CLASSES_FLAGS
657+
info.flags.addFlagIf(isStaticNestedClass, asm.Opcodes.ACC_STATIC)
658+
& ClassBType.INNER_CLASSES_FLAGS
660659
)
661660
}
662661

compiler/src/dotty/tools/backend/jvm/BTypesFromSymbols.scala

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -304,39 +304,36 @@ class BTypesFromSymbols[I <: DottyBackendInterface](val int: I) extends BTypes {
304304
val finalFlag = sym.is(Final) && !toDenot(sym).isClassConstructor && !sym.is(Mutable) && !sym.enclosingClass.is(Trait)
305305

306306
import asm.Opcodes._
307-
GenBCodeOps.mkFlags(
308-
if (privateFlag) ACC_PRIVATE else ACC_PUBLIC,
309-
if (sym.is(Deferred) || sym.isOneOf(AbstractOrTrait)) ACC_ABSTRACT else 0,
310-
if (sym.isInterface) ACC_INTERFACE else 0,
311-
312-
if (finalFlag &&
307+
import GenBCodeOps.addFlagIf
308+
0 .addFlagIf(privateFlag, ACC_PRIVATE)
309+
.addFlagIf(!privateFlag, ACC_PUBLIC)
310+
.addFlagIf(sym.is(Deferred) || sym.isOneOf(AbstractOrTrait), ACC_ABSTRACT)
311+
.addFlagIf(sym.isInterface, ACC_INTERFACE)
312+
.addFlagIf(finalFlag
313313
// Primitives are "abstract final" to prohibit instantiation
314314
// without having to provide any implementations, but that is an
315315
// illegal combination of modifiers at the bytecode level so
316316
// suppress final if abstract if present.
317-
!sym.isOneOf(AbstractOrTrait) &&
317+
&& !sym.isOneOf(AbstractOrTrait)
318318
// Mixin forwarders are bridges and can be final, but final bridges confuse some frameworks
319-
!sym.is(Bridge))
320-
ACC_FINAL else 0,
321-
322-
if (sym.isStaticMember) ACC_STATIC else 0,
323-
if (sym.is(Bridge)) ACC_BRIDGE | ACC_SYNTHETIC else 0,
324-
if (sym.is(Artifact)) ACC_SYNTHETIC else 0,
325-
if (sym.isClass && !sym.isInterface) ACC_SUPER else 0,
326-
if (sym.isAllOf(JavaEnumTrait)) ACC_ENUM else 0,
327-
if (sym.is(JavaVarargs)) ACC_VARARGS else 0,
328-
if (sym.is(Synchronized)) ACC_SYNCHRONIZED else 0,
329-
if (sym.isDeprecated) ACC_DEPRECATED else 0,
330-
if (sym.is(Enum)) ACC_ENUM else 0
331-
)
319+
&& !sym.is(Bridge), ACC_FINAL)
320+
.addFlagIf(sym.isStaticMember, ACC_STATIC)
321+
.addFlagIf(sym.is(Bridge), ACC_BRIDGE | ACC_SYNTHETIC)
322+
.addFlagIf(sym.is(Artifact), ACC_SYNTHETIC)
323+
.addFlagIf(sym.isClass && !sym.isInterface, ACC_SUPER)
324+
.addFlagIf(sym.isAllOf(JavaEnumTrait), ACC_ENUM)
325+
.addFlagIf(sym.is(JavaVarargs), ACC_VARARGS)
326+
.addFlagIf(sym.is(Synchronized), ACC_SYNCHRONIZED)
327+
.addFlagIf(sym.isDeprecated, ACC_DEPRECATED)
328+
.addFlagIf(sym.is(Enum), ACC_ENUM)
332329
}
333330

334331
def javaFieldFlags(sym: Symbol) = {
335332
import asm.Opcodes._
336-
javaFlags(sym) | GenBCodeOps.mkFlags(
337-
if (sym.hasAnnotation(TransientAttr)) ACC_TRANSIENT else 0,
338-
if (sym.hasAnnotation(VolatileAttr)) ACC_VOLATILE else 0,
339-
if (sym.is(Mutable)) 0 else ACC_FINAL
340-
)
333+
import GenBCodeOps.addFlagIf
334+
javaFlags(sym)
335+
.addFlagIf(sym.hasAnnotation(TransientAttr), ACC_TRANSIENT)
336+
.addFlagIf(sym.hasAnnotation(VolatileAttr), ACC_VOLATILE)
337+
.addFlagIf(!sym.is(Mutable), ACC_FINAL)
341338
}
342339
}

compiler/src/dotty/tools/backend/jvm/GenBCodeOps.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import scala.tools.asm
77
object GenBCodeOps extends GenBCodeOps
88

99
class GenBCodeOps {
10-
def mkFlags(args: Int*) = args.foldLeft(0)(_ | _)
10+
extension (flags: Int)
11+
def addFlagIf(cond: Boolean, flag: Int): Int = if cond then flags | flag else flags
1112

1213
final val PublicStatic = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC
1314
final val PublicStaticFinal = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_FINAL

0 commit comments

Comments
 (0)