diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Mappings.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Mappings.kt index 0823832b910..eae0583d05f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Mappings.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Mappings.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.ir.declarations.* +import java.util.concurrent.ConcurrentHashMap import kotlin.reflect.KMutableProperty0 import kotlin.reflect.KProperty @@ -47,7 +48,7 @@ open class DefaultMapping : Mapping { override val reflectedNameAccessor: Mapping.Delegate = newMapping() protected open fun newMapping() = object : Mapping.Delegate() { - private val map: MutableMap = mutableMapOf() + private val map: MutableMap = ConcurrentHashMap() override operator fun get(key: K): V? { return map[key] 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 420c40dd8e1..a6fc57809b4 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 @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.psi2ir.PsiErrorBuilder import org.jetbrains.kotlin.psi2ir.PsiSourceManager import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.org.objectweb.asm.Type +import java.util.concurrent.ConcurrentHashMap class JvmBackendContext( val state: GenerationState, @@ -55,7 +56,7 @@ class JvmBackendContext( val classNameOverride: MutableMap get() = generatorExtensions.classNameOverride - override val extractedLocalClasses: MutableSet = hashSetOf() + override val extractedLocalClasses: MutableSet = ConcurrentHashMap.newKeySet() override val irFactory: IrFactory = IrFactoryImpl @@ -78,7 +79,7 @@ class JvmBackendContext( val irIntrinsics by lazy { IrIntrinsicMethods(irBuiltIns, ir.symbols) } - private val localClassType = mutableMapOf() + private val localClassType = ConcurrentHashMap() internal fun getLocalClassType(container: IrAttributeContainer): Type? = localClassType[container.attributeOwnerId] @@ -87,18 +88,18 @@ class JvmBackendContext( localClassType[container.attributeOwnerId] = value } - internal val isEnclosedInConstructor = mutableSetOf() + internal val isEnclosedInConstructor = ConcurrentHashMap.newKeySet() internal val classCodegens = mutableMapOf() - val localDelegatedProperties = mutableMapOf>() + val localDelegatedProperties = ConcurrentHashMap>() internal val multifileFacadesToAdd = mutableMapOf>() val multifileFacadeForPart = mutableMapOf() internal val multifileFacadeClassForPart = mutableMapOf() internal val multifileFacadeMemberToPartMember = mutableMapOf() - internal val hiddenConstructors = mutableMapOf() + internal val hiddenConstructors = ConcurrentHashMap() internal val collectionStubComputer = CollectionStubComputer(this) @@ -112,19 +113,19 @@ class JvmBackendContext( overridesWithoutStubs.getOrElse(function) { function.overriddenSymbols } internal val bridgeLoweringCache = BridgeLowering.BridgeLoweringCache(this) - internal val functionsWithSpecialBridges: MutableSet = HashSet() + internal val functionsWithSpecialBridges: MutableSet = ConcurrentHashMap.newKeySet() - override var inVerbosePhase: Boolean = false + override var inVerbosePhase: Boolean = false // TODO: needs parallelizing override val configuration get() = state.configuration override val internalPackageFqn = FqName("kotlin.jvm") - val suspendLambdaToOriginalFunctionMap = mutableMapOf() - val suspendFunctionOriginalToView = mutableMapOf() + val suspendLambdaToOriginalFunctionMap = ConcurrentHashMap() + val suspendFunctionOriginalToView = ConcurrentHashMap() val fakeContinuation: IrExpression = createFakeContinuation(this) - val staticDefaultStubs = mutableMapOf() + val staticDefaultStubs = ConcurrentHashMap() val inlineClassReplacements = MemoizedInlineClassReplacements(state.functionsWithInlineClassReturnTypesMangled, irFactory, this) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt index 5b6c9931e6f..8058b1f6813 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt @@ -30,19 +30,20 @@ import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver +import java.util.concurrent.ConcurrentHashMap class JvmCachedDeclarations( private val context: JvmBackendContext, private val languageVersionSettings: LanguageVersionSettings ) { - private val singletonFieldDeclarations = HashMap() - private val interfaceCompanionFieldDeclarations = HashMap() - private val staticBackingFields = HashMap() + private val singletonFieldDeclarations = ConcurrentHashMap() + private val interfaceCompanionFieldDeclarations = ConcurrentHashMap() + private val staticBackingFields = ConcurrentHashMap() - private val defaultImplsMethods = HashMap() - private val defaultImplsClasses = HashMap() - private val defaultImplsRedirections = HashMap() - private val defaultImplsOriginalMethods = HashMap() + private val defaultImplsMethods = ConcurrentHashMap() + private val defaultImplsClasses = ConcurrentHashMap() + private val defaultImplsRedirections = ConcurrentHashMap() + private val defaultImplsOriginalMethods = ConcurrentHashMap() fun getFieldForEnumEntry(enumEntry: IrEnumEntry): IrField = singletonFieldDeclarations.getOrPut(enumEntry) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index 09fb473e718..bc16a88365f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -124,7 +124,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { private fun IrSimpleFunction.isInvisibleInMultifilePart(): Boolean = name.asString() != "" && - (parent as? IrClass)?.attributeOwnerId in context.multifileFacadeForPart && + (parent as? IrClass)?.attributeOwnerId in context.multifileFacadeForPart.keys && (DescriptorVisibilities.isPrivate(suspendFunctionOriginal().visibility) || originalForDefaultAdapter?.isInvisibleInMultifilePart() == true) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index ccbb511e39d..07f17809ae1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method +import java.util.concurrent.ConcurrentHashMap /* * Generate bridge methods to fix virtual dispatch after type erasure and to adapt Kotlin collections to @@ -595,7 +596,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass // It might benefit performance, but can lead to confusing behavior if some declarations are changed along the way. // For example, adding an override for a declaration whose signature is already cached can result in incorrect signature // if its return type is a primitive type, and the new override's return type is an object type. - private val signatureCache = hashMapOf() + private val signatureCache = ConcurrentHashMap() fun computeJvmMethod(function: IrFunction): Method = signatureCache.getOrPut(function.symbol) { context.methodSignatureMapper.mapAsmMethod(function) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt index 2dbd3e9f69e..c80dd401a2d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.utils.addToStdlib.cast +import java.util.concurrent.ConcurrentHashMap internal val collectionStubMethodLowering = makeIrFilePhase( ::CollectionStubMethodLowering, @@ -469,7 +470,7 @@ internal class CollectionStubComputer(val context: JvmBackendContext) { } } - private val stubsCache = mutableMapOf>() + private val stubsCache = ConcurrentHashMap>() fun stubsForCollectionClasses(irClass: IrClass): List = stubsCache.getOrPut(irClass) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInnerClassesSupport.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInnerClassesSupport.kt index 75467772513..9a45c70db44 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInnerClassesSupport.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInnerClassesSupport.kt @@ -23,11 +23,12 @@ import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.name.Name +import java.util.concurrent.ConcurrentHashMap class JvmInnerClassesSupport(private val irFactory: IrFactory) : InnerClassesSupport { - private val outerThisDeclarations = HashMap() - private val innerClassConstructors = HashMap() - private val originalInnerClassPrimaryConstructorByClass = HashMap() + private val outerThisDeclarations = ConcurrentHashMap() + private val innerClassConstructors = ConcurrentHashMap() + private val originalInnerClassPrimaryConstructorByClass = ConcurrentHashMap() override fun getOuterThisField(innerClass: IrClass): IrField = outerThisDeclarations.getOrPut(innerClass) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index bccad36e16c..7077b5aa87e 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -217,7 +217,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle private val IrConstructor.isOrShouldBeHidden: Boolean get() { - if (this in context.hiddenConstructors) + if (this in context.hiddenConstructors.keys) return true if (origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt index 5f85b89f619..1fe8815e2bf 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import java.util.concurrent.ConcurrentHashMap /** * Keeps track of replacement functions and inline class box/unbox functions. @@ -45,9 +46,9 @@ class MemoizedInlineClassReplacements( private val context: JvmBackendContext ) { private val storageManager = LockBasedStorageManager("inline-class-replacements") - private val propertyMap = mutableMapOf() + private val propertyMap = ConcurrentHashMap() - internal val originalFunctionForStaticReplacement: MutableMap = HashMap() + internal val originalFunctionForStaticReplacement: MutableMap = ConcurrentHashMap() /** * Get a replacement for a function or a constructor.