From 4c5eb9ac32dbcbbd057dceca4b5c45656a36ada7 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 25 Jan 2022 11:57:58 +0300 Subject: [PATCH] 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 --- .../kotlin/cli/metadata/CommonAnalysis.kt | 10 +++++++--- .../cli/metadata/K2MetadataKlibSerializer.kt | 14 ++++++-------- .../kotlin/cli/metadata/MetadataSerializer.kt | 4 +--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt index a2c2cc8a4f1..6fb772294da 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt @@ -25,7 +25,7 @@ internal val KotlinCoreEnvironment.destDir: File? internal fun runCommonAnalysisForSerialization( environment: KotlinCoreEnvironment, dependOnBuiltins: Boolean, - dependencyContainer: CommonDependenciesContainer? + dependencyContainerFactory: () -> CommonDependenciesContainer? ): AnalyzerWithCompilerReport? { if (environment.destDir == null) { val configuration = environment.configuration @@ -34,19 +34,23 @@ internal fun runCommonAnalysisForSerialization( return null } + val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) + var analyzer: AnalyzerWithCompilerReport do { - analyzer = runCommonAnalysis(environment, dependOnBuiltins, dependencyContainer) + performanceManager.notifyAnalysisStarted() + analyzer = runCommonAnalysisIteration(environment, dependOnBuiltins, dependencyContainerFactory()) val result = analyzer.analysisResult if (result is AnalysisResult.RetryWithAdditionalRoots) { environment.addKotlinSourceRoots(result.additionalKotlinRoots) } + performanceManager.notifyAnalysisFinished() } while (result is AnalysisResult.RetryWithAdditionalRoots) return if (analyzer.analysisResult.shouldGenerateCode) analyzer else null } -private fun runCommonAnalysis( +private fun runCommonAnalysisIteration( environment: KotlinCoreEnvironment, dependOnBuiltins: Boolean, dependencyContainer: CommonDependenciesContainer? diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt index c5742927008..78e93515d7d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt @@ -50,14 +50,12 @@ internal class K2MetadataKlibSerializer(private val metadataVersion: BuiltInsBin val configuration = environment.configuration val performanceManager = configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) - val dependencyContainer = KlibMetadataDependencyContainer( - configuration, - LockBasedStorageManager("K2MetadataKlibSerializer") - ) - - performanceManager.notifyAnalysisStarted() - val analyzer = runCommonAnalysisForSerialization(environment, true, dependencyContainer) - performanceManager.notifyAnalysisFinished() + val analyzer = runCommonAnalysisForSerialization(environment, true, dependencyContainerFactory = { + KlibMetadataDependencyContainer( + configuration, + LockBasedStorageManager("K2MetadataKlibSerializer") + ) + }) if (analyzer == null || analyzer.hasErrors()) return diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt index 391303e8523..abbf685ff3c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt @@ -42,9 +42,7 @@ open class MetadataSerializer( fun serialize(environment: KotlinCoreEnvironment) { val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) - performanceManager.notifyAnalysisStarted() - val analyzer = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainer = null) - performanceManager.notifyAnalysisFinished() + val analyzer = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainerFactory = { null }) if (analyzer == null || analyzer.hasErrors()) return