Skip to content

Commit 7649581

Browse files
committed
Attempt #5 to optimize findMember.
Specific optimizations to findMember that have become possible because findMembers is its own function now.
1 parent f58e721 commit 7649581

File tree

1 file changed

+52
-53
lines changed

1 file changed

+52
-53
lines changed

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

Lines changed: 52 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,6 @@ trait Types extends api.Types { self: SymbolTable =>
10351035
var excluded = excludedFlags | DEFERRED
10361036
var continue = true
10371037
var self: Type = null
1038-
var membertpe: Type = null
10391038
while (continue) {
10401039
continue = false
10411040
val bcs0 = baseClasses
@@ -1045,12 +1044,13 @@ trait Types extends api.Types { self: SymbolTable =>
10451044
var entry = decls.elems
10461045
while (entry ne null) {
10471046
val sym = entry.sym
1048-
if (sym hasAllFlags requiredFlags) {
1049-
val excl = sym.getFlag(excluded)
1047+
val flags = sym.flags
1048+
if ((flags & requiredFlags) == requiredFlags) {
1049+
val excl = flags & excluded
10501050
if (excl == 0L &&
10511051
(// omit PRIVATE LOCALS unless selector class is contained in class owning the def.
10521052
(bcs eq bcs0) ||
1053-
!sym.isPrivateLocal ||
1053+
(flags & PrivateLocal) != PrivateLocal ||
10541054
(bcs0.head.hasTransOwner(bcs.head)))) {
10551055
if (members eq null) members = newScope
10561056
var prevEntry = members.lookupEntry(sym.name)
@@ -1119,61 +1119,60 @@ trait Types extends api.Types { self: SymbolTable =>
11191119
var bcs = bcs0
11201120
while (!bcs.isEmpty) {
11211121
val decls = bcs.head.info.decls
1122-
var entry =
1123-
if (name eq nme.ANYNAME) decls.elems
1124-
else if ((fingerPrint & decls.fingerPrints) == 0) null
1125-
else decls.lookupEntry(name)
1126-
while (entry ne null) {
1127-
val sym = entry.sym
1128-
if (sym hasAllFlags requiredFlags) {
1129-
val excl = sym.getFlag(excluded)
1130-
if (excl == 0L &&
1131-
(// omit PRIVATE LOCALS unless selector class is contained in class owning the def.
1132-
(bcs eq bcs0) ||
1133-
!sym.isPrivateLocal ||
1134-
(bcs0.head.hasTransOwner(bcs.head)))) {
1135-
if (name.isTypeName || stableOnly && sym.isStable) {
1136-
Statistics.popTimer(typeOpsStack, start)
1137-
if (suspension ne null) suspension foreach (_.suspended = false)
1138-
return sym
1139-
} else if (member eq NoSymbol) {
1140-
member = sym
1141-
} else if (members eq null) {
1142-
if ((member.name ne sym.name) ||
1143-
!((member eq sym) ||
1144-
(member.owner ne sym.owner) &&
1145-
!sym.isPrivate && {
1146-
if (self eq null) self = this.narrow
1147-
if (membertpe eq null) membertpe = self.memberType(member)
1148-
(membertpe matches self.memberType(sym))
1149-
})) {
1122+
if ((fingerPrint & decls.fingerPrints) != 0) {
1123+
var entry = decls.lookupEntry(name)
1124+
while (entry ne null) {
1125+
val sym = entry.sym
1126+
val flags = sym.flags
1127+
if ((flags & requiredFlags) == requiredFlags) {
1128+
val excl = flags & excluded
1129+
if (excl == 0L &&
1130+
(// omit PRIVATE LOCALS unless selector class is contained in class owning the def.
1131+
(bcs eq bcs0) ||
1132+
(flags & PrivateLocal) != PrivateLocal ||
1133+
(bcs0.head.hasTransOwner(bcs.head)))) {
1134+
if (name.isTypeName || stableOnly && sym.isStable) {
1135+
Statistics.popTimer(typeOpsStack, start)
1136+
if (suspension ne null) suspension foreach (_.suspended = false)
1137+
return sym
1138+
} else if (member eq NoSymbol) {
1139+
member = sym
1140+
} 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+
})) {
11501148
members = newScope
11511149
members enter member
11521150
members enter sym
1151+
}
1152+
} else {
1153+
var prevEntry = members.lookupEntry(sym.name)
1154+
var symtpe: Type = null
1155+
while ((prevEntry ne null) &&
1156+
!((prevEntry.sym eq sym) ||
1157+
(prevEntry.sym.owner ne sym.owner) &&
1158+
(flags & PRIVATE) == 0 && {
1159+
if (self eq null) self = this.narrow
1160+
if (symtpe eq null) symtpe = self.memberType(sym)
1161+
self.memberType(prevEntry.sym) matches symtpe
1162+
})) {
1163+
prevEntry = members lookupNextEntry prevEntry
1164+
}
1165+
if (prevEntry eq null) {
1166+
members enter sym
1167+
}
11531168
}
1154-
} else {
1155-
var prevEntry = members.lookupEntry(sym.name)
1156-
var symtpe: Type = null
1157-
while ((prevEntry ne null) &&
1158-
!((prevEntry.sym eq sym) ||
1159-
(prevEntry.sym.owner ne sym.owner) &&
1160-
!sym.hasFlag(PRIVATE) && {
1161-
if (self eq null) self = this.narrow
1162-
if (symtpe eq null) symtpe = self.memberType(sym)
1163-
self.memberType(prevEntry.sym) matches symtpe
1164-
})) {
1165-
prevEntry = members lookupNextEntry prevEntry
1166-
}
1167-
if (prevEntry eq null) {
1168-
members enter sym
1169-
}
1169+
} else if (excl == DEFERRED) {
1170+
continue = true
11701171
}
1171-
} else if (excl == DEFERRED.toLong) {
1172-
continue = true
11731172
}
1174-
}
1175-
entry = if (name == nme.ANYNAME) entry.next else decls lookupNextEntry entry
1176-
} // while (entry ne null)
1173+
entry = decls lookupNextEntry entry
1174+
} // while (entry ne null)
1175+
} // if (fingerPrint matches)
11771176
// excluded = excluded | LOCAL
11781177
bcs = if (name == nme.CONSTRUCTOR) Nil else bcs.tail
11791178
} // while (!bcs.isEmpty)

0 commit comments

Comments
 (0)