From 8f34b6599a404e2283ab217b1598cbf859884aa1 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 8 Feb 2023 20:09:21 +0100 Subject: [PATCH] [AA FIR] BuilderCache: replace regular map with concurrent to avoid exceptions Example: ```stacktrace Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 32 out of bounds for length 17 at com.intellij.util.containers.RefHashMap$MyMap.rehash(RefHashMap.java:85) at it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap.insert(Object2ObjectOpenHashMap.java:251) at it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap.put(Object2ObjectOpenHashMap.java:259) at com.intellij.util.containers.RefHashMap.putKey(RefHashMap.java:160) at com.intellij.util.containers.RefKeyRefValueHashMap.put(RefKeyRefValueHashMap.java:55) at org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder$FunctionLikeSymbolBuilder.buildFunctionSymbol(KtSymbolByFirBuilder.kt:727) at org.jetbrains.kotlin.analysis.api.fir.scopes.FirScopeUtilsKt$getCallableSymbols$1$1$1$1.invoke(firScopeUtils.kt:25) at org.jetbrains.kotlin.analysis.api.fir.scopes.FirScopeUtilsKt$getCallableSymbols$1$1$1$1.invoke(firScopeUtils.kt:24) at org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeImpl.processFunctionsByName(FirClassDeclaredMemberScope.kt:103) ``` ^KTIJ-22749 --- .../jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index 461198a9e0b..d4bce5defdc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -608,7 +608,7 @@ internal class KtSymbolByFirBuilder constructor( private class BuilderCache { - private val cache = ContainerUtil.createWeakKeySoftValueMap() + private val cache = ContainerUtil.createConcurrentWeakKeySoftValueMap() inline fun cache(key: From, calculation: () -> S): S { val value = cache.getOrPut(key, calculation)