Skip to content

Commit 42b31a4

Browse files
committed
Don't generate old inline accessors if we use BinaryAPIs
Users should add the old accessor explicitly to keep binary compatibility. This accessor should be `@binaryAPI private[C]` where `C` is the enclosing class.
1 parent 82b3e13 commit 42b31a4

File tree

2 files changed

+10
-39
lines changed

2 files changed

+10
-39
lines changed

compiler/src/dotty/tools/dotc/inlines/PrepareInlineable.scala

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,9 @@ object PrepareInlineable {
5656

5757
trait InsertInlineAccessors extends Insert {
5858

59-
def useBinaryAPI: Boolean
60-
6159
def accessorNameOf(accessed: Symbol, site: Symbol)(using Context): TermName =
6260
val accName = InlineAccessorName(accessed.name.asTermName)
63-
if site.isExtensibleClass || useBinaryAPI then accName.expandedName(site)
61+
if site.isExtensibleClass || accessed.isBinaryAPI then accName.expandedName(site)
6462
else accName
6563

6664
/** A definition needs an accessor if it is private, protected, or qualified private
@@ -76,14 +74,13 @@ object PrepareInlineable {
7674
def needsAccessor(sym: Symbol)(using Context): Boolean =
7775
sym.isTerm &&
7876
(sym.isOneOf(AccessFlags) || sym.privateWithin.exists) &&
79-
(!useBinaryAPI || !sym.isBinaryAPI || (sym.is(Private) && !sym.owner.is(Trait))) &&
77+
(!sym.isBinaryAPI || (sym.is(Private) && !sym.owner.is(Trait))) &&
8078
!(sym.isStableMember && sym.info.widenTermRefExpr.isInstanceOf[ConstantType]) &&
8179
!sym.isInlineMethod &&
8280
(Inlines.inInlineMethod || StagingLevel.level > 0)
8381
}
8482

85-
class InsertPrivateBinaryAPIAccessors extends InsertInlineAccessors:
86-
def useBinaryAPI: Boolean = true
83+
object InsertPrivateBinaryAPIAccessors extends InsertInlineAccessors
8784

8885
/** A tree map which inserts accessors for non-public term members accessed from inlined code.
8986
*/
@@ -110,7 +107,7 @@ object PrepareInlineable {
110107
* possible if the receiver is essentially this or an outer this, which is indicated
111108
* by the test that we can find a host for the accessor.
112109
*/
113-
class MakeInlineableDirect(inlineSym: Symbol, val useBinaryAPI: Boolean) extends MakeInlineableMap(inlineSym) {
110+
class MakeInlineableDirect(inlineSym: Symbol) extends MakeInlineableMap(inlineSym) {
114111
def preTransform(tree: Tree)(using Context): Tree = tree match {
115112
case tree: RefTree if needsAccessor(tree.symbol) =>
116113
if (tree.symbol.isConstructor) {
@@ -154,7 +151,7 @@ object PrepareInlineable {
154151
* Since different calls might have different receiver types, we need to generate one
155152
* such accessor per call, so they need to have unique names.
156153
*/
157-
class MakeInlineablePassing(inlineSym: Symbol, val useBinaryAPI: Boolean) extends MakeInlineableMap(inlineSym) {
154+
class MakeInlineablePassing(inlineSym: Symbol) extends MakeInlineableMap(inlineSym) {
158155

159156
def preTransform(tree: Tree)(using Context): Tree = tree match {
160157
case _: Apply | _: TypeApply | _: RefTree
@@ -227,10 +224,9 @@ object PrepareInlineable {
227224
assert(sym.is(Private))
228225
if !sym.owner.is(Trait) then
229226
val ref = tpd.ref(sym).asInstanceOf[RefTree]
230-
val insertPrivateBinaryAPIAccessors = new InsertPrivateBinaryAPIAccessors()
231-
val accessor = insertPrivateBinaryAPIAccessors.useAccessor(ref)
227+
val accessor = InsertPrivateBinaryAPIAccessors.useAccessor(ref)
232228
if sym.is(Mutable) then
233-
insertPrivateBinaryAPIAccessors.useSetter(accessor)
229+
InsertPrivateBinaryAPIAccessors.useSetter(accessor)
234230

235231
/** Adds accessors for all non-public term members accessed
236232
* from `tree`. Non-public type members are currently left as they are.
@@ -247,13 +243,9 @@ object PrepareInlineable {
247243
// so no accessors are needed for them.
248244
tree
249245
else
250-
// Make sure the old accessors are generated for binary compatibility
251-
new MakeInlineablePassing(inlineSym, useBinaryAPI = false).transform(
252-
new MakeInlineableDirect(inlineSym, useBinaryAPI = false).transform(tree))
253-
254-
// TODO: warn if MakeInlineablePassing or MakeInlineableDirect generate accessors when useBinaryAPI in enabled
255-
new MakeInlineablePassing(inlineSym, useBinaryAPI = true).transform(
256-
new MakeInlineableDirect(inlineSym, useBinaryAPI = true).transform(tree))
246+
// TODO: warn if MakeInlineablePassing or MakeInlineableDirect generate accessors
247+
new MakeInlineablePassing(inlineSym).transform(
248+
new MakeInlineableDirect(inlineSym).transform(tree))
257249
}
258250
}
259251

compiler/test/dotty/tools/backend/jvm/BinaryAPITests.scala

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -283,21 +283,16 @@ class BinaryAPITests extends DottyBytecodeTest {
283283
val cTrait = loadClassNode(dir.lookupName("C.class", directory = false).input, skipDebugInfo = false)
284284

285285
checkPublicMethod(cTrait, "C$$privateValBinaryAPI", "()I")
286-
checkPublicMethod(cTrait, "C$$inline$privateValBinaryAPI", "()I")
287286
checkPublicMethod(cTrait, "packagePrivateValBinaryAPI", "()I")
288287
checkPublicMethod(cTrait, "protectedValBinaryAPI", "()I")
289288
checkPublicMethod(cTrait, "C$$privateLazyValBinaryAPI", "()I")
290-
checkPublicMethod(cTrait, "C$$inline$privateLazyValBinaryAPI", "()I")
291289
checkPublicMethod(cTrait, "packagePrivateLazyValBinaryAPI", "()I")
292290
checkPublicMethod(cTrait, "protectedLazyValBinaryAPI", "()I")
293291
checkPublicMethod(cTrait, "C$$privateVarBinaryAPI", "()I")
294-
checkPublicMethod(cTrait, "C$$inline$privateVarBinaryAPI", "()I")
295-
checkPublicMethod(cTrait, "C$$inline$privateVarBinaryAPI_$eq", "(I)V")
296292
checkPublicMethod(cTrait, "packagePrivateVarBinaryAPI", "()I")
297293
checkPublicMethod(cTrait, "packagePrivateVarBinaryAPI_$eq", "(I)V")
298294
checkPublicMethod(cTrait, "protectedVarBinaryAPI", "()I")
299295
checkPublicMethod(cTrait, "protectedVarBinaryAPI_$eq", "(I)V")
300-
checkPublicMethod(cTrait, "C$$inline$privateDefBinaryAPI", "()I")
301296
checkPublicMethod(cTrait, "packagePrivateDefBinaryAPI", "()I")
302297
checkPublicMethod(cTrait, "protectedDefBinaryAPI", "()I")
303298

@@ -374,11 +369,7 @@ class BinaryAPITests extends DottyBytecodeTest {
374369
| @binaryAPI private[foo] object Baz
375370
""".stripMargin
376371
checkBCode(code) { dir =>
377-
// For 3.0-3.3 compat
378372
val barClass = loadClassNode(dir.subdirectoryNamed("foo").lookupName("Bar.class", directory = false).input, skipDebugInfo = false)
379-
checkPublicMethod(barClass, "foo$Bar$$inline$Baz", "()Lfoo/Baz$;")
380-
381-
// Check that the @binaryAPI annotated method is called
382373
checkPublicMethod(barClass, "testInlined", "()Lfoo/Baz$;")
383374
}
384375
}
@@ -394,11 +385,7 @@ class BinaryAPITests extends DottyBytecodeTest {
394385
| @binaryAPI private object Baz
395386
""".stripMargin
396387
checkBCode(code) { dir =>
397-
// For 3.0-3.3 compat
398388
val barClass = loadClassNode(dir.subdirectoryNamed("foo").lookupName("Bar.class", directory = false).input, skipDebugInfo = false)
399-
checkPublicMethod(barClass, "foo$Bar$$inline$Baz", "()Lfoo/Baz$;")
400-
401-
// Check that the @binaryAPI annotated method is called
402389
checkPublicMethod(barClass, "testInlined", "()Lfoo/Baz$;")
403390
}
404391
}
@@ -415,11 +402,7 @@ class BinaryAPITests extends DottyBytecodeTest {
415402
| @binaryAPI private[Macro] def fooImpl = {}
416403
""".stripMargin
417404
checkBCode(code) { dir =>
418-
// For 3.0-3.3 compat
419405
val macroClass = loadClassNode(dir.lookupName("Macro.class", directory = false).input, skipDebugInfo = false)
420-
checkPublicMethod(macroClass, "Macro$$inline$fooImpl", "()V")
421-
422-
// Check that the @binaryAPI annotated method is called
423406
val testMethod = getMethod(macroClass, "test")
424407
val testInstructions = instructionsFromMethod(testMethod).filter(_.isInstanceOf[Invoke])
425408
assertSameCode(testInstructions, List(
@@ -439,11 +422,7 @@ class BinaryAPITests extends DottyBytecodeTest {
439422
| @binaryAPI private[foo] def bazImpl = {}
440423
""".stripMargin
441424
checkBCode(code) { dir =>
442-
// For 3.0-3.3 compat
443425
val barClass = loadClassNode(dir.subdirectoryNamed("foo").lookupName("C.class", directory = false).input, skipDebugInfo = false)
444-
checkPublicMethod(barClass, "inline$bazImpl$i1", "(Lfoo/D$;)V")
445-
446-
// Check that the @binaryAPI annotated method is called
447426
val testMethod = getMethod(barClass, "test")
448427
val testInstructions = instructionsFromMethod(testMethod).filter(_.isInstanceOf[Invoke])
449428
assertSameCode(testInstructions, List(

0 commit comments

Comments
 (0)