[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:
committed by
Space Team
parent
70996035fc
commit
059046a2b1
+22
-8
@@ -55,7 +55,15 @@ open class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapp
|
||||
override fun mapTypeCommon(type: KotlinTypeMarker, mode: TypeMappingMode): Type =
|
||||
mapType(type as IrType, mode)
|
||||
|
||||
private fun computeClassInternalName(irClass: IrClass): StringBuilder {
|
||||
private fun computeClassInternalNameAsString(irClass: IrClass): String {
|
||||
context.getLocalClassType(irClass)?.internalName?.let {
|
||||
return it
|
||||
}
|
||||
|
||||
return computeClassInternalName(irClass, 0).toString()
|
||||
}
|
||||
|
||||
private fun computeClassInternalName(irClass: IrClass, capacity: Int): StringBuilder {
|
||||
context.getLocalClassType(irClass)?.internalName?.let {
|
||||
return StringBuilder(it)
|
||||
}
|
||||
@@ -63,20 +71,26 @@ open class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapp
|
||||
val shortName = SpecialNames.safeIdentifier(irClass.name).identifier
|
||||
|
||||
when (val parent = irClass.parent) {
|
||||
is IrPackageFragment ->
|
||||
return StringBuilder().apply {
|
||||
val fqName = parent.packageFqName
|
||||
is IrPackageFragment -> {
|
||||
val fqName = parent.packageFqName
|
||||
var ourCapacity = shortName.length
|
||||
if (!fqName.isRoot) {
|
||||
ourCapacity += fqName.asString().length + 1
|
||||
}
|
||||
return StringBuilder(ourCapacity + capacity).apply {
|
||||
if (!fqName.isRoot) {
|
||||
append(fqName.asString().replace('.', '/')).append("/")
|
||||
}
|
||||
append(shortName)
|
||||
}
|
||||
}
|
||||
is IrClass ->
|
||||
return computeClassInternalName(parent).append("$").append(shortName)
|
||||
return computeClassInternalName(parent, 1 + shortName.length).append("$").append(shortName)
|
||||
is IrFunction ->
|
||||
if (parent.isSuspend && parent.parentAsClass.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS) {
|
||||
return computeClassInternalName(parent.parentAsClass.parentAsClass)
|
||||
.append("$").append(parent.name.asString())
|
||||
val parentName = parent.name.asString()
|
||||
return computeClassInternalName(parent.parentAsClass.parentAsClass, 1 + parentName.length)
|
||||
.append("$").append(parentName)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +106,7 @@ open class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapp
|
||||
context.classNameOverride[irClass]?.let { return it.internalName }
|
||||
|
||||
return JvmCodegenUtil.sanitizeNameIfNeeded(
|
||||
computeClassInternalName(irClass).toString(),
|
||||
computeClassInternalNameAsString(irClass),
|
||||
context.state.languageVersionSettings
|
||||
)
|
||||
}
|
||||
|
||||
+11
-8
@@ -79,7 +79,12 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
|
||||
if (property != null) {
|
||||
val propertyName = property.name.asString()
|
||||
val propertyParent = property.parentAsClass
|
||||
if (propertyParent.isAnnotationClass || propertyParent.superTypes.any { it.isJavaLangRecord() }) return propertyName
|
||||
|
||||
if (propertyParent.isAnnotationClass) return propertyName
|
||||
|
||||
for (i in propertyParent.superTypes.indices) {
|
||||
if (propertyParent.superTypes[i].isJavaLangRecord()) return propertyName
|
||||
}
|
||||
|
||||
// The enum property getters <get-name> and <get-ordinal> have special names which also
|
||||
// apply to their fake overrides. Unfortunately, getJvmMethodNameIfSpecial does not handle
|
||||
@@ -248,8 +253,8 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
|
||||
|
||||
sw.writeParametersStart()
|
||||
|
||||
val contextReceivers = function.valueParameters.subList(0, function.contextReceiverParametersCount)
|
||||
for (contextReceiver in contextReceivers) {
|
||||
for (i in 0 until function.contextReceiverParametersCount) {
|
||||
val contextReceiver = function.valueParameters[i]
|
||||
writeParameter(sw, JvmMethodParameterKind.CONTEXT_RECEIVER, contextReceiver.type, function)
|
||||
}
|
||||
|
||||
@@ -258,9 +263,8 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
|
||||
writeParameter(sw, JvmMethodParameterKind.RECEIVER, receiverParameter.type, function)
|
||||
}
|
||||
|
||||
val regularValueParameters =
|
||||
function.valueParameters.subList(function.contextReceiverParametersCount, function.valueParameters.size)
|
||||
for (parameter in regularValueParameters) {
|
||||
for (i in function.contextReceiverParametersCount until function.valueParameters.size) {
|
||||
val parameter = function.valueParameters[i]
|
||||
val kind = when (parameter.origin) {
|
||||
JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS -> JvmMethodParameterKind.OUTER
|
||||
JvmLoweredDeclarationOrigin.ENUM_CONSTRUCTOR_SYNTHETIC_PARAMETER -> JvmMethodParameterKind.ENUM_NAME_OR_ORDINAL
|
||||
@@ -468,11 +472,10 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
|
||||
if (!isBuiltIn) return null
|
||||
return allOverridden(includeSelf = true)
|
||||
.filter { it.isBuiltIn }
|
||||
.mapNotNull {
|
||||
.firstNotNullOfOrNull {
|
||||
val signature = it.computeJvmSignature()
|
||||
SpecialGenericSignatures.SIGNATURE_TO_JVM_REPRESENTATION_NAME[signature]?.asString()
|
||||
}
|
||||
.firstOrNull()
|
||||
}
|
||||
|
||||
private fun IrSimpleFunction.getBuiltinSpecialPropertyGetterName(): String? {
|
||||
|
||||
Reference in New Issue
Block a user