From 49a1dfa20ecb66783e738a1d337827873b416dca Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 12 Jul 2023 10:56:07 +0300 Subject: [PATCH] [IR] Don't create packageFragment in IR builtins if not needed In REPL it's possible that builtins will be created several times with the same symbol table. And since IrBuiltinsPackageFragmentDescriptorImpl has overridden equals, symbol for external package will be the same for different descriptors (with same FQN). So we should create IrExternalPackageFragment here only if it was not created before, on previous compilation --- .../psi2ir/descriptors/IrBuiltInsOverDescriptors.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt index ba5d832cb60..013d08dd443 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt @@ -82,11 +82,15 @@ class IrBuiltInsOverDescriptors( private val kotlinInternalIrPackage = IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(builtInsModule, kotlinInternalPackage) private val packageFragmentDescriptor = IrBuiltinsPackageFragmentDescriptorImpl(builtInsModule, KOTLIN_INTERNAL_IR_FQN) + + /* + * In REPL it's possible that builtins will be created several times with the same symbol table + * And since IrBuiltinsPackageFragmentDescriptorImpl has overridden equals, symbol for external package + * will be the same for different descriptors (with same FQN). So we should create IrExternalPackageFragment + * here only if it was not created before, on previous compilation + */ override val operatorsPackageFragment: IrExternalPackageFragment = - IrExternalPackageFragmentImpl( - symbolTable.descriptorExtension.referenceExternalPackageFragment(packageFragmentDescriptor), - KOTLIN_INTERNAL_IR_FQN - ) + symbolTable.descriptorExtension.declareExternalPackageFragmentIfNotExists(packageFragmentDescriptor) private fun ClassDescriptor.toIrSymbol(): IrClassSymbol { return symbolTable.descriptorExtension.referenceClass(this)