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