JVM IR: workaround KotlinTypeMapper usages in boxing optimization on inline classes
This commit is contained in:
+3
-2
@@ -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 {
|
||||
|
||||
+2
-10
@@ -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<BasicValue>) =
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user