[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
This commit is contained in:
committed by
Space Team
parent
899e95ea04
commit
49a1dfa20e
+8
-4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user