@@ -29,27 +29,16 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
29
29
30
30
trait SynchronizedSymbol extends Symbol {
31
31
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
+ }
46
36
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 }
51
40
52
- override def typeParams : List [Symbol ] = gilSynchronized {
41
+ override def typeParams : List [Symbol ] = gilSynchronizedIfNotInited {
53
42
if (isCompilerUniverse) super .typeParams
54
43
else {
55
44
if (isMonomorphicType) Nil
@@ -65,22 +54,14 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
65
54
}
66
55
}
67
56
}
68
- override def unsafeTypeParams : List [Symbol ] = gilSynchronized {
57
+ override def unsafeTypeParams : List [Symbol ] = gilSynchronizedIfNotInited {
69
58
if (isCompilerUniverse) super .unsafeTypeParams
70
59
else {
71
60
if (isMonomorphicType) Nil
72
61
else rawInfo.typeParams
73
62
}
74
63
}
75
64
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
-
84
65
// ------ creators -------------------------------------------------------------------
85
66
86
67
override protected def createAbstractTypeSymbol (name : TypeName , pos : Position , newFlags : Long ): AbstractTypeSymbol =
@@ -128,41 +109,26 @@ private[reflect] trait SynchronizedSymbols extends internal.Symbols { self: Symb
128
109
129
110
// ------- subclasses ---------------------------------------------------------------------
130
111
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
137
113
138
114
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) } }
142
119
}
143
120
121
+ trait SynchronizedModuleSymbol extends ModuleSymbol with SynchronizedTermSymbol
122
+
144
123
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_* } }
150
128
}
151
129
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
162
131
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
167
133
}
168
134
0 commit comments