@@ -1017,7 +1017,7 @@ trait Types extends api.Types { self: SymbolTable =>
10171017 if (alts.isEmpty) sym
10181018 else (baseClasses.head.newOverloaded(this , alts))
10191019 }
1020-
1020+
10211021 def findMembers (excludedFlags : Long , requiredFlags : Long ): List [Symbol ] = {
10221022 // if this type contains type variables, put them to sleep for a while -- don't just wipe them out by
10231023 // 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 =>
10401040 var bcs = bcs0
10411041 while (! bcs.isEmpty) {
10421042 val decls = bcs.head.info.decls
1043- var entry = decls.elems
1043+ var entry = decls.elems
10441044 while (entry ne null ) {
10451045 val sym = entry.sym
10461046 val flags = sym.flags
@@ -1105,7 +1105,8 @@ trait Types extends api.Types { self: SymbolTable =>
11051105 val start = Statistics .pushTimer(typeOpsStack, findMemberNanos)
11061106
11071107 // 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
11091110 var member : Symbol = NoSymbol
11101111 var excluded = excludedFlags | DEFERRED
11111112 var continue = true
@@ -1144,25 +1145,26 @@ trait Types extends api.Types { self: SymbolTable =>
11441145 if (membertpe eq null ) membertpe = self.memberType(member)
11451146 (membertpe matches self.memberType(sym))
11461147 })) {
1147- members = newScope
1148- members enter member
1149- members enter sym
1148+ lastM = new :: (sym, null )
1149+ members = member :: lastM
11501150 }
11511151 } else {
1152- var prevEntry = members.lookupEntry(sym.name)
1152+ var others = members
11531153 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) &&
11571157 (flags & PRIVATE ) == 0 && {
11581158 if (self eq null ) self = this .narrow
11591159 if (symtpe eq null ) symtpe = self.memberType(sym)
1160- self.memberType(prevEntry.sym ) matches symtpe
1160+ self.memberType(others.head ) matches symtpe
11611161 })) {
1162- prevEntry = members lookupNextEntry prevEntry
1162+ others = others.tail
11631163 }
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
11661168 }
11671169 }
11681170 } else if (excl == DEFERRED ) {
@@ -1184,10 +1186,11 @@ trait Types extends api.Types { self: SymbolTable =>
11841186 member
11851187 } else {
11861188 Statistics .incCounter(multMemberCount)
1187- baseClasses.head.newOverloaded(this , members.toList)
1189+ lastM.tl = Nil
1190+ baseClasses.head.newOverloaded(this , members)
11881191 }
11891192 }
1190-
1193+
11911194 /** The (existential or otherwise) skolems and existentially quantified variables which are free in this type */
11921195 def skolemsExceptMethodTypeParams : List [Symbol ] = {
11931196 var boundSyms : List [Symbol ] = List ()
0 commit comments