IR: only worry about threads in JvmIrSignatureDescriptor

General IdSignatureDescriptor is used from other backends, which have no
multi-threaded backend for now and do not need to carry the associated
runtime costs.

So IdSignatureDescriptor keeps the thread-unsafe caching of signature
builder.
This commit is contained in:
Georgy Bronnikov
2021-02-13 13:54:04 +03:00
parent cacfe53065
commit db18ffc764
3 changed files with 21 additions and 3 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.analysis
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector
@@ -83,7 +84,7 @@ class FirAnalyzerFacade(
fun convertToIr(extensions: GeneratorExtensions): Fir2IrResult {
if (scopeSession == null) runResolution()
val signaturer = IdSignatureDescriptor(JvmManglerDesc())
val signaturer = JvmIdSignatureDescriptor(JvmManglerDesc())
return Fir2IrConverter.createModuleFragment(
session, scopeSession!!, firFiles!!,
@@ -105,15 +105,17 @@ open class IdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMa
reportUnexpectedDescriptor(descriptor)
}
private val composer by lazy { createSignatureBuilder() }
override fun composeSignature(descriptor: DeclarationDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExported() }) {
createSignatureBuilder().buildSignature(descriptor)
composer.buildSignature(descriptor)
} else null
}
override fun composeEnumEntrySignature(descriptor: ClassDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExportEnumEntry() }) {
createSignatureBuilder().buildSignature(descriptor)
composer.buildSignature(descriptor)
} else null
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.serialization
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
@@ -95,4 +96,18 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang
}
override fun createSignatureBuilder(): DescriptorBasedSignatureBuilder = JvmDescriptorBasedSignatureBuilder(mangler)
/* In multi-threaded environment, we cannot afford to cache a signature builder, as in IdSignatureBuilder. */
override fun composeSignature(descriptor: DeclarationDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExported() }) {
createSignatureBuilder().buildSignature(descriptor)
} else null
}
override fun composeEnumEntrySignature(descriptor: ClassDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExportEnumEntry() }) {
createSignatureBuilder().buildSignature(descriptor)
} else null
}
}