Skip to content

Commit 202e0d2

Browse files
authored
Backport "Make sure synthetic apply methods are generated in deterministic order" to LTS (#19118)
Backports #18210 to the LTS branch. PR submitted by the release tooling. [skip ci]
2 parents 6bc5803 + 30800ab commit 202e0d2

File tree

3 files changed

+90
-22
lines changed

3 files changed

+90
-22
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,27 +1741,27 @@ class Definitions {
17411741
@tu lazy val Tuple2SpecializedParamClasses: PerRun[Set[Symbol]] = new PerRun(Tuple2SpecializedParamTypes.map(_.symbol))
17421742

17431743
// Specialized type parameters defined for scala.Function{0,1,2}.
1744-
@tu lazy val Function1SpecializedParamTypes: collection.Set[TypeRef] =
1745-
Set(IntType, LongType, FloatType, DoubleType)
1746-
@tu lazy val Function2SpecializedParamTypes: collection.Set[TypeRef] =
1747-
Set(IntType, LongType, DoubleType)
1748-
@tu lazy val Function0SpecializedReturnTypes: collection.Set[TypeRef] =
1749-
ScalaNumericValueTypeList.toSet + UnitType + BooleanType
1750-
@tu lazy val Function1SpecializedReturnTypes: collection.Set[TypeRef] =
1751-
Set(UnitType, BooleanType, IntType, FloatType, LongType, DoubleType)
1752-
@tu lazy val Function2SpecializedReturnTypes: collection.Set[TypeRef] =
1744+
@tu lazy val Function1SpecializedParamTypes: List[TypeRef] =
1745+
List(IntType, LongType, FloatType, DoubleType)
1746+
@tu lazy val Function2SpecializedParamTypes: List[TypeRef] =
1747+
List(IntType, LongType, DoubleType)
1748+
@tu lazy val Function0SpecializedReturnTypes: List[TypeRef] =
1749+
ScalaNumericValueTypeList :+ UnitType :+ BooleanType
1750+
@tu lazy val Function1SpecializedReturnTypes: List[TypeRef] =
1751+
List(UnitType, BooleanType, IntType, FloatType, LongType, DoubleType)
1752+
@tu lazy val Function2SpecializedReturnTypes: List[TypeRef] =
17531753
Function1SpecializedReturnTypes
17541754

17551755
@tu lazy val Function1SpecializedParamClasses: PerRun[collection.Set[Symbol]] =
1756-
new PerRun(Function1SpecializedParamTypes.map(_.symbol))
1756+
new PerRun(Function1SpecializedParamTypes.toSet.map(_.symbol))
17571757
@tu lazy val Function2SpecializedParamClasses: PerRun[collection.Set[Symbol]] =
1758-
new PerRun(Function2SpecializedParamTypes.map(_.symbol))
1758+
new PerRun(Function2SpecializedParamTypes.toSet.map(_.symbol))
17591759
@tu lazy val Function0SpecializedReturnClasses: PerRun[collection.Set[Symbol]] =
1760-
new PerRun(Function0SpecializedReturnTypes.map(_.symbol))
1760+
new PerRun(Function0SpecializedReturnTypes.toSet.map(_.symbol))
17611761
@tu lazy val Function1SpecializedReturnClasses: PerRun[collection.Set[Symbol]] =
1762-
new PerRun(Function1SpecializedReturnTypes.map(_.symbol))
1762+
new PerRun(Function1SpecializedReturnTypes.toSet.map(_.symbol))
17631763
@tu lazy val Function2SpecializedReturnClasses: PerRun[collection.Set[Symbol]] =
1764-
new PerRun(Function2SpecializedReturnTypes.map(_.symbol))
1764+
new PerRun(Function2SpecializedReturnTypes.toSet.map(_.symbol))
17651765

17661766
def isSpecializableTuple(base: Symbol, args: List[Type])(using Context): Boolean =
17671767
args.length <= 2 && base.isClass && TupleSpecializedClasses.exists(base.asClass.derivesFrom) && args.match
@@ -1791,18 +1791,18 @@ class Definitions {
17911791
false
17921792
})
17931793

1794-
@tu lazy val Function0SpecializedApplyNames: collection.Set[TermName] =
1794+
@tu lazy val Function0SpecializedApplyNames: List[TermName] =
17951795
for r <- Function0SpecializedReturnTypes
17961796
yield nme.apply.specializedFunction(r, Nil).asTermName
17971797

1798-
@tu lazy val Function1SpecializedApplyNames: collection.Set[TermName] =
1798+
@tu lazy val Function1SpecializedApplyNames: List[TermName] =
17991799
for
18001800
r <- Function1SpecializedReturnTypes
18011801
t1 <- Function1SpecializedParamTypes
18021802
yield
18031803
nme.apply.specializedFunction(r, List(t1)).asTermName
18041804

1805-
@tu lazy val Function2SpecializedApplyNames: collection.Set[TermName] =
1805+
@tu lazy val Function2SpecializedApplyNames: List[TermName] =
18061806
for
18071807
r <- Function2SpecializedReturnTypes
18081808
t1 <- Function2SpecializedParamTypes
@@ -1811,7 +1811,7 @@ class Definitions {
18111811
nme.apply.specializedFunction(r, List(t1, t2)).asTermName
18121812

18131813
@tu lazy val FunctionSpecializedApplyNames: collection.Set[Name] =
1814-
Function0SpecializedApplyNames ++ Function1SpecializedApplyNames ++ Function2SpecializedApplyNames
1814+
Set.concat(Function0SpecializedApplyNames, Function1SpecializedApplyNames, Function2SpecializedApplyNames)
18151815

18161816
def functionArity(tp: Type)(using Context): Int = tp.functionArgInfos.length - 1
18171817

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class SpecializeApplyMethods extends MiniPhase with InfoTransformer {
9090
override def transformTemplate(tree: Template)(using Context) = {
9191
val cls = tree.symbol.owner.asClass
9292

93-
def synthesizeApply(names: collection.Set[TermName]): Tree = {
93+
def synthesizeApply(names: List[TermName]): Tree = {
9494
val applyBuf = new mutable.ListBuffer[DefDef]
9595
names.foreach { name =>
9696
val applySym = cls.info.decls.lookup(name)

compiler/test/dotty/tools/dotc/transform/SpecializeFunctionsTests.scala

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ class SpecializeFunctionsTests extends DottyBytecodeTest {
3636
)
3737
assert(applys.contains("apply"), "Foo did not contain `apply` forwarder method")
3838
assert(applys.contains("apply$mcII$sp"), "Foo did not contain specialized apply")
39+
40+
// It's not essential they are in this particular order,
41+
// but they should be in deterministic order
42+
assert(applys == List("apply", "apply$mcII$sp", "apply"))
3943
}
4044
}
4145

@@ -48,20 +52,84 @@ class SpecializeFunctionsTests extends DottyBytecodeTest {
4852
checkBCode(source) { dir =>
4953
val apps =
5054
findClass("Func2", dir).methods.asScala.collect {
55+
case m if m.name == "apply" => m
5156
case m if m.name == "apply$mcIII$sp" =>
52-
assert(!hasInvokeStatic(m)) // should not call super specialized method
57+
assert(!hasInvokeStatic(m), s"${m.name} should not call super specialized method")
5358
m
54-
case m if m.name == "apply" => m
59+
case m if m.name.startsWith("apply") => m
5560
}
5661
.map(_.name)
5762
.toList
5863

5964
assert(
60-
apps.length == 3,
65+
apps.length == 56,
6166
s"Wrong number of specialized applys, actual length: ${apps.length} - $apps"
6267
)
6368
assert(apps.contains("apply"), "Func2 did not contain `apply` forwarder method")
6469
assert(apps.contains("apply$mcIII$sp"), "Func2 did not contain specialized apply")
70+
71+
// It's not essential they are in this particular order,
72+
// but they should be in some deterministic order:
73+
assert(
74+
apps == List(
75+
"apply$mcVII$sp",
76+
"apply$mcVIJ$sp",
77+
"apply$mcVID$sp",
78+
"apply$mcVJI$sp",
79+
"apply$mcVJJ$sp",
80+
"apply$mcVJD$sp",
81+
"apply$mcVDI$sp",
82+
"apply$mcVDJ$sp",
83+
"apply$mcVDD$sp",
84+
"apply$mcZII$sp",
85+
"apply$mcZIJ$sp",
86+
"apply$mcZID$sp",
87+
"apply$mcZJI$sp",
88+
"apply$mcZJJ$sp",
89+
"apply$mcZJD$sp",
90+
"apply$mcZDI$sp",
91+
"apply$mcZDJ$sp",
92+
"apply$mcZDD$sp",
93+
"apply$mcIIJ$sp",
94+
"apply$mcIID$sp",
95+
"apply$mcIJI$sp",
96+
"apply$mcIJJ$sp",
97+
"apply$mcIJD$sp",
98+
"apply$mcIDI$sp",
99+
"apply$mcIDJ$sp",
100+
"apply$mcIDD$sp",
101+
"apply$mcFII$sp",
102+
"apply$mcFIJ$sp",
103+
"apply$mcFID$sp",
104+
"apply$mcFJI$sp",
105+
"apply$mcFJJ$sp",
106+
"apply$mcFJD$sp",
107+
"apply$mcFDI$sp",
108+
"apply$mcFDJ$sp",
109+
"apply$mcFDD$sp",
110+
"apply$mcJII$sp",
111+
"apply$mcJIJ$sp",
112+
"apply$mcJID$sp",
113+
"apply$mcJJI$sp",
114+
"apply$mcJJJ$sp",
115+
"apply$mcJJD$sp",
116+
"apply$mcJDI$sp",
117+
"apply$mcJDJ$sp",
118+
"apply$mcJDD$sp",
119+
"apply$mcDII$sp",
120+
"apply$mcDIJ$sp",
121+
"apply$mcDID$sp",
122+
"apply$mcDJI$sp",
123+
"apply$mcDJJ$sp",
124+
"apply$mcDJD$sp",
125+
"apply$mcDDI$sp",
126+
"apply$mcDDJ$sp",
127+
"apply$mcDDD$sp",
128+
"apply",
129+
"apply$mcIII$sp",
130+
"apply"),
131+
s"Apply methods were not in the expected order: $apps"
132+
)
65133
}
66134
}
67135

0 commit comments

Comments
 (0)