[JVM] Micro-optimize method signature mapping

This commit optimizes functions related to method signature mapping on
the JVM backend. The most significant change is avoiding re-allocations
in StringBuilder when building internal names. The commit also includes
minor optimizations, such as removing redundant allocations of strings
and other objects.
This commit is contained in:
Iaroslav Postovalov
2023-08-29 23:44:17 +06:00
committed by Space Team
parent 70996035fc
commit 059046a2b1
10 changed files with 58 additions and 27 deletions
@@ -134,7 +134,7 @@ open class SpecialGenericSignatures {
signatureAndName.copy(name = jdkName).signature
}
val ORIGINAL_SHORT_NAMES: List<Name> = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.keys.map { it.name }
val ORIGINAL_SHORT_NAMES: Set<Name> = NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.keys.mapTo(HashSet()) { it.name }
val JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP: Map<Name, Name> =
NAME_AND_SIGNATURE_TO_JVM_REPRESENTATION_NAME_MAP.entries
@@ -34,5 +34,5 @@ object SignatureBuildingComponents {
val ClassId.internalName: String
get() {
return JvmClassName.byClassId(JavaToKotlinClassMap.mapKotlinToJava(asSingleFqName().toUnsafe()) ?: this).internalName
return JvmClassName.internalNameByClassId(JavaToKotlinClassMap.mapKotlinToJava(asSingleFqName().toUnsafe()) ?: this)
}
@@ -55,7 +55,7 @@ fun <T : Any> TypeSystemCommonBackendContext.mapBuiltInType(
if (!mode.kotlinCollectionsToJavaCollections && JavaToKotlinClassMap.mutabilityMappings.any { it.javaClass == classId })
return null
return typeFactory.createObjectType(JvmClassName.byClassId(classId).internalName)
return typeFactory.createObjectType(JvmClassName.internalNameByClassId(classId))
}
}
@@ -28,11 +28,16 @@ public class JvmClassName {
@NotNull
public static JvmClassName byClassId(@NotNull ClassId classId) {
return new JvmClassName(internalNameByClassId(classId));
}
@NotNull
public static String internalNameByClassId(@NotNull ClassId classId) {
FqName packageFqName = classId.getPackageFqName();
String relativeClassName = classId.getRelativeClassName().asString().replace('.', '$');
return packageFqName.isRoot()
? new JvmClassName(relativeClassName)
: new JvmClassName(packageFqName.asString().replace('.', '/') + "/" + relativeClassName);
? relativeClassName
: packageFqName.asString().replace('.', '/') + "/" + relativeClassName;
}
/**