JVM IR: minor optimizations in IrTypeMapper.classInternalName
Replace cubic complexity with square when computing internal name for nested classes by using StringBuilder instead of concatenating strings, and don't do getLocalClassType/classNameOverride checks on each step of the recursion.
This commit is contained in:
+38
-30
@@ -52,44 +52,52 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas
|
|||||||
error("Unknown descriptor: $classifier")
|
error("Unknown descriptor: $classifier")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun classInternalName(irClass: IrClass): String = getClassInternalName(irClass.symbol)
|
private fun computeClassInternalName(irClass: IrClass): StringBuilder {
|
||||||
|
val shortName = SpecialNames.safeIdentifier(irClass.name).identifier
|
||||||
|
|
||||||
override fun getClassInternalName(typeConstructor: TypeConstructorMarker): String {
|
when (val parent = irClass.parent) {
|
||||||
val irClass = (typeConstructor as IrClassSymbol).owner
|
is IrPackageFragment ->
|
||||||
fun report(): Nothing {
|
return StringBuilder().apply {
|
||||||
error(
|
val fqName = parent.fqName
|
||||||
"Local class should have its name computed in InventNamesForLocalClasses: ${irClass.fqNameWhenAvailable}\n" +
|
if (!fqName.isRoot) {
|
||||||
"Ensure that any lowering that transforms elements with local class info (classes, function references) " +
|
append(fqName.asString().replace('.', '/')).append("/")
|
||||||
"invokes `copyAttributes` on the transformed element."
|
}
|
||||||
)
|
append(shortName)
|
||||||
|
}
|
||||||
|
is IrClass ->
|
||||||
|
return computeClassInternalName(parent).append("$").append(shortName)
|
||||||
|
is IrFunction ->
|
||||||
|
if (parent.isSuspend && parent.parentAsClass.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS) {
|
||||||
|
return computeClassInternalName(parent.parentAsClass.parentAsClass)
|
||||||
|
.append("$").append(parent.name.asString())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.getLocalClassType(irClass)?.internalName?.let { return it }
|
val localClassType = context.getLocalClassType(irClass)
|
||||||
|
if (localClassType != null) {
|
||||||
|
return StringBuilder(localClassType.internalName)
|
||||||
|
}
|
||||||
|
|
||||||
|
error(
|
||||||
|
"Local class should have its name computed in InventNamesForLocalClasses: ${irClass.fqNameWhenAvailable}\n" +
|
||||||
|
"Ensure that any lowering that transforms elements with local class info (classes, function references) " +
|
||||||
|
"invokes `copyAttributes` on the transformed element."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun classInternalName(irClass: IrClass): String {
|
||||||
|
context.getLocalClassType(irClass)?.internalName?.let { return it }
|
||||||
context.classNameOverride[irClass]?.let { return it.internalName }
|
context.classNameOverride[irClass]?.let { return it.internalName }
|
||||||
|
|
||||||
val className = SpecialNames.safeIdentifier(irClass.name).identifier
|
return JvmCodegenUtil.sanitizeNameIfNeeded(
|
||||||
|
computeClassInternalName(irClass).toString(),
|
||||||
val internalName = when (val parent = irClass.parent) {
|
context.state.languageVersionSettings
|
||||||
is IrPackageFragment -> {
|
)
|
||||||
val fqName = parent.fqName
|
|
||||||
val prefix = if (fqName.isRoot) "" else fqName.asString().replace('.', '/') + "/"
|
|
||||||
prefix + className
|
|
||||||
}
|
|
||||||
is IrClass -> {
|
|
||||||
getClassInternalName(parent.symbol) + "$" + className
|
|
||||||
}
|
|
||||||
is IrFunction -> {
|
|
||||||
if (parent.isSuspend && parent.parentAsClass.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS) {
|
|
||||||
val interfaceClass = parent.parentAsClass.parent as IrClass
|
|
||||||
getClassInternalName(interfaceClass.symbol) + "$" + parent.name.asString()
|
|
||||||
} else report()
|
|
||||||
}
|
|
||||||
else -> report()
|
|
||||||
}
|
|
||||||
return JvmCodegenUtil.sanitizeNameIfNeeded(internalName, context.state.languageVersionSettings)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getClassInternalName(typeConstructor: TypeConstructorMarker): String =
|
||||||
|
classInternalName((typeConstructor as IrClassSymbol).owner)
|
||||||
|
|
||||||
fun writeFormalTypeParameters(irParameters: List<IrTypeParameter>, sw: JvmSignatureWriter) {
|
fun writeFormalTypeParameters(irParameters: List<IrTypeParameter>, sw: JvmSignatureWriter) {
|
||||||
if (sw.skipGenericSignature()) return
|
if (sw.skipGenericSignature()) return
|
||||||
with(KotlinTypeMapper) {
|
with(KotlinTypeMapper) {
|
||||||
|
|||||||
Reference in New Issue
Block a user