@@ -28,27 +28,16 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
2828
2929 trait SynchronizedSymbol extends Symbol {
3030
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+ }
4535
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 }
5039
51- override def typeParams : List [Symbol ] = gilSynchronized {
40+ override def typeParams : List [Symbol ] = gilSynchronizedIfNotInited {
5241 if (isCompilerUniverse) super .typeParams
5342 else {
5443 if (isMonomorphicType) Nil
@@ -64,22 +53,14 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
6453 }
6554 }
6655 }
67- override def unsafeTypeParams : List [Symbol ] = gilSynchronized {
56+ override def unsafeTypeParams : List [Symbol ] = gilSynchronizedIfNotInited {
6857 if (isCompilerUniverse) super .unsafeTypeParams
6958 else {
7059 if (isMonomorphicType) Nil
7160 else rawInfo.typeParams
7261 }
7362 }
7463
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-
8364// ------ creators -------------------------------------------------------------------
8465
8566 override protected def createAbstractTypeSymbol (name : TypeName , pos : Position , newFlags : Long ): AbstractTypeSymbol =
@@ -130,40 +111,26 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
130111
131112// ------- subclasses ---------------------------------------------------------------------
132113
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
139115
140116 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) } }
144121 }
145122
123+ trait SynchronizedModuleSymbol extends ModuleSymbol with SynchronizedTermSymbol
124+
146125 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 } }
151130 }
152131
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
163133
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
168135}
169136
0 commit comments