Skip to content

Commit 73e61b8

Browse files
oderskyAdriaan Moors
authored and
Adriaan Moors
committed
Attempt #5 to optimize findMember.
Specific optimizations to findMember that have become possible because findMembers is its own function now.
1 parent 04f0b65 commit 73e61b8

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
@@ -1034,7 +1034,6 @@ trait Types extends api.Types { self: SymbolTable =>
10341034
var excluded = excludedFlags | DEFERRED
10351035
var continue = true
10361036
var self: Type = null
1037-
var membertpe: Type = null
10381037
while (continue) {
10391038
continue = false
10401039
val bcs0 = baseClasses
@@ -1044,12 +1043,13 @@ trait Types extends api.Types { self: SymbolTable =>
10441043
var entry = decls.elems
10451044
while (entry ne null) {
10461045
val sym = entry.sym
1047-
if (sym hasAllFlags requiredFlags) {
1048-
val excl = sym.getFlag(excluded)
1046+
val flags = sym.flags
1047+
if ((flags & requiredFlags) == requiredFlags) {
1048+
val excl = flags & excluded
10491049
if (excl == 0L &&
10501050
(// omit PRIVATE LOCALS unless selector class is contained in class owning the def.
10511051
(bcs eq bcs0) ||
1052-
!sym.isPrivateLocal ||
1052+
(flags & PrivateLocal) != PrivateLocal ||
10531053
(bcs0.head.hasTransOwner(bcs.head)))) {
10541054
if (members eq null) members = newScope
10551055
var prevEntry = members.lookupEntry(sym.name)
@@ -1118,61 +1118,60 @@ trait Types extends api.Types { self: SymbolTable =>
11181118
var bcs = bcs0
11191119
while (!bcs.isEmpty) {
11201120
val decls = bcs.head.info.decls
1121-
var entry =
1122-
if (name eq nme.ANYNAME) decls.elems
1123-
else if ((fingerPrint & decls.fingerPrints) == 0) null
1124-
else decls.lookupEntry(name)
1125-
while (entry ne null) {
1126-
val sym = entry.sym
1127-
if (sym hasAllFlags requiredFlags) {
1128-
val excl = sym.getFlag(excluded)
1129-
if (excl == 0L &&
1130-
(// omit PRIVATE LOCALS unless selector class is contained in class owning the def.
1131-
(bcs eq bcs0) ||
1132-
!sym.isPrivateLocal ||
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.name ne sym.name) ||
1142-
!((member eq sym) ||
1143-
(member.owner ne sym.owner) &&
1144-
!sym.isPrivate && {
1145-
if (self eq null) self = this.narrow
1146-
if (membertpe eq null) membertpe = self.memberType(member)
1147-
(membertpe matches self.memberType(sym))
1148-
})) {
1121+
if ((fingerPrint & decls.fingerPrints) != 0) {
1122+
var entry = decls.lookupEntry(name)
1123+
while (entry ne null) {
1124+
val sym = entry.sym
1125+
val flags = sym.flags
1126+
if ((flags & requiredFlags) == requiredFlags) {
1127+
val excl = flags & excluded
1128+
if (excl == 0L &&
1129+
(// omit PRIVATE LOCALS unless selector class is contained in class owning the def.
1130+
(bcs eq bcs0) ||
1131+
(flags & PrivateLocal) != PrivateLocal ||
1132+
(bcs0.head.hasTransOwner(bcs.head)))) {
1133+
if (name.isTypeName || stableOnly && sym.isStable) {
1134+
Statistics.popTimer(typeOpsStack, start)
1135+
if (suspension ne null) suspension foreach (_.suspended = false)
1136+
return sym
1137+
} else if (member eq NoSymbol) {
1138+
member = sym
1139+
} else if (members eq null) {
1140+
if (!((member eq sym) ||
1141+
(member.owner ne sym.owner) &&
1142+
(flags & PRIVATE) == 0 && {
1143+
if (self eq null) self = this.narrow
1144+
if (membertpe eq null) membertpe = self.memberType(member)
1145+
(membertpe matches self.memberType(sym))
1146+
})) {
11491147
members = newScope
11501148
members enter member
11511149
members enter sym
1150+
}
1151+
} else {
1152+
var prevEntry = members.lookupEntry(sym.name)
1153+
var symtpe: Type = null
1154+
while ((prevEntry ne null) &&
1155+
!((prevEntry.sym eq sym) ||
1156+
(prevEntry.sym.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(prevEntry.sym) matches symtpe
1161+
})) {
1162+
prevEntry = members lookupNextEntry prevEntry
1163+
}
1164+
if (prevEntry eq null) {
1165+
members enter sym
1166+
}
11521167
}
1153-
} else {
1154-
var prevEntry = members.lookupEntry(sym.name)
1155-
var symtpe: Type = null
1156-
while ((prevEntry ne null) &&
1157-
!((prevEntry.sym eq sym) ||
1158-
(prevEntry.sym.owner ne sym.owner) &&
1159-
!sym.hasFlag(PRIVATE) && {
1160-
if (self eq null) self = this.narrow
1161-
if (symtpe eq null) symtpe = self.memberType(sym)
1162-
self.memberType(prevEntry.sym) matches symtpe
1163-
})) {
1164-
prevEntry = members lookupNextEntry prevEntry
1165-
}
1166-
if (prevEntry eq null) {
1167-
members enter sym
1168-
}
1168+
} else if (excl == DEFERRED) {
1169+
continue = true
11691170
}
1170-
} else if (excl == DEFERRED.toLong) {
1171-
continue = true
11721171
}
1173-
}
1174-
entry = if (name == nme.ANYNAME) entry.next else decls lookupNextEntry entry
1175-
} // while (entry ne null)
1172+
entry = decls lookupNextEntry entry
1173+
} // while (entry ne null)
1174+
} // if (fingerPrint matches)
11761175
// excluded = excluded | LOCAL
11771176
bcs = if (name == nme.CONSTRUCTOR) Nil else bcs.tail
11781177
} // while (!bcs.isEmpty)

0 commit comments

Comments
 (0)