From c6a481190a21687728c7cc2e4a01c6d3b73423eb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 11 Jun 2020 23:22:46 +0200 Subject: [PATCH] JVM: optimize type mapping for primitive types --- .../codegen/signature/AsmTypeFactory.kt | 19 ++++++++++--- .../load/kotlin/methodSignatureMapping.kt | 27 ++++++++++++++++++- .../load/kotlin/typeSignatureMapping.kt | 9 ++++--- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/signature/AsmTypeFactory.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/signature/AsmTypeFactory.kt index 54f404a7a6a..394de4f0eb8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/signature/AsmTypeFactory.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/signature/AsmTypeFactory.kt @@ -16,16 +16,27 @@ package org.jetbrains.kotlin.codegen.signature +import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.load.kotlin.JvmTypeFactory import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.org.objectweb.asm.Type object AsmTypeFactory : JvmTypeFactory { - override fun boxType(possiblyPrimitiveType: Type) = AsmUtil.boxType(possiblyPrimitiveType) - override fun createFromString(representation: String) = Type.getType(representation) - override fun createObjectType(internalName: String) = Type.getObjectType(internalName) - override fun toString(type: Type) = type.descriptor + override fun boxType(possiblyPrimitiveType: Type): Type = + AsmUtil.boxType(possiblyPrimitiveType) + + override fun createFromString(representation: String): Type = + Type.getType(representation) + + override fun createPrimitiveType(primitiveType: PrimitiveType): Type = + AsmTypes.valueTypeForPrimitive(primitiveType) + + override fun createObjectType(internalName: String): Type = + Type.getObjectType(internalName) + + override fun toString(type: Type): String = + type.descriptor override val javaLangClassType: Type get() = AsmTypes.JAVA_CLASS_TYPE diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/methodSignatureMapping.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/methodSignatureMapping.kt index 05771d78740..e97d544b7f2 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/methodSignatureMapping.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/methodSignatureMapping.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature @@ -103,6 +104,17 @@ sealed class JvmType { class Array(val elementType: JvmType) : JvmType() override fun toString() = JvmTypeFactoryImpl.toString(this) + + companion object { + internal val BOOLEAN = Primitive(JvmPrimitiveType.BOOLEAN) + internal val CHAR = Primitive(JvmPrimitiveType.CHAR) + internal val BYTE = Primitive(JvmPrimitiveType.BYTE) + internal val SHORT = Primitive(JvmPrimitiveType.SHORT) + internal val INT = Primitive(JvmPrimitiveType.INT) + internal val FLOAT = Primitive(JvmPrimitiveType.FLOAT) + internal val LONG = Primitive(JvmPrimitiveType.LONG) + internal val DOUBLE = Primitive(JvmPrimitiveType.DOUBLE) + } } private object JvmTypeFactoryImpl : JvmTypeFactory { @@ -136,7 +148,20 @@ private object JvmTypeFactoryImpl : JvmTypeFactory { } } - override fun createObjectType(internalName: String) = JvmType.Object(internalName) + override fun createPrimitiveType(primitiveType: PrimitiveType): JvmType = + when (primitiveType) { + PrimitiveType.BOOLEAN -> JvmType.BOOLEAN + PrimitiveType.CHAR -> JvmType.CHAR + PrimitiveType.BYTE -> JvmType.BYTE + PrimitiveType.SHORT -> JvmType.SHORT + PrimitiveType.INT -> JvmType.INT + PrimitiveType.FLOAT -> JvmType.FLOAT + PrimitiveType.LONG -> JvmType.LONG + PrimitiveType.DOUBLE -> JvmType.DOUBLE + } + + override fun createObjectType(internalName: String): JvmType.Object = + JvmType.Object(internalName) override fun toString(type: JvmType): String = when (type) { diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt index 1c5174b7ce4..bb9718fce64 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/typeSignatureMapping.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionType @@ -25,6 +26,7 @@ import org.jetbrains.kotlin.utils.DO_NOTHING_3 interface JvmTypeFactory { fun boxType(possiblyPrimitiveType: T): T fun createFromString(representation: String): T + fun createPrimitiveType(primitiveType: PrimitiveType): T fun createObjectType(internalName: String): T fun toString(type: T): String @@ -40,6 +42,7 @@ interface TypeMappingConfiguration { fun getPredefinedInternalNameForClass(classDescriptor: ClassDescriptor): String? fun getPredefinedFullInternalNameForClass(classDescriptor: ClassDescriptor): String? = null fun processErrorType(kotlinType: KotlinType, descriptor: ClassDescriptor) + // returns null when type doesn't need to be preprocessed fun preprocessType(kotlinType: KotlinType): KotlinType? = null @@ -77,8 +80,8 @@ fun mapType( val constructor = kotlinType.constructor if (constructor is IntersectionTypeConstructor) { - val intersectionType = constructor.getAlternativeType() ?: - typeMappingConfiguration.commonSupertype(constructor.supertypes) + val intersectionType = constructor.getAlternativeType() + ?: typeMappingConfiguration.commonSupertype(constructor.supertypes) // interface In // open class A : In // open class B : In @@ -199,7 +202,7 @@ fun TypeSystemCommonBackendContext.mapBuiltInType( val primitiveType = constructor.getPrimitiveType() if (primitiveType != null) { - val jvmType = typeFactory.createFromString(JvmPrimitiveType.get(primitiveType).desc) + val jvmType = typeFactory.createPrimitiveType(primitiveType) val isNullableInJava = type.isNullableType() || hasEnhancedNullability(type) return typeFactory.boxTypeIfNeeded(jvmType, isNullableInJava) }