IC mangling: Generate version requirements to properties as well

Generate the requirements at JVM only.
This commit is contained in:
Ilmir Usmanov
2020-11-16 19:46:04 +01:00
parent 0d79ed1077
commit 7a18ab9094
7 changed files with 55 additions and 51 deletions
@@ -61,7 +61,7 @@ class JvmSerializerExtension @JvmOverloads constructor(
override val metadataVersion = state.metadataVersion override val metadataVersion = state.metadataVersion
private val jvmDefaultMode = state.jvmDefaultMode private val jvmDefaultMode = state.jvmDefaultMode
private val approximator = state.typeApproximator private val approximator = state.typeApproximator
private val useOldManglingScheme = state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) private val useOldManglingScheme = state.useOldManglingSchemeForFunctionsWithInlineClassesInSignatures
override fun shouldUseTypeTable(): Boolean = useTypeTable override fun shouldUseTypeTable(): Boolean = useTypeTable
override fun shouldSerializeFunction(descriptor: FunctionDescriptor): Boolean { override fun shouldSerializeFunction(descriptor: FunctionDescriptor): Boolean {
@@ -217,6 +217,13 @@ class JvmSerializerExtension @JvmOverloads constructor(
) { ) {
versionRequirementTable?.writeFunctionNameManglingForReturnTypeRequirement(proto::addVersionRequirement) versionRequirementTable?.writeFunctionNameManglingForReturnTypeRequirement(proto::addVersionRequirement)
} }
if ((requiresFunctionNameManglingForReturnType(descriptor) ||
requiresFunctionNameManglingForParameterTypes(descriptor)) &&
!DescriptorUtils.hasJvmNameAnnotation(descriptor) && !useOldManglingScheme
) {
versionRequirementTable?.writeNewFunctionNameManglingRequirement(proto::addVersionRequirement)
}
} }
private fun MutableVersionRequirementTable.writeInlineParameterNullCheckRequirement(add: (Int) -> Unit) { private fun MutableVersionRequirementTable.writeInlineParameterNullCheckRequirement(add: (Int) -> Unit) {
@@ -233,6 +240,12 @@ class JvmSerializerExtension @JvmOverloads constructor(
} }
} }
private fun MutableVersionRequirementTable.writeNewFunctionNameManglingRequirement(add: (Int) -> Unit) {
if (languageVersionSettings.languageVersion.major == 1 && languageVersionSettings.languageVersion.minor >= 4) {
add(writeVersionRequirement(1, 4, 30, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, this))
}
}
private fun FunctionDescriptor.needsInlineParameterNullCheckRequirement(): Boolean = private fun FunctionDescriptor.needsInlineParameterNullCheckRequirement(): Boolean =
isInline && !isSuspend && !isParamAssertionsDisabled && isInline && !isSuspend && !isParamAssertionsDisabled &&
!DescriptorVisibilities.isPrivate(visibility) && !DescriptorVisibilities.isPrivate(visibility) &&
@@ -280,6 +293,9 @@ class JvmSerializerExtension @JvmOverloads constructor(
} }
if (!DescriptorUtils.hasJvmNameAnnotation(descriptor) && requiresFunctionNameManglingForReturnType(descriptor)) { if (!DescriptorUtils.hasJvmNameAnnotation(descriptor) && requiresFunctionNameManglingForReturnType(descriptor)) {
if (!useOldManglingScheme) {
versionRequirementTable?.writeNewFunctionNameManglingRequirement(proto::addVersionRequirement)
}
versionRequirementTable?.writeFunctionNameManglingForReturnTypeRequirement(proto::addVersionRequirement) versionRequirementTable?.writeFunctionNameManglingForReturnTypeRequirement(proto::addVersionRequirement)
} }
} }
@@ -401,6 +417,4 @@ class JvmSerializerExtension @JvmOverloads constructor(
override fun releaseCoroutines(): Boolean { override fun releaseCoroutines(): Boolean {
return languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines) return languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
} }
override fun useOldInlineClassesManglingScheme(): Boolean = useOldManglingScheme
} }
@@ -195,6 +195,9 @@ class GenerationState private constructor(
val languageVersionSettings = configuration.languageVersionSettings val languageVersionSettings = configuration.languageVersionSettings
val useOldManglingSchemeForFunctionsWithInlineClassesInSignatures =
configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME)
val target = configuration.get(JVMConfigurationKeys.JVM_TARGET) ?: JvmTarget.DEFAULT val target = configuration.get(JVMConfigurationKeys.JVM_TARGET) ?: JvmTarget.DEFAULT
val runtimeStringConcat = val runtimeStringConcat =
if (target.bytecodeVersion >= JvmTarget.JVM_9.bytecodeVersion) if (target.bytecodeVersion >= JvmTarget.JVM_9.bytecodeVersion)
@@ -214,7 +217,7 @@ class GenerationState private constructor(
classBuilderMode, classBuilderMode,
this.moduleName, this.moduleName,
languageVersionSettings, languageVersionSettings,
configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME), useOldManglingSchemeForFunctionsWithInlineClassesInSignatures,
IncompatibleClassTrackerImpl(extraJvmDiagnosticsTrace), IncompatibleClassTrackerImpl(extraJvmDiagnosticsTrace),
target, target,
isIrBackend isIrBackend
@@ -222,7 +222,7 @@ class MemoizedInlineClassReplacements(
if (noFakeOverride) { if (noFakeOverride) {
isFakeOverride = false isFakeOverride = false
} }
val useOldManglingScheme = context.state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) val useOldManglingScheme = context.state.useOldManglingSchemeForFunctionsWithInlineClassesInSignatures
name = mangledNameFor(function, mangleReturnTypes, useOldManglingScheme) name = mangledNameFor(function, mangleReturnTypes, useOldManglingScheme)
if ( if (
!useOldManglingScheme && !useOldManglingScheme &&
@@ -362,17 +362,7 @@ class DescriptorSerializer private constructor(
} }
if (descriptor.hasInlineClassTypesInSignature()) { if (descriptor.hasInlineClassTypesInSignature()) {
if (extension.useOldInlineClassesManglingScheme()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
} else {
builder.addVersionRequirement(
writeVersionRequirement(
1, 4, 30,
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION,
this
)
)
}
} }
} }
@@ -94,6 +94,4 @@ abstract class SerializerExtension {
} }
open fun releaseCoroutines(): Boolean = false open fun releaseCoroutines(): Boolean = false
open fun useOldInlineClassesManglingScheme(): Boolean = false
} }
@@ -211,19 +211,9 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
"test.Ctor.<init>", "test.Ctor.<init>",
"test.Foo", "test.Foo",
"test.Bar", "test.Bar",
"test.result",
"test.simpleProp" "test.simpleProp"
) )
) )
} }
fun testInlineClassesAndRelevantDeclarations1430() {
doTest(
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, null,
fqNamesWithRequirements = listOf(
"test.simpleFun",
"test.aliasedFun",
"test.result",
)
)
}
} }
@@ -130,7 +130,8 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() {
fun testInlineClassReturnTypeMangled() { fun testInlineClassReturnTypeMangled() {
// Class members returning inline class values are mangled, // Class members returning inline class values are mangled,
// and have "since 1.4" version requirement along with "since 1.3" version requirement for inline class in signature // and have "since 1.4", "require 1.4.30" version requirement along with
// "since 1.3" version requirement for inline class in signature
doTest( doTest(
VersionRequirement.Version(1, 4, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null, VersionRequirement.Version(1, 4, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
fqNamesWithRequirements = listOf( fqNamesWithRequirements = listOf(
@@ -140,42 +141,39 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() {
customLanguageVersion = LanguageVersion.KOTLIN_1_4, customLanguageVersion = LanguageVersion.KOTLIN_1_4,
shouldBeSingleRequirement = false shouldBeSingleRequirement = false
) )
doTest(
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null,
fqNamesWithRequirements = listOf(
"test.C.propertyOfInlineClassType",
"test.C.returnsInlineClassType",
),
shouldBeSingleRequirement = false,
customLanguageVersion = LanguageVersion.KOTLIN_1_4
)
// Top-level functions and properties returning inline class values are NOT mangled, // Top-level functions and properties returning inline class values are NOT mangled,
// and have "since 1.3" version requirement for inline class in signature only. // and have "since 1.3" version requirement for inline class in signature only.
doTest( doTest(
VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null, VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
fqNamesWithRequirements = listOf( fqNamesWithRequirements = listOf(
"test.propertyOfInlineClassType" "test.propertyOfInlineClassType",
"test.returnsInlineClassType",
), ),
shouldBeSingleRequirement = true, shouldBeSingleRequirement = false,
customLanguageVersion = LanguageVersion.KOTLIN_1_4 customLanguageVersion = LanguageVersion.KOTLIN_1_4
) )
doTest(
VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
fqNamesWithRequirements = listOf(
"test.C.propertyOfInlineClassType"
),
shouldBeSingleRequirement = true,
customLanguageVersion = LanguageVersion.KOTLIN_1_3
)
// In Kotlin 1.3, all functions and properties returning inline class values are NOT mangled, // In Kotlin 1.3, all functions and properties returning inline class values are NOT mangled,
// and have "since 1.3" version requirement for inline class in signature only. // and have "since 1.3" version requirement for inline class in signature only.
doTest( doTest(
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null, VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
fqNamesWithRequirements = listOf( fqNamesWithRequirements = listOf(
"test.propertyOfInlineClassType",
"test.C.propertyOfInlineClassType",
"test.C.returnsInlineClassTypeJvmName", "test.C.returnsInlineClassTypeJvmName",
"test.returnsInlineClassType" "test.returnsInlineClassType",
),
shouldBeSingleRequirement = true,
customLanguageVersion = LanguageVersion.KOTLIN_1_4
)
doTest(
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null,
fqNamesWithRequirements = listOf(
"test.C.returnsInlineClassType" "test.C.returnsInlineClassType"
), ),
shouldBeSingleRequirement = false, shouldBeSingleRequirement = true,
customLanguageVersion = LanguageVersion.KOTLIN_1_4 customLanguageVersion = LanguageVersion.KOTLIN_1_3
) )
} }
@@ -195,4 +193,15 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() {
) )
) )
} }
fun testInlineClassesAndRelevantDeclarations1430() {
doTest(
VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null,
fqNamesWithRequirements = listOf(
"test.simpleFun",
"test.aliasedFun",
),
shouldBeSingleRequirement = false
)
}
} }