From 4a0f683beaf9076e4ec740fbbca1697275d5cc73 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 2 Dec 2019 18:32:20 +0300 Subject: [PATCH] JVM_IR: repair after switching Ir.Symbols to non-lazy table Symbols referenced from Jvm>Ir.Symbols stayed unbound, hence I have to run ExternalDeopendenciesGenerator a second time after creating JvmBackendContext :( --- .../kotlin/backend/jvm/JvmBackendContext.kt | 11 +++++------ .../jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt | 12 ++++++++---- .../kotlin/backend/jvm/JvmIrCodegenFactory.kt | 4 +++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index e66e62a6232..139c27dd1c4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -66,7 +65,7 @@ class JvmBackendContext( override val ir = JvmIr(irModuleFragment, this.symbolTable) - val irIntrinsics = IrIntrinsicMethods(irBuiltIns, ir.symbols) + val irIntrinsics by lazy { IrIntrinsicMethods(irBuiltIns, ir.symbols) } private val localClassType = mutableMapOf() @@ -115,16 +114,16 @@ class JvmBackendContext( } internal fun referenceClass(descriptor: ClassDescriptor): IrClassSymbol = - symbolTable.referenceClass(descriptor) + symbolTable.lazyWrapper.referenceClass(descriptor) internal fun referenceTypeParameter(descriptor: TypeParameterDescriptor): IrTypeParameterSymbol = - symbolTable.referenceTypeParameter(descriptor) + symbolTable.lazyWrapper.referenceTypeParameter(descriptor) internal fun referenceFunction(descriptor: FunctionDescriptor): IrFunctionSymbol = if (descriptor is ClassConstructorDescriptor) - symbolTable.referenceConstructor(descriptor) + symbolTable.lazyWrapper.referenceConstructor(descriptor) else - symbolTable.referenceSimpleFunction(descriptor) + symbolTable.lazyWrapper.referenceSimpleFunction(descriptor) override fun log(message: () -> String) { /*TODO*/ diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt index 2c607fba278..1544bd1a1e1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -16,9 +16,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.types.defaultType -import org.jetbrains.kotlin.ir.util.SymbolTable -import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList -import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator import org.jetbrains.kotlin.psi2ir.PsiSourceManager @@ -50,7 +48,9 @@ object JvmBackendFacade { extensions = extensions ) val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, irProviders = irProviders) - doGenerateFilesInternal(state, irModuleFragment, psi2irContext.symbolTable, psi2irContext.sourceManager, phaseConfig, extensions) + doGenerateFilesInternal( + state, irModuleFragment, psi2irContext.symbolTable, psi2irContext.sourceManager, phaseConfig, irProviders, extensions + ) } internal fun doGenerateFilesInternal( @@ -59,11 +59,15 @@ object JvmBackendFacade { symbolTable: SymbolTable, sourceManager: PsiSourceManager, phaseConfig: PhaseConfig, + irProviders: List, extensions: JvmGeneratorExtensions ) { val context = JvmBackendContext( state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride ) + /* JvmBackendContext creates new unbound symbols, have to resolve them. */ + ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() + state.irBasedMapAsmMethod = { descriptor -> context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index 5e5e1c8a78b..d0ae37ac7f0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -45,7 +45,9 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = extensions ) ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() - JvmBackendFacade.doGenerateFilesInternal(state, irModuleFragment, symbolTable, sourceManager, phaseConfig, extensions) + JvmBackendFacade.doGenerateFilesInternal( + state, irModuleFragment, symbolTable, sourceManager, phaseConfig, irProviders, extensions + ) } override fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName): PackageCodegen {