@@ -1017,7 +1017,7 @@ trait Types extends api.Types { self: SymbolTable =>
1017
1017
if (alts.isEmpty) sym
1018
1018
else (baseClasses.head.newOverloaded(this , alts))
1019
1019
}
1020
-
1020
+
1021
1021
def findMembers (excludedFlags : Long , requiredFlags : Long ): List [Symbol ] = {
1022
1022
// if this type contains type variables, put them to sleep for a while -- don't just wipe them out by
1023
1023
// replacing them by the corresponding type parameter, as that messes up (e.g.) type variables in type refinements
@@ -1040,7 +1040,7 @@ trait Types extends api.Types { self: SymbolTable =>
1040
1040
var bcs = bcs0
1041
1041
while (! bcs.isEmpty) {
1042
1042
val decls = bcs.head.info.decls
1043
- var entry = decls.elems
1043
+ var entry = decls.elems
1044
1044
while (entry ne null ) {
1045
1045
val sym = entry.sym
1046
1046
val flags = sym.flags
@@ -1105,7 +1105,8 @@ 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 members : Scope = null
1108
+ var members : List [Symbol ] = null
1109
+ var lastM : :: [Symbol ] = null
1109
1110
var member : Symbol = NoSymbol
1110
1111
var excluded = excludedFlags | DEFERRED
1111
1112
var continue = true
@@ -1144,25 +1145,26 @@ trait Types extends api.Types { self: SymbolTable =>
1144
1145
if (membertpe eq null ) membertpe = self.memberType(member)
1145
1146
(membertpe matches self.memberType(sym))
1146
1147
})) {
1147
- members = newScope
1148
- members enter member
1149
- members enter sym
1148
+ lastM = new :: (sym, null )
1149
+ members = member :: lastM
1150
1150
}
1151
1151
} else {
1152
- var prevEntry = members.lookupEntry(sym.name)
1152
+ var others = members
1153
1153
var symtpe : Type = null
1154
- while ((prevEntry ne null ) &&
1155
- ! ((prevEntry.sym eq sym) ||
1156
- (prevEntry.sym .owner ne sym.owner) &&
1154
+ while ((others ne null ) &&
1155
+ ! ((others.head eq sym) ||
1156
+ (others.head .owner ne sym.owner) &&
1157
1157
(flags & PRIVATE ) == 0 && {
1158
1158
if (self eq null ) self = this .narrow
1159
1159
if (symtpe eq null ) symtpe = self.memberType(sym)
1160
- self.memberType(prevEntry.sym ) matches symtpe
1160
+ self.memberType(others.head ) matches symtpe
1161
1161
})) {
1162
- prevEntry = members lookupNextEntry prevEntry
1162
+ others = others.tail
1163
1163
}
1164
- if (prevEntry eq null ) {
1165
- members enter sym
1164
+ if (others eq null ) {
1165
+ val lastM1 = new :: (sym, null )
1166
+ lastM.tl = lastM1
1167
+ lastM = lastM1
1166
1168
}
1167
1169
}
1168
1170
} else if (excl == DEFERRED ) {
@@ -1184,10 +1186,11 @@ trait Types extends api.Types { self: SymbolTable =>
1184
1186
member
1185
1187
} else {
1186
1188
Statistics .incCounter(multMemberCount)
1187
- baseClasses.head.newOverloaded(this , members.toList)
1189
+ lastM.tl = Nil
1190
+ baseClasses.head.newOverloaded(this , members)
1188
1191
}
1189
1192
}
1190
-
1193
+
1191
1194
/** The (existential or otherwise) skolems and existentially quantified variables which are free in this type */
1192
1195
def skolemsExceptMethodTypeParams : List [Symbol ] = {
1193
1196
var boundSyms : List [Symbol ] = List ()
0 commit comments