@@ -28,27 +28,16 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
28
28
29
29
trait SynchronizedSymbol extends Symbol {
30
30
31
- override def rawflags = gilSynchronized { super .rawflags }
32
- override def rawflags_= (x : Long ) = gilSynchronized { super .rawflags_=(x) }
33
-
34
- override def rawowner = gilSynchronized { super .rawowner }
35
- override def owner_= (owner : Symbol ) = gilSynchronized { super .owner_=(owner) }
36
-
37
- override def validTo = gilSynchronized { super .validTo }
38
- override def validTo_= (x : Period ) = gilSynchronized { super .validTo_=(x) }
39
-
40
- override def pos = gilSynchronized { super .pos }
41
- override def setPos (pos : Position ): this .type = { gilSynchronized { super .setPos(pos) }; this }
42
-
43
- override def privateWithin = gilSynchronized { super .privateWithin }
44
- override def privateWithin_= (sym : Symbol ) = gilSynchronized { super .privateWithin_=(sym) }
31
+ def gilSynchronizedIfNotInited [T ](body : => T ): T = {
32
+ if (isFullyInitialized) body
33
+ else gilSynchronized { body }
34
+ }
45
35
46
- override def info = gilSynchronized { super .info }
47
- override def info_= (info : Type ) = gilSynchronized { super .info_=(info) }
48
- override def updateInfo (info : Type ): Symbol = gilSynchronized { super .updateInfo(info) }
49
- override def rawInfo : Type = gilSynchronized { super .rawInfo }
36
+ override def validTo = gilSynchronizedIfNotInited { super .validTo }
37
+ override def info = gilSynchronizedIfNotInited { super .info }
38
+ override def rawInfo : Type = gilSynchronizedIfNotInited { super .rawInfo }
50
39
51
- override def typeParams : List [Symbol ] = gilSynchronized {
40
+ override def typeParams : List [Symbol ] = gilSynchronizedIfNotInited {
52
41
if (isCompilerUniverse) super .typeParams
53
42
else {
54
43
if (isMonomorphicType) Nil
@@ -64,22 +53,14 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
64
53
}
65
54
}
66
55
}
67
- override def unsafeTypeParams : List [Symbol ] = gilSynchronized {
56
+ override def unsafeTypeParams : List [Symbol ] = gilSynchronizedIfNotInited {
68
57
if (isCompilerUniverse) super .unsafeTypeParams
69
58
else {
70
59
if (isMonomorphicType) Nil
71
60
else rawInfo.typeParams
72
61
}
73
62
}
74
63
75
- override def reset (completer : Type ): this .type = gilSynchronized { super .reset(completer) }
76
-
77
- override def infosString : String = gilSynchronized { super .infosString }
78
-
79
- override def annotations : List [AnnotationInfo ] = gilSynchronized { super .annotations }
80
- override def setAnnotations (annots : List [AnnotationInfo ]): this .type = { gilSynchronized { super .setAnnotations(annots) }; this }
81
-
82
-
83
64
// ------ creators -------------------------------------------------------------------
84
65
85
66
override protected def createAbstractTypeSymbol (name : TypeName , pos : Position , newFlags : Long ): AbstractTypeSymbol =
@@ -130,40 +111,26 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
130
111
131
112
// ------- subclasses ---------------------------------------------------------------------
132
113
133
- trait SynchronizedTermSymbol extends TermSymbol with SynchronizedSymbol {
134
- override def name_= (x : Name ) = gilSynchronized { super .name_=(x) }
135
- override def rawname = gilSynchronized { super .rawname }
136
- override def referenced : Symbol = gilSynchronized { super .referenced }
137
- override def referenced_= (x : Symbol ) = gilSynchronized { super .referenced_=(x) }
138
- }
114
+ trait SynchronizedTermSymbol extends SynchronizedSymbol
139
115
140
116
trait SynchronizedMethodSymbol extends MethodSymbol with SynchronizedTermSymbol {
141
- override def typeAsMemberOf (pre : Type ): Type = gilSynchronized { super .typeAsMemberOf(pre) }
142
- override def paramss : List [List [Symbol ]] = gilSynchronized { super .paramss }
143
- override def returnType : Type = gilSynchronized { super .returnType }
117
+ // we can keep this lock fine-grained, because it's just a cache over asSeenFrom, which makes deadlocks impossible
118
+ // unfortunately we cannot elide this lock, because the cache depends on `pre`
119
+ private lazy val typeAsMemberOfLock = new Object
120
+ override def typeAsMemberOf (pre : Type ): Type = gilSynchronizedIfNotInited { typeAsMemberOfLock.synchronized { super .typeAsMemberOf(pre) } }
144
121
}
145
122
123
+ trait SynchronizedModuleSymbol extends ModuleSymbol with SynchronizedTermSymbol
124
+
146
125
trait SynchronizedTypeSymbol extends TypeSymbol with SynchronizedSymbol {
147
- override def name_= ( x : Name ) = gilSynchronized { super .name_=(x) }
148
- override def rawname = gilSynchronized { super .rawname }
149
- override def typeConstructor : Type = gilSynchronized { super .typeConstructor }
150
- override def tpe : Type = gilSynchronized { super .tpe }
126
+ // unlike with typeConstructor, a lock is necessary here, because tpe calculation relies on
127
+ // temporarily assigning NoType to tpeCache to detect cyclic reference errors
128
+ private lazy val tpeLock = new Object
129
+ override def tpe : Type = gilSynchronizedIfNotInited { tpeLock. synchronized { super .tpe } }
151
130
}
152
131
153
- trait SynchronizedClassSymbol extends ClassSymbol with SynchronizedTypeSymbol {
154
- override def associatedFile = gilSynchronized { super .associatedFile }
155
- override def associatedFile_= (f : AbstractFile ) = gilSynchronized { super .associatedFile_=(f) }
156
- override def thisSym : Symbol = gilSynchronized { super .thisSym }
157
- override def thisType : Type = gilSynchronized { super .thisType }
158
- override def typeOfThis : Type = gilSynchronized { super .typeOfThis }
159
- override def typeOfThis_= (tp : Type ) = gilSynchronized { super .typeOfThis_=(tp) }
160
- override def children = gilSynchronized { super .children }
161
- override def addChild (sym : Symbol ) = gilSynchronized { super .addChild(sym) }
162
- }
132
+ trait SynchronizedClassSymbol extends ClassSymbol with SynchronizedTypeSymbol
163
133
164
- trait SynchronizedModuleClassSymbol extends ModuleClassSymbol with SynchronizedClassSymbol {
165
- override def sourceModule = gilSynchronized { super .sourceModule }
166
- override def implicitMembers : Scope = gilSynchronized { super .implicitMembers }
167
- }
134
+ trait SynchronizedModuleClassSymbol extends ModuleClassSymbol with SynchronizedClassSymbol
168
135
}
169
136
0 commit comments