IC mangling: Generate version requirements to properties as well
Generate the requirements at JVM only.
This commit is contained in:
+17
-3
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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 &&
|
||||||
|
|||||||
+1
-11
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-11
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user