Skip to content

Commit 77e5692

Browse files
oderskyAdriaan Moors
authored and
Adriaan Moors
committed
Attempty #7 to optimize findMember
memberType operations are not cached, so that at most one memberType is taken per found symbol.
1 parent 275115e commit 77e5692

File tree

1 file changed

+45
-18
lines changed

1 file changed

+45
-18
lines changed

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

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,14 +1105,32 @@ 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 member: Symbol = NoSymbol
11081109
var members: List[Symbol] = null
11091110
var lastM: ::[Symbol] = null
1110-
var member: Symbol = NoSymbol
1111+
var membertpe: Type = null
1112+
var membertpes: Array[Type] = null
11111113
var excluded = excludedFlags | DEFERRED
11121114
var continue = true
11131115
var self: Type = null
1114-
var membertpe: Type = null
11151116
val fingerPrint: Long = name.fingerPrint
1117+
1118+
def getMtpe(sym: Symbol, idx: Int): Type = {
1119+
var result = membertpes(idx)
1120+
if (result eq null) { result = self memberType sym; membertpes(idx) = result }
1121+
result
1122+
}
1123+
1124+
def addMtpe(xs: Array[Type], tpe: Type, idx: Int): Array[Type] =
1125+
if (idx < xs.length ) {
1126+
xs(idx) = tpe
1127+
xs
1128+
} else {
1129+
val ys = new Array[Type](xs.length * 2)
1130+
Array.copy(xs, 0, ys, 0, xs.length)
1131+
addMtpe(ys, tpe, idx)
1132+
}
1133+
11161134
while (continue) {
11171135
continue = false
11181136
val bcs0 = baseClasses
@@ -1138,33 +1156,42 @@ trait Types extends api.Types { self: SymbolTable =>
11381156
} else if (member eq NoSymbol) {
11391157
member = sym
11401158
} 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-
})) {
1159+
var symtpe: Type = null
1160+
if ((member ne sym) &&
1161+
((member.owner eq sym.owner) ||
1162+
(flags & PRIVATE) != 0 || {
1163+
if (self eq null) self = this.narrow
1164+
if (membertpe eq null) membertpe = self.memberType(member)
1165+
symtpe = self.memberType(sym)
1166+
!(membertpe matches symtpe)
1167+
})) {
11481168
lastM = new ::(sym, null)
11491169
members = member :: lastM
1170+
membertpes = new Array[Type](8)
1171+
membertpes(0) = membertpe
1172+
membertpes(1) = symtpe
11501173
}
11511174
} else {
11521175
var others = members
1176+
var idx = 0
11531177
var symtpe: Type = null
1154-
while ((others ne null) &&
1155-
!((others.head eq sym) ||
1156-
(others.head.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(others.head) matches symtpe
1161-
})) {
1178+
while ((others ne null) && {
1179+
val other = others.head
1180+
(other ne sym) &&
1181+
((other.owner eq sym.owner) ||
1182+
(flags & PRIVATE) != 0 || {
1183+
if (self eq null) self = this.narrow
1184+
if (symtpe eq null) symtpe = self.memberType(sym)
1185+
!(getMtpe(other, idx) matches symtpe)
1186+
})}) {
11621187
others = others.tail
1188+
idx += 1
11631189
}
11641190
if (others eq null) {
11651191
val lastM1 = new ::(sym, null)
11661192
lastM.tl = lastM1
11671193
lastM = lastM1
1194+
membertpes = addMtpe(membertpes, symtpe, idx)
11681195
}
11691196
}
11701197
} else if (excl == DEFERRED) {
@@ -5132,7 +5159,7 @@ trait Types extends api.Types { self: SymbolTable =>
51325159
*/
51335160
def needsOuterTest(patType: Type, selType: Type, currentOwner: Symbol) = {
51345161
def createDummyClone(pre: Type): Type = {
5135-
val dummy = currentOwner.enclClass.newValue(nme.ANYNAME).setInfo(pre.widen)
5162+
val dummy = currentOwner.enclClass.newValue(nme.ANYname).setInfo(pre.widen)
51365163
singleType(ThisType(currentOwner.enclClass), dummy)
51375164
}
51385165
def maybeCreateDummyClone(pre: Type, sym: Symbol): Type = pre match {

0 commit comments

Comments
 (0)