@@ -1105,14 +1105,32 @@ trait Types extends api.Types { self: SymbolTable =>
1105
1105
val start = Statistics .pushTimer(typeOpsStack, findMemberNanos)
1106
1106
1107
1107
// Console.println("find member " + name.decode + " in " + this + ":" + this.baseClasses)//DEBUG
1108
+ var member : Symbol = NoSymbol
1108
1109
var members : List [Symbol ] = null
1109
1110
var lastM : :: [Symbol ] = null
1110
- var member : Symbol = NoSymbol
1111
+ var membertpe : Type = null
1112
+ var membertpes : Array [Type ] = null
1111
1113
var excluded = excludedFlags | DEFERRED
1112
1114
var continue = true
1113
1115
var self : Type = null
1114
- var membertpe : Type = null
1115
1116
val fingerPrint : Long = name.fingerPrint
1117
+
1118
+ def getMtpe (sym : Symbol , idx : Int ): Type = {
1119
+ var result = membertpes(idx)
1120
+ if (result eq null ) { result = self memberType sym; membertpes(idx) = result }
1121
+ result
1122
+ }
1123
+
1124
+ def addMtpe (xs : Array [Type ], tpe : Type , idx : Int ): Array [Type ] =
1125
+ if (idx < xs.length ) {
1126
+ xs(idx) = tpe
1127
+ xs
1128
+ } else {
1129
+ val ys = new Array [Type ](xs.length * 2 )
1130
+ Array .copy(xs, 0 , ys, 0 , xs.length)
1131
+ addMtpe(ys, tpe, idx)
1132
+ }
1133
+
1116
1134
while (continue) {
1117
1135
continue = false
1118
1136
val bcs0 = baseClasses
@@ -1138,33 +1156,42 @@ trait Types extends api.Types { self: SymbolTable =>
1138
1156
} else if (member eq NoSymbol ) {
1139
1157
member = sym
1140
1158
} else if (members eq null ) {
1141
- if (! ((member eq sym) ||
1142
- (member.owner ne sym.owner) &&
1143
- (flags & PRIVATE ) == 0 && {
1144
- if (self eq null ) self = this .narrow
1145
- if (membertpe eq null ) membertpe = self.memberType(member)
1146
- (membertpe matches self.memberType(sym))
1147
- })) {
1159
+ var symtpe : Type = null
1160
+ if ((member ne sym) &&
1161
+ ((member.owner eq sym.owner) ||
1162
+ (flags & PRIVATE ) != 0 || {
1163
+ if (self eq null ) self = this .narrow
1164
+ if (membertpe eq null ) membertpe = self.memberType(member)
1165
+ symtpe = self.memberType(sym)
1166
+ ! (membertpe matches symtpe)
1167
+ })) {
1148
1168
lastM = new :: (sym, null )
1149
1169
members = member :: lastM
1170
+ membertpes = new Array [Type ](8 )
1171
+ membertpes(0 ) = membertpe
1172
+ membertpes(1 ) = symtpe
1150
1173
}
1151
1174
} else {
1152
1175
var others = members
1176
+ var idx = 0
1153
1177
var symtpe : Type = null
1154
- while ((others ne null ) &&
1155
- ! ((others.head eq sym) ||
1156
- (others.head.owner ne sym.owner) &&
1157
- (flags & PRIVATE ) == 0 && {
1158
- if (self eq null ) self = this .narrow
1159
- if (symtpe eq null ) symtpe = self.memberType(sym)
1160
- self.memberType(others.head) matches symtpe
1161
- })) {
1178
+ while ((others ne null ) && {
1179
+ val other = others.head
1180
+ (other ne sym) &&
1181
+ ((other.owner eq sym.owner) ||
1182
+ (flags & PRIVATE ) != 0 || {
1183
+ if (self eq null ) self = this .narrow
1184
+ if (symtpe eq null ) symtpe = self.memberType(sym)
1185
+ ! (getMtpe(other, idx) matches symtpe)
1186
+ })}) {
1162
1187
others = others.tail
1188
+ idx += 1
1163
1189
}
1164
1190
if (others eq null ) {
1165
1191
val lastM1 = new :: (sym, null )
1166
1192
lastM.tl = lastM1
1167
1193
lastM = lastM1
1194
+ membertpes = addMtpe(membertpes, symtpe, idx)
1168
1195
}
1169
1196
}
1170
1197
} else if (excl == DEFERRED ) {
@@ -5132,7 +5159,7 @@ trait Types extends api.Types { self: SymbolTable =>
5132
5159
*/
5133
5160
def needsOuterTest (patType : Type , selType : Type , currentOwner : Symbol ) = {
5134
5161
def createDummyClone (pre : Type ): Type = {
5135
- val dummy = currentOwner.enclClass.newValue(nme.ANYNAME ).setInfo(pre.widen)
5162
+ val dummy = currentOwner.enclClass.newValue(nme.ANYname ).setInfo(pre.widen)
5136
5163
singleType(ThisType (currentOwner.enclClass), dummy)
5137
5164
}
5138
5165
def maybeCreateDummyClone (pre : Type , sym : Symbol ): Type = pre match {
0 commit comments