IR: use threadLocal

This commit is contained in:
Georgy Bronnikov
2021-01-14 22:39:27 +03:00
parent 56a26113cd
commit c9d0448fd1
4 changed files with 21 additions and 11 deletions
@@ -59,7 +59,7 @@ class DeclarationStubGenerator(
lazyTable,
languageVersionSettings,
moduleDescriptor.builtIns,
LazyScopedTypeParametersResolver(lazyTable),
{ LazyScopedTypeParametersResolver(lazyTable) },
true,
extensions
)
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.utils.threadLocal
interface ReferenceSymbolTable {
fun referenceClass(descriptor: ClassDescriptor): IrClassSymbol
@@ -327,13 +328,21 @@ class SymbolTable(
private val typeAliasSymbolTable = FlatSymbolTable<TypeAliasDescriptor, IrTypeAlias, IrTypeAliasSymbol>()
private val globalTypeParameterSymbolTable = FlatSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
private val scopedTypeParameterSymbolTable = ScopedSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
private val valueParameterSymbolTable = ScopedSymbolTable<ParameterDescriptor, IrValueParameter, IrValueParameterSymbol>()
private val variableSymbolTable = ScopedSymbolTable<VariableDescriptor, IrVariable, IrVariableSymbol>()
private val localDelegatedPropertySymbolTable =
private val scopedTypeParameterSymbolTable by threadLocal {
ScopedSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
}
private val valueParameterSymbolTable by threadLocal {
ScopedSymbolTable<ParameterDescriptor, IrValueParameter, IrValueParameterSymbol>()
}
private val variableSymbolTable by threadLocal {
ScopedSymbolTable<VariableDescriptor, IrVariable, IrVariableSymbol>()
}
private val localDelegatedPropertySymbolTable by threadLocal {
ScopedSymbolTable<VariableDescriptorWithAccessors, IrLocalDelegatedProperty, IrLocalDelegatedPropertySymbol>()
private val scopedSymbolTables =
}
private val scopedSymbolTables by threadLocal {
listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable, localDelegatedPropertySymbolTable)
}
fun referenceExternalPackageFragment(descriptor: PackageFragmentDescriptor) =
externalPackageFragmentTable.referenced(descriptor) { IrExternalPackageFragmentSymbolImpl(descriptor) }
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.types.impl.*
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
import org.jetbrains.kotlin.types.typesApproximation.approximateCapturedTypes
import org.jetbrains.kotlin.utils.threadLocal
import java.util.*
@OptIn(ObsoleteDescriptorBasedAPI::class)
@@ -30,11 +31,13 @@ class TypeTranslator(
private val symbolTable: ReferenceSymbolTable,
val languageVersionSettings: LanguageVersionSettings,
builtIns: KotlinBuiltIns,
private val typeParametersResolver: TypeParametersResolver = ScopedTypeParametersResolver(),
typeParametersResolverBuilder: () -> TypeParametersResolver = { ScopedTypeParametersResolver() },
private val enterTableScope: Boolean = false,
private val extensions: StubGeneratorExtensions = StubGeneratorExtensions.EMPTY
) {
private val typeParametersResolver by threadLocal { typeParametersResolverBuilder() }
private val erasureStack = Stack<PropertyDescriptor>()
private val typeApproximatorForNI = TypeApproximator(builtIns)
@@ -105,17 +105,15 @@ open class IdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMa
reportUnexpectedDescriptor(descriptor)
}
private val composer by lazy { createSignatureBuilder() }
override fun composeSignature(descriptor: DeclarationDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExported() }) {
composer.buildSignature(descriptor)
createSignatureBuilder().buildSignature(descriptor)
} else null
}
override fun composeEnumEntrySignature(descriptor: ClassDescriptor): IdSignature? {
return if (mangler.run { descriptor.isExportEnumEntry() }) {
composer.buildSignature(descriptor)
createSignatureBuilder().buildSignature(descriptor)
} else null
}
}