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? {
|
fun unboxedTypeOfInlineClass(boxedType: Type, state: GenerationState): Type? {
|
||||||
val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(boxedType).singleOrNull() ?: return null
|
val descriptor =
|
||||||
return state.typeMapper.mapType(descriptor.defaultType)
|
state.jvmBackendClassResolver.resolveToClassDescriptors(boxedType).singleOrNull()?.takeIf { it.isInline } ?: return null
|
||||||
|
return state.mapInlineClass(descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isInlineClassValue(boxedType: Type): Boolean {
|
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
|
if (name != KotlinTypeMapper.BOX_JVM_METHOD_NAME) return false
|
||||||
|
|
||||||
val ownerType = Type.getObjectType(owner)
|
val ownerType = Type.getObjectType(owner)
|
||||||
val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(ownerType).singleOrNull() ?: return false
|
return desc == Type.getMethodDescriptor(ownerType, unboxedTypeOfInlineClass(ownerType, state))
|
||||||
|
|
||||||
if (!descriptor.isInline) return false
|
|
||||||
|
|
||||||
return desc == Type.getMethodDescriptor(ownerType, state.typeMapper.mapType(descriptor.defaultType))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MethodInsnNode.isInlineClassUnboxingMethodDescriptor(state: GenerationState): Boolean {
|
private fun MethodInsnNode.isInlineClassUnboxingMethodDescriptor(state: GenerationState): Boolean {
|
||||||
if (name != KotlinTypeMapper.UNBOX_JVM_METHOD_NAME) return false
|
if (name != KotlinTypeMapper.UNBOX_JVM_METHOD_NAME) return false
|
||||||
|
|
||||||
val ownerType = Type.getObjectType(owner)
|
val ownerType = Type.getObjectType(owner)
|
||||||
val descriptor = state.jvmBackendClassResolver.resolveToClassDescriptors(ownerType).singleOrNull() ?: return false
|
return desc == Type.getMethodDescriptor(unboxedTypeOfInlineClass(ownerType, state))
|
||||||
|
|
||||||
if (!descriptor.isInline) return false
|
|
||||||
|
|
||||||
return desc == Type.getMethodDescriptor(state.typeMapper.mapType(descriptor.defaultType))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun AbstractInsnNode.isNextMethodCallOfProgressionIterator(values: List<BasicValue>) =
|
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.optimization.OptimizationClassBuilderFactory
|
||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
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.serialization.deserialization.DeserializationConfiguration
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
import org.jetbrains.org.objectweb.asm.commons.Method
|
import org.jetbrains.org.objectweb.asm.commons.Method
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -261,6 +263,7 @@ class GenerationState private constructor(
|
|||||||
|
|
||||||
val globalSerializationBindings = JvmSerializationBindings()
|
val globalSerializationBindings = JvmSerializationBindings()
|
||||||
lateinit var irBasedMapAsmMethod: (FunctionDescriptor) -> Method
|
lateinit var irBasedMapAsmMethod: (FunctionDescriptor) -> Method
|
||||||
|
var mapInlineClass: (ClassDescriptor) -> Type = { descriptor -> typeMapper.mapType(descriptor.defaultType) }
|
||||||
|
|
||||||
init {
|
init {
|
||||||
this.interceptedBuilderFactory = builderFactory
|
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.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
|
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
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.ir.util.render
|
||||||
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
@@ -68,6 +69,9 @@ object JvmBackendFacade {
|
|||||||
state.irBasedMapAsmMethod = { descriptor ->
|
state.irBasedMapAsmMethod = { descriptor ->
|
||||||
context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner)
|
context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner)
|
||||||
}
|
}
|
||||||
|
state.mapInlineClass = { descriptor ->
|
||||||
|
context.typeMapper.mapType(context.referenceClass(descriptor).owner.defaultType)
|
||||||
|
}
|
||||||
//TODO
|
//TODO
|
||||||
ExternalDependenciesGenerator(
|
ExternalDependenciesGenerator(
|
||||||
irModuleFragment.descriptor,
|
irModuleFragment.descriptor,
|
||||||
|
|||||||
Reference in New Issue
Block a user