Lower fun interface children's body during inline class lowering

#KT-51121 Fixed
This commit is contained in:
Ilmir Usmanov
2022-02-21 02:29:16 +01:00
committed by teamcity
parent 72532f6f03
commit c072448d22
12 changed files with 163 additions and 10 deletions
@@ -122,10 +122,14 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
return null
}
// If fun interface methods are already mangled, do not mangle them twice.
if (function is IrSimpleFunction && function.overriddenSymbols.any { it.owner.parentAsClass.isFun } &&
function.name.asString().substringAfterLast('-') == replacement.name.asString().substringAfterLast('-')
) return null
if (function is IrSimpleFunction && function.overriddenSymbols.any { it.owner.parentAsClass.isFun }) {
// If fun interface methods are already mangled, do not mangle them twice.
val suffix = function.hashSuffix()
if (suffix != null && function.name.asString().endsWith(suffix)) {
function.transformChildrenVoid()
return null
}
}
addBindingsFor(function, replacement)
return when (function) {
@@ -135,6 +139,13 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
}
}
private fun IrFunction.hashSuffix(): String? =
InlineClassAbi.hashSuffix(
this,
context.state.functionsWithInlineClassReturnTypesMangled,
context.state.useOldManglingSchemeForFunctionsWithInlineClassesInSignatures
)
private fun transformSimpleFunctionFlat(function: IrSimpleFunction, replacement: IrSimpleFunction): List<IrDeclaration> {
replacement.valueParameters.forEach {
it.transformChildrenVoid()
@@ -460,6 +471,10 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
override fun visitReturn(expression: IrReturn): IrExpression {
expression.returnTargetSymbol.owner.safeAs<IrFunction>()?.let { target ->
val suffix = target.hashSuffix()
if (suffix != null && target.name.asString().endsWith(suffix))
return super.visitReturn(expression)
context.inlineClassReplacements.getReplacementFunction(target)?.let {
return context.createIrBuilder(it.symbol, expression.startOffset, expression.endOffset).irReturn(
expression.value.transform(this, null)
@@ -66,12 +66,7 @@ object InlineClassAbi {
return Name.identifier("constructor-impl")
}
val suffix = hashSuffix(
useOldMangleRules,
irFunction.fullValueParameterList.map { it.type },
irFunction.returnType.takeIf { mangleReturnTypes && irFunction.hasMangledReturnType },
irFunction.isSuspend
)
val suffix = hashSuffix(irFunction, mangleReturnTypes, useOldMangleRules)
if (suffix == null && ((irFunction.parent as? IrClass)?.isSingleFieldValueClass != true || irFunction.origin == IrDeclarationOrigin.IR_BUILTINS_STUB)) {
return irFunction.name
}
@@ -90,6 +85,14 @@ object InlineClassAbi {
return Name.identifier("$base-${suffix ?: "impl"}")
}
fun hashSuffix(irFunction: IrFunction, mangleReturnTypes: Boolean, useOldMangleRules: Boolean): String? =
hashSuffix(
useOldMangleRules,
irFunction.fullValueParameterList.map { it.type },
irFunction.returnType.takeIf { mangleReturnTypes && irFunction.hasMangledReturnType },
irFunction.isSuspend
)
fun hashSuffix(
useOldMangleRules: Boolean,
valueParameters: List<IrType>,