JVM IR: Fix inline class mangling for calls to internal functions

...in a different module, e.g., using -Xfriend-paths.
This commit is contained in:
Steven Schäfer
2021-01-28 14:20:21 +01:00
committed by Ilmir Usmanov
parent 6747084fe2
commit 482e217b5e
8 changed files with 48 additions and 3 deletions
@@ -134,7 +134,10 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
origin != JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_OR_TYPEALIAS_ANNOTATIONS &&
!isPublishedApi()
) {
return this
return originalFunction.takeIf { it != this }
?.safeAs<IrSimpleFunction>()
?.getInternalFunctionForManglingIfNeeded()
?: this
}
originalForDefaultAdapter?.getInternalFunctionForManglingIfNeeded()?.let { return it }
return null
@@ -383,12 +383,13 @@ fun IrSimpleType.isRawType(): Boolean =
hasAnnotation(JvmGeneratorExtensions.RAW_TYPE_ANNOTATION_FQ_NAME)
internal fun classFileContainsMethod(classId: ClassId, function: IrFunction, context: JvmBackendContext): Boolean? {
val originalDescriptor = context.methodSignatureMapper.mapSignatureWithGeneric(function).asmMethod.descriptor
val originalSignature = context.methodSignatureMapper.mapSignatureWithGeneric(function).asmMethod
val originalDescriptor = originalSignature.descriptor
val descriptor = if (function.isSuspend)
listOf(*Type.getArgumentTypes(originalDescriptor), Type.getObjectType("kotlin/coroutines/Continuation"))
.joinToString(prefix = "(", postfix = ")", separator = "") + AsmTypes.OBJECT_TYPE
else originalDescriptor
return classFileContainsMethod(classId, context.state, Method(function.name.asString(), descriptor))
return classFileContainsMethod(classId, context.state, Method(originalSignature.name, descriptor))
}
val IrMemberWithContainerSource.parentClassId: ClassId?