JVM_IR: reorganize initialization of JvmGeneratorExtensionsImpl
CachedFields are now created at initialization. Therefore we need CompilerConfiguration as a constructor parameter.
This commit is contained in:
committed by
TeamCityServer
parent
7bbc04b6a2
commit
20b76d4149
+1
-4
@@ -306,10 +306,7 @@ object KotlinToJVMBytecodeCompiler {
|
||||
)
|
||||
.codegenFactory(
|
||||
if (configuration.getBoolean(JVMConfigurationKeys.IR)) JvmIrCodegenFactory(
|
||||
configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases),
|
||||
jvmGeneratorExtensions = JvmGeneratorExtensionsImpl(
|
||||
irDeserializationEnabled = configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR)
|
||||
)
|
||||
configuration, configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases)
|
||||
) else DefaultCodegenFactory
|
||||
)
|
||||
.withModule(module)
|
||||
|
||||
+8
-17
@@ -11,7 +11,9 @@ import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSe
|
||||
import org.jetbrains.kotlin.backend.jvm.lower.SingletonObjectJvmStaticTransformer
|
||||
import org.jetbrains.kotlin.backend.jvm.serialization.deserializeClassFromByteArray
|
||||
import org.jetbrains.kotlin.backend.jvm.serialization.deserializeIrFileFromByteArray
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
@@ -28,7 +30,6 @@ import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.DescriptorlessExternalPackageFragmentSymbol
|
||||
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
|
||||
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
|
||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||
import org.jetbrains.kotlin.ir.util.constructors
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
@@ -60,11 +61,15 @@ import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations
|
||||
|
||||
open class JvmGeneratorExtensionsImpl(
|
||||
configuration: CompilerConfiguration,
|
||||
private val generateFacades: Boolean = true,
|
||||
override val irDeserializationEnabled: Boolean = false,
|
||||
) : GeneratorExtensions(), JvmGeneratorExtensions {
|
||||
override val classNameOverride: MutableMap<IrClass, JvmClassName> = mutableMapOf()
|
||||
|
||||
override val irDeserializationEnabled: Boolean = configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR)
|
||||
|
||||
override val cachedFields = CachedFieldsForObjectInstances(IrFactoryImpl, configuration.languageVersionSettings)
|
||||
|
||||
override val samConversion: SamConversion
|
||||
get() = JvmSamConversion
|
||||
|
||||
@@ -106,18 +111,6 @@ open class JvmGeneratorExtensionsImpl(
|
||||
}
|
||||
}
|
||||
|
||||
@Volatile
|
||||
private var cachedFields: CachedFieldsForObjectInstances? = null
|
||||
|
||||
override fun getCachedFields(irFactory: IrFactory, languageVersionSettings: LanguageVersionSettings): CachedFieldsForObjectInstances {
|
||||
cachedFields?.let { return it }
|
||||
synchronized(this) {
|
||||
cachedFields?.let { return it }
|
||||
cachedFields = CachedFieldsForObjectInstances(irFactory, languageVersionSettings)
|
||||
return cachedFields!!
|
||||
}
|
||||
}
|
||||
|
||||
override fun deserializeLazyClass(
|
||||
irClass: IrLazyClass,
|
||||
stubGenerator: DeclarationStubGenerator,
|
||||
@@ -126,7 +119,6 @@ open class JvmGeneratorExtensionsImpl(
|
||||
): Boolean {
|
||||
val serializedIr = (irClass.source as? KotlinJvmBinarySourceElement)?.binaryClass?.classHeader?.serializedIr ?: return false
|
||||
deserializeClassFromByteArray(serializedIr, stubGenerator, irClass, allowErrorNodes)
|
||||
val cachedFields = getCachedFields(stubGenerator.irBuiltIns.irFactory, stubGenerator.irBuiltIns.languageVersionSettings)
|
||||
irClass.transform(SingletonObjectJvmStaticTransformer(stubGenerator.irBuiltIns, cachedFields), null)
|
||||
return true
|
||||
}
|
||||
@@ -139,7 +131,6 @@ open class JvmGeneratorExtensionsImpl(
|
||||
): Boolean {
|
||||
val serializedIr = (irClass.source as? JvmPackagePartSource)?.knownJvmBinaryClass?.classHeader?.serializedIr ?: return false
|
||||
deserializeIrFileFromByteArray(serializedIr, stubGenerator, irClass, allowErrorNodes)
|
||||
val cachedFields = getCachedFields(stubGenerator.irBuiltIns.irFactory, stubGenerator.irBuiltIns.languageVersionSettings)
|
||||
irClass.transform(SingletonObjectJvmStaticTransformer(stubGenerator.irBuiltIns, cachedFields), null)
|
||||
return true
|
||||
}
|
||||
|
||||
+3
-1
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.getKtFile
|
||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||
import org.jetbrains.kotlin.codegen.CodegenFactory
|
||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
|
||||
@@ -39,10 +40,11 @@ import org.jetbrains.kotlin.psi2ir.preprocessing.SourceDeclarationsPreprocessor
|
||||
import org.jetbrains.kotlin.resolve.CleanableBindingContext
|
||||
|
||||
open class JvmIrCodegenFactory(
|
||||
configuration: CompilerConfiguration,
|
||||
private val phaseConfig: PhaseConfig,
|
||||
private val externalMangler: JvmDescriptorMangler? = null,
|
||||
private val externalSymbolTable: SymbolTable? = null,
|
||||
private val jvmGeneratorExtensions: JvmGeneratorExtensionsImpl = JvmGeneratorExtensionsImpl()
|
||||
private val jvmGeneratorExtensions: JvmGeneratorExtensionsImpl = JvmGeneratorExtensionsImpl(configuration),
|
||||
) : CodegenFactory {
|
||||
data class JvmIrBackendInput(
|
||||
val state: GenerationState,
|
||||
|
||||
@@ -67,7 +67,7 @@ class JvmBackendContext(
|
||||
|
||||
internal val innerClassesSupport = JvmInnerClassesSupport(irFactory)
|
||||
internal val cachedDeclarations = JvmCachedDeclarations(
|
||||
this, generatorExtensions.getCachedFields(irFactory, state.languageVersionSettings)
|
||||
this, generatorExtensions.cachedFields
|
||||
)
|
||||
|
||||
override val mapping: Mapping = DefaultMapping()
|
||||
|
||||
+1
-1
@@ -16,5 +16,5 @@ interface JvmGeneratorExtensions {
|
||||
|
||||
val rawTypeAnnotationConstructor: IrConstructor?
|
||||
|
||||
fun getCachedFields(irFactory: IrFactory, languageVersionSettings: LanguageVersionSettings): CachedFieldsForObjectInstances
|
||||
val cachedFields: CachedFieldsForObjectInstances
|
||||
}
|
||||
|
||||
+1
-6
@@ -6,13 +6,11 @@
|
||||
package org.jetbrains.kotlin.test.frontend.classic
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||
import org.jetbrains.kotlin.backend.jvm.jvmPhases
|
||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||
import org.jetbrains.kotlin.codegen.ClassBuilderFactories
|
||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
|
||||
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
|
||||
import org.jetbrains.kotlin.test.model.BackendKinds
|
||||
@@ -39,10 +37,7 @@ class ClassicFrontend2IrConverter(
|
||||
|
||||
val files = psiFiles.values.toList()
|
||||
val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases)
|
||||
val codegenFactory = JvmIrCodegenFactory(
|
||||
phaseConfig,
|
||||
jvmGeneratorExtensions = JvmGeneratorExtensionsImpl(irDeserializationEnabled = configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR))
|
||||
)
|
||||
val codegenFactory = JvmIrCodegenFactory(configuration, phaseConfig)
|
||||
val state = GenerationState.Builder(
|
||||
project, ClassBuilderFactories.TEST, analysisResult.moduleDescriptor, analysisResult.bindingContext,
|
||||
files, configuration
|
||||
|
||||
+5
-5
@@ -41,15 +41,15 @@ class Fir2IrResultsConverter(
|
||||
module: TestModule,
|
||||
inputArtifact: FirOutputArtifact
|
||||
): IrBackendInput {
|
||||
val extensions = JvmGeneratorExtensionsImpl()
|
||||
val compilerConfigurationProvider = testServices.compilerConfigurationProvider
|
||||
val configuration = compilerConfigurationProvider.getCompilerConfiguration(module)
|
||||
val extensions = JvmGeneratorExtensionsImpl(configuration)
|
||||
|
||||
val (irModuleFragment, symbolTable, components) = inputArtifact.firAnalyzerFacade.convertToIr(extensions)
|
||||
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
|
||||
|
||||
val compilerConfigurationProvider = testServices.compilerConfigurationProvider
|
||||
val configuration = compilerConfigurationProvider.getCompilerConfiguration(module)
|
||||
|
||||
val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases)
|
||||
val codegenFactory = JvmIrCodegenFactory(phaseConfig)
|
||||
val codegenFactory = JvmIrCodegenFactory(configuration, phaseConfig, jvmGeneratorExtensions = extensions)
|
||||
|
||||
// TODO: handle fir from light tree
|
||||
val ktFiles = inputArtifact.firFiles.values.mapNotNull { it.psi as KtFile? }
|
||||
|
||||
@@ -141,7 +141,7 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
|
||||
): IrModuleFragment {
|
||||
return generateIrModule(
|
||||
JvmResolveUtil.analyze(ktFilesToAnalyze, environment), psi2ir, ktFilesToAnalyze,
|
||||
JvmGeneratorExtensionsImpl(generateFacades = false),
|
||||
JvmGeneratorExtensionsImpl(environment.configuration, generateFacades = false),
|
||||
createIdSignatureComposer = { bindingContext ->
|
||||
JvmIdSignatureDescriptor(JvmDescriptorMangler(MainFunctionDetector(bindingContext, languageVersionSettings)))
|
||||
}
|
||||
|
||||
+10
-3
@@ -113,11 +113,15 @@ object GenerationUtils {
|
||||
|
||||
// TODO: add running checkers and check that it's safe to compile
|
||||
val firAnalyzerFacade = FirAnalyzerFacade(session, configuration.languageVersionSettings, files)
|
||||
val extensions = JvmGeneratorExtensionsImpl()
|
||||
val extensions = JvmGeneratorExtensionsImpl(configuration)
|
||||
val (moduleFragment, symbolTable, components) = firAnalyzerFacade.convertToIr(extensions)
|
||||
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
|
||||
|
||||
val codegenFactory = JvmIrCodegenFactory(configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases))
|
||||
val codegenFactory = JvmIrCodegenFactory(
|
||||
configuration,
|
||||
configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases),
|
||||
jvmGeneratorExtensions = extensions
|
||||
)
|
||||
|
||||
// Create and initialize the test module and its dependencies
|
||||
val container = TopDownAnalyzerFacadeForJVM.createContainer(
|
||||
@@ -194,7 +198,10 @@ object GenerationUtils {
|
||||
files, configuration
|
||||
).codegenFactory(
|
||||
if (isIrBackend)
|
||||
JvmIrCodegenFactory(configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases))
|
||||
JvmIrCodegenFactory(
|
||||
configuration,
|
||||
configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases),
|
||||
)
|
||||
else DefaultCodegenFactory
|
||||
).isIrBackend(isIrBackend).apply(configureGenerationState).build()
|
||||
if (analysisResult.shouldGenerateCode) {
|
||||
|
||||
@@ -330,7 +330,7 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW
|
||||
.generateDeclaredClassFilter(generateClassFilter)
|
||||
.codegenFactory(
|
||||
if (configuration.getBoolean(JVMConfigurationKeys.IR))
|
||||
JvmIrCodegenFactory(PhaseConfig(jvmPhases))
|
||||
JvmIrCodegenFactory(configuration, PhaseConfig(jvmPhases))
|
||||
else
|
||||
DefaultCodegenFactory
|
||||
)
|
||||
|
||||
+2
-1
@@ -198,10 +198,11 @@ open class KJvmReplCompilerBase<AnalyzerT : ReplCodeAnalyzerBase> protected cons
|
||||
snippetKtFile: KtFile,
|
||||
sourceFiles: List<KtFile>
|
||||
): GenerationState {
|
||||
val generatorExtensions = object : JvmGeneratorExtensionsImpl() {
|
||||
val generatorExtensions = object : JvmGeneratorExtensionsImpl(compilationState.environment.configuration) {
|
||||
override fun getPreviousScripts() = history.map { compilationState.symbolTable.referenceScript(it.item) }
|
||||
}
|
||||
val codegenFactory = JvmIrCodegenFactory(
|
||||
compilationState.environment.configuration,
|
||||
compilationState.environment.configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases),
|
||||
compilationState.mangler, compilationState.symbolTable, generatorExtensions
|
||||
)
|
||||
|
||||
+2
-1
@@ -238,7 +238,8 @@ private fun generate(
|
||||
).codegenFactory(
|
||||
if (kotlinCompilerConfiguration.getBoolean(JVMConfigurationKeys.IR))
|
||||
JvmIrCodegenFactory(
|
||||
kotlinCompilerConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases)
|
||||
kotlinCompilerConfiguration,
|
||||
kotlinCompilerConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases),
|
||||
) else DefaultCodegenFactory
|
||||
).build().also {
|
||||
KotlinCodegenFacade.compileCorrectFiles(it)
|
||||
|
||||
Reference in New Issue
Block a user