diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt index 032ed403438..f4cd6573685 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt @@ -118,8 +118,9 @@ fun getUnboxedType(boxedType: Type, state: GenerationState): Type { } fun unboxedTypeOfInlineClass(boxedType: Type, state: GenerationState): Type? { - val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(boxedType).singleOrNull() ?: return null - return state.typeMapper.mapType(descriptor.defaultType) + val descriptor = + state.jvmBackendClassResolver.resolveToClassDescriptors(boxedType).singleOrNull()?.takeIf { it.isInline } ?: return null + return state.mapInlineClass(descriptor) } private fun isInlineClassValue(boxedType: Type): Boolean { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt index aff174049f1..990220dde2c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt @@ -237,22 +237,14 @@ private fun MethodInsnNode.isInlineClassBoxingMethodDescriptor(state: Generation if (name != KotlinTypeMapper.BOX_JVM_METHOD_NAME) return false val ownerType = Type.getObjectType(owner) - val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(ownerType).singleOrNull() ?: return false - - if (!descriptor.isInline) return false - - return desc == Type.getMethodDescriptor(ownerType, state.typeMapper.mapType(descriptor.defaultType)) + return desc == Type.getMethodDescriptor(ownerType, unboxedTypeOfInlineClass(ownerType, state)) } private fun MethodInsnNode.isInlineClassUnboxingMethodDescriptor(state: GenerationState): Boolean { if (name != KotlinTypeMapper.UNBOX_JVM_METHOD_NAME) return false val ownerType = Type.getObjectType(owner) - val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(ownerType).singleOrNull() ?: return false - - if (!descriptor.isInline) return false - - return desc == Type.getMethodDescriptor(state.typeMapper.mapType(descriptor.defaultType)) + return desc == Type.getMethodDescriptor(unboxedTypeOfInlineClass(ownerType, state)) } fun AbstractInsnNode.isNextMethodCallOfProgressionIterator(values: List) = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index ae0c3aca0e8..8df2d44a281 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods import org.jetbrains.kotlin.codegen.optimization.OptimizationClassBuilderFactory import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ScriptDescriptor @@ -45,6 +46,7 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind.* import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method import java.io.File @@ -261,6 +263,7 @@ class GenerationState private constructor( val globalSerializationBindings = JvmSerializationBindings() lateinit var irBasedMapAsmMethod: (FunctionDescriptor) -> Method + var mapInlineClass: (ClassDescriptor) -> Type = { descriptor -> typeMapper.mapType(descriptor.defaultType) } init { this.interceptedBuilderFactory = builderFactory diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt index 47daf4a2329..0100f50248c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.psi.KtFile @@ -68,6 +69,9 @@ object JvmBackendFacade { state.irBasedMapAsmMethod = { descriptor -> context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner) } + state.mapInlineClass = { descriptor -> + context.typeMapper.mapType(context.referenceClass(descriptor).owner.defaultType) + } //TODO ExternalDependenciesGenerator( irModuleFragment.descriptor,