KT-50889: Fix caching of module descriptors in K2MetadataKlibSerializer

Previously, in case of repeated analysis, descriptors cached in
CommonDependenciesContainer was initialized multiple times

 #KT-50889 Fixed
This commit is contained in:
Simon Ogorodnik
2022-01-25 11:57:58 +03:00
committed by Space
parent 794297eea3
commit 4c5eb9ac32
3 changed files with 14 additions and 14 deletions
@@ -25,7 +25,7 @@ internal val KotlinCoreEnvironment.destDir: File?
internal fun runCommonAnalysisForSerialization( internal fun runCommonAnalysisForSerialization(
environment: KotlinCoreEnvironment, environment: KotlinCoreEnvironment,
dependOnBuiltins: Boolean, dependOnBuiltins: Boolean,
dependencyContainer: CommonDependenciesContainer? dependencyContainerFactory: () -> CommonDependenciesContainer?
): AnalyzerWithCompilerReport? { ): AnalyzerWithCompilerReport? {
if (environment.destDir == null) { if (environment.destDir == null) {
val configuration = environment.configuration val configuration = environment.configuration
@@ -34,19 +34,23 @@ internal fun runCommonAnalysisForSerialization(
return null return null
} }
val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER)
var analyzer: AnalyzerWithCompilerReport var analyzer: AnalyzerWithCompilerReport
do { do {
analyzer = runCommonAnalysis(environment, dependOnBuiltins, dependencyContainer) performanceManager.notifyAnalysisStarted()
analyzer = runCommonAnalysisIteration(environment, dependOnBuiltins, dependencyContainerFactory())
val result = analyzer.analysisResult val result = analyzer.analysisResult
if (result is AnalysisResult.RetryWithAdditionalRoots) { if (result is AnalysisResult.RetryWithAdditionalRoots) {
environment.addKotlinSourceRoots(result.additionalKotlinRoots) environment.addKotlinSourceRoots(result.additionalKotlinRoots)
} }
performanceManager.notifyAnalysisFinished()
} while (result is AnalysisResult.RetryWithAdditionalRoots) } while (result is AnalysisResult.RetryWithAdditionalRoots)
return if (analyzer.analysisResult.shouldGenerateCode) analyzer else null return if (analyzer.analysisResult.shouldGenerateCode) analyzer else null
} }
private fun runCommonAnalysis( private fun runCommonAnalysisIteration(
environment: KotlinCoreEnvironment, environment: KotlinCoreEnvironment,
dependOnBuiltins: Boolean, dependOnBuiltins: Boolean,
dependencyContainer: CommonDependenciesContainer? dependencyContainer: CommonDependenciesContainer?
@@ -50,14 +50,12 @@ internal class K2MetadataKlibSerializer(private val metadataVersion: BuiltInsBin
val configuration = environment.configuration val configuration = environment.configuration
val performanceManager = configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) val performanceManager = configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER)
val dependencyContainer = KlibMetadataDependencyContainer( val analyzer = runCommonAnalysisForSerialization(environment, true, dependencyContainerFactory = {
configuration, KlibMetadataDependencyContainer(
LockBasedStorageManager("K2MetadataKlibSerializer") configuration,
) LockBasedStorageManager("K2MetadataKlibSerializer")
)
performanceManager.notifyAnalysisStarted() })
val analyzer = runCommonAnalysisForSerialization(environment, true, dependencyContainer)
performanceManager.notifyAnalysisFinished()
if (analyzer == null || analyzer.hasErrors()) return if (analyzer == null || analyzer.hasErrors()) return
@@ -42,9 +42,7 @@ open class MetadataSerializer(
fun serialize(environment: KotlinCoreEnvironment) { fun serialize(environment: KotlinCoreEnvironment) {
val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER)
performanceManager.notifyAnalysisStarted() val analyzer = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainerFactory = { null })
val analyzer = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainer = null)
performanceManager.notifyAnalysisFinished()
if (analyzer == null || analyzer.hasErrors()) return if (analyzer == null || analyzer.hasErrors()) return