Skip to content

Commit e94252e

Browse files
oderskyAdriaan Moors
authored and
Adriaan Moors
committed
Attemmpt #6 to optimize findMember
Replace scope by ::-list, where new elements are added at the end.
1 parent 73e61b8 commit e94252e

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

src/reflect/scala/reflect/internal/Types.scala

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)