@@ -29,27 +29,16 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
2929
3030 trait SynchronizedSymbol extends Symbol {
3131
32- override def rawflags = gilSynchronized { super .rawflags }
33- override def rawflags_= (x : Long ) = gilSynchronized { super .rawflags_=(x) }
34-
35- override def rawowner = gilSynchronized { super .rawowner }
36- override def owner_= (owner : Symbol ) = gilSynchronized { super .owner_=(owner) }
37-
38- override def validTo = gilSynchronized { super .validTo }
39- override def validTo_= (x : Period ) = gilSynchronized { super .validTo_=(x) }
40-
41- override def pos = gilSynchronized { super .pos }
42- override def setPos (pos : Position ): this .type = { gilSynchronized { super .setPos(pos) }; this }
43-
44- override def privateWithin = gilSynchronized { super .privateWithin }
45- override def privateWithin_= (sym : Symbol ) = gilSynchronized { super .privateWithin_=(sym) }
32+ def gilSynchronizedIfNotInited [T ](body : => T ): T = {
33+ if (isFullyInitialized) body
34+ else gilSynchronized { body }
35+ }
4636
47- override def info = gilSynchronized { super .info }
48- override def info_= (info : Type ) = gilSynchronized { super .info_=(info) }
49- override def updateInfo (info : Type ): Symbol = gilSynchronized { super .updateInfo(info) }
50- override def rawInfo : Type = gilSynchronized { super .rawInfo }
37+ override def validTo = gilSynchronizedIfNotInited { super .validTo }
38+ override def info = gilSynchronizedIfNotInited { super .info }
39+ override def rawInfo : Type = gilSynchronizedIfNotInited { super .rawInfo }
5140
52- override def typeParams : List [Symbol ] = gilSynchronized {
41+ override def typeParams : List [Symbol ] = gilSynchronizedIfNotInited {
5342 if (isCompilerUniverse) super .typeParams
5443 else {
5544 if (isMonomorphicType) Nil
@@ -65,22 +54,14 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
6554 }
6655 }
6756 }
68- override def unsafeTypeParams : List [Symbol ] = gilSynchronized {
57+ override def unsafeTypeParams : List [Symbol ] = gilSynchronizedIfNotInited {
6958 if (isCompilerUniverse) super .unsafeTypeParams
7059 else {
7160 if (isMonomorphicType) Nil
7261 else rawInfo.typeParams
7362 }
7463 }
7564
76- override def reset (completer : Type ): this .type = gilSynchronized { super .reset(completer) }
77-
78- override def infosString : String = gilSynchronized { super .infosString }
79-
80- override def annotations : List [AnnotationInfo ] = gilSynchronized { super .annotations }
81- override def setAnnotations (annots : List [AnnotationInfo ]): this .type = { gilSynchronized { super .setAnnotations(annots) }; this }
82-
83-
8465// ------ creators -------------------------------------------------------------------
8566
8667 override protected def createAbstractTypeSymbol (name : TypeName , pos : Position , newFlags : Long ): AbstractTypeSymbol =
@@ -128,41 +109,26 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
128109
129110// ------- subclasses ---------------------------------------------------------------------
130111
131- trait SynchronizedTermSymbol extends TermSymbol with SynchronizedSymbol {
132- override def name_= (x : Name ) = gilSynchronized { super .name_=(x) }
133- override def rawname = gilSynchronized { super .rawname }
134- override def referenced : Symbol = gilSynchronized { super .referenced }
135- override def referenced_= (x : Symbol ) = gilSynchronized { super .referenced_=(x) }
136- }
112+ trait SynchronizedTermSymbol extends SynchronizedSymbol
137113
138114 trait SynchronizedMethodSymbol extends MethodSymbol with SynchronizedTermSymbol {
139- override def typeAsMemberOf (pre : Type ): Type = gilSynchronized { super .typeAsMemberOf(pre) }
140- override def paramss : List [List [Symbol ]] = gilSynchronized { super .paramss }
141- override def returnType : Type = gilSynchronized { super .returnType }
115+ // we can keep this lock fine-grained, because it's just a cache over asSeenFrom, which makes deadlocks impossible
116+ // unfortunately we cannot elide this lock, because the cache depends on `pre`
117+ private lazy val typeAsMemberOfLock = new Object
118+ override def typeAsMemberOf (pre : Type ): Type = gilSynchronizedIfNotInited { typeAsMemberOfLock.synchronized { super .typeAsMemberOf(pre) } }
142119 }
143120
121+ trait SynchronizedModuleSymbol extends ModuleSymbol with SynchronizedTermSymbol
122+
144123 trait SynchronizedTypeSymbol extends TypeSymbol with SynchronizedSymbol {
145- override def name_= (x : Name ) = gilSynchronized { super .name_=(x) }
146- override def rawname = gilSynchronized { super .rawname }
147- override def typeConstructor : Type = gilSynchronized { super .typeConstructor }
148- override def tpe_* : Type = gilSynchronized { super .tpe_* }
149- override def tpeHK : Type = gilSynchronized { super .tpeHK }
124+ // unlike with typeConstructor, a lock is necessary here, because tpe calculation relies on
125+ // temporarily assigning NoType to tpeCache to detect cyclic reference errors
126+ private lazy val tpeLock = new Object
127+ override def tpe_* : Type = gilSynchronizedIfNotInited { tpeLock.synchronized { super .tpe_* } }
150128 }
151129
152- trait SynchronizedClassSymbol extends ClassSymbol with SynchronizedTypeSymbol {
153- override def associatedFile = gilSynchronized { super .associatedFile }
154- override def associatedFile_= (f : AbstractFile ) = gilSynchronized { super .associatedFile_=(f) }
155- override def thisSym : Symbol = gilSynchronized { super .thisSym }
156- override def thisType : Type = gilSynchronized { super .thisType }
157- override def typeOfThis : Type = gilSynchronized { super .typeOfThis }
158- override def typeOfThis_= (tp : Type ) = gilSynchronized { super .typeOfThis_=(tp) }
159- override def children = gilSynchronized { super .children }
160- override def addChild (sym : Symbol ) = gilSynchronized { super .addChild(sym) }
161- }
130+ trait SynchronizedClassSymbol extends ClassSymbol with SynchronizedTypeSymbol
162131
163- trait SynchronizedModuleClassSymbol extends ModuleClassSymbol with SynchronizedClassSymbol {
164- override def sourceModule = gilSynchronized { super .sourceModule }
165- override def implicitMembers : Scope = gilSynchronized { super .implicitMembers }
166- }
132+ trait SynchronizedModuleClassSymbol extends ModuleClassSymbol with SynchronizedClassSymbol
167133}
168134
0 commit comments