Skip to content

Commit 11d875c

Browse files
committed
Fix deadlock in StaticScopeForKotlinEnum
Also fix possible deadlock in ReflectionTypes #KT-11869 Fixed
1 parent a8629b3 commit 11d875c

File tree

4 files changed

+13
-9
lines changed

4 files changed

+13
-9
lines changed

compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,11 @@ public LazyClassDescriptor(
124124

125125
this.declarationProvider = c.getDeclarationProviderFactory().getClassMemberDeclarationProvider(classLikeInfo);
126126

127+
StorageManager storageManager = c.getStorageManager();
128+
127129
this.unsubstitutedMemberScope = createMemberScope(c, this.declarationProvider);
128130
this.kind = classLikeInfo.getClassKind();
129-
this.staticScope = kind == ClassKind.ENUM_CLASS ? new StaticScopeForKotlinEnum(this) : MemberScope.Empty.INSTANCE;
131+
this.staticScope = kind == ClassKind.ENUM_CLASS ? new StaticScopeForKotlinEnum(storageManager, this) : MemberScope.Empty.INSTANCE;
130132

131133
this.typeConstructor = new LazyClassTypeConstructor();
132134

@@ -154,8 +156,6 @@ public LazyClassDescriptor(
154156
this.isInner = isInnerClass(modifierList) && !ModifiersChecker.isIllegalInner(this);
155157
this.isData = modifierList != null && modifierList.hasModifier(KtTokens.DATA_KEYWORD);
156158

157-
StorageManager storageManager = c.getStorageManager();
158-
159159
// Annotation entries are taken from both own annotations (if any) and object literal annotations (if any)
160160
List<KtAnnotationEntry> annotationEntries = new ArrayList<KtAnnotationEntry>();
161161
if (classOrObject != null && classOrObject.getParent() instanceof KtObjectLiteralExpression) {

core/descriptors/src/org/jetbrains/kotlin/builtins/ReflectionTypes.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ import kotlin.reflect.KProperty
3232

3333
val KOTLIN_REFLECT_FQ_NAME = FqName("kotlin.reflect")
3434

35-
class ReflectionTypes(private val module: ModuleDescriptor) {
36-
private val kotlinReflectScope: MemberScope by lazy {
35+
class ReflectionTypes(module: ModuleDescriptor) {
36+
private val kotlinReflectScope: MemberScope by lazy(LazyThreadSafetyMode.PUBLICATION) {
3737
module.getPackage(KOTLIN_REFLECT_FQ_NAME).memberScope
3838
}
3939

core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/StaticScopeForKotlinEnum.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,28 @@ package org.jetbrains.kotlin.resolve.scopes
1818

1919
import org.jetbrains.kotlin.descriptors.ClassDescriptor
2020
import org.jetbrains.kotlin.descriptors.ClassKind
21-
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
2221
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
2322
import org.jetbrains.kotlin.incremental.components.LookupLocation
2423
import org.jetbrains.kotlin.name.Name
2524
import org.jetbrains.kotlin.resolve.DescriptorFactory.createEnumValueOfMethod
2625
import org.jetbrains.kotlin.resolve.DescriptorFactory.createEnumValuesMethod
26+
import org.jetbrains.kotlin.storage.StorageManager
27+
import org.jetbrains.kotlin.storage.getValue
2728
import org.jetbrains.kotlin.utils.Printer
2829
import java.util.*
2930

3031
// We don't need to track lookups here since this scope used only for introduce special Enum class members
31-
class StaticScopeForKotlinEnum(private val containingClass: ClassDescriptor) : MemberScopeImpl() {
32+
class StaticScopeForKotlinEnum(
33+
storageManager: StorageManager,
34+
private val containingClass: ClassDescriptor
35+
) : MemberScopeImpl() {
3236
init {
3337
assert(containingClass.kind == ClassKind.ENUM_CLASS) { "Class should be an enum: $containingClass" }
3438
}
3539

3640
override fun getContributedClassifier(name: Name, location: LookupLocation) = null // TODO
3741

38-
private val functions: List<SimpleFunctionDescriptor> by lazy {
42+
private val functions: List<SimpleFunctionDescriptor> by storageManager.createLazyValue {
3943
listOf(createEnumValueOfMethod(containingClass), createEnumValuesMethod(containingClass))
4044
}
4145

core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class DeserializedClassDescriptor(
6262

6363
private val classId = nameResolver.getClassId(classProto.fqName)
6464

65-
private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(this) else MemberScope.Empty
65+
private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(c.storageManager, this) else MemberScope.Empty
6666
private val typeConstructor = DeserializedClassTypeConstructor()
6767
private val memberScope = DeserializedClassMemberScope()
6868
private val nestedClasses = NestedClassDescriptors()

0 commit comments

Comments
 (0)