IC Mangling: correctly mangle inline default functions
#KT-43682 Fixed
This commit is contained in:
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicArrayConstructors
|
|||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||||
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.incremental.components.Position
|
import org.jetbrains.kotlin.incremental.components.Position
|
||||||
import org.jetbrains.kotlin.incremental.components.ScopeKind
|
import org.jetbrains.kotlin.incremental.components.ScopeKind
|
||||||
@@ -522,10 +523,15 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
|||||||
return SMAPAndMethodNode(intrinsic, createDefaultFakeSMAP())
|
return SMAPAndMethodNode(intrinsic, createDefaultFakeSMAP())
|
||||||
}
|
}
|
||||||
|
|
||||||
val asmMethod = if (callDefault)
|
var asmMethod = mapMethod(callDefault)
|
||||||
state.typeMapper.mapDefaultMethod(functionDescriptor, sourceCompiler.contextKind)
|
if (asmMethod.name.contains("-") &&
|
||||||
else
|
!state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) &&
|
||||||
mangleSuspendInlineFunctionAsmMethodIfNeeded(functionDescriptor, jvmSignature.asmMethod)
|
classFileContainsMethod(functionDescriptor, state, asmMethod) == false
|
||||||
|
) {
|
||||||
|
state.typeMapper.useOldManglingRulesForFunctionAcceptingInlineClass = true
|
||||||
|
asmMethod = mapMethod(callDefault)
|
||||||
|
state.typeMapper.useOldManglingRulesForFunctionAcceptingInlineClass = false
|
||||||
|
}
|
||||||
|
|
||||||
val directMember = getDirectMemberAndCallableFromObject(functionDescriptor)
|
val directMember = getDirectMemberAndCallableFromObject(functionDescriptor)
|
||||||
if (!isBuiltInArrayIntrinsic(functionDescriptor) && !descriptorIsDeserialized(directMember)) {
|
if (!isBuiltInArrayIntrinsic(functionDescriptor) && !descriptorIsDeserialized(directMember)) {
|
||||||
@@ -537,6 +543,10 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
|||||||
return getCompiledMethodNodeInner(functionDescriptor, directMember, asmMethod, methodOwner, state, jvmSignature)
|
return getCompiledMethodNodeInner(functionDescriptor, directMember, asmMethod, methodOwner, state, jvmSignature)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun mapMethod(callDefault: Boolean): Method =
|
||||||
|
if (callDefault) state.typeMapper.mapDefaultMethod(functionDescriptor, sourceCompiler.contextKind)
|
||||||
|
else mangleSuspendInlineFunctionAsmMethodIfNeeded(functionDescriptor, jvmSignature.asmMethod)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
internal fun createSpecialInlineMethodNodeFromBinaries(functionDescriptor: FunctionDescriptor, state: GenerationState): MethodNode {
|
internal fun createSpecialInlineMethodNodeFromBinaries(functionDescriptor: FunctionDescriptor, state: GenerationState): MethodNode {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// IGNORE_BACKEND: JVM
|
|
||||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
|
|||||||
Reference in New Issue
Block a user