Skip to content

Commit a527f3b

Browse files
authored
Merge pull request #2676 from dotty-staging/add-scala12-mixins
Faster base class sets
2 parents 36298e7 + 866f172 commit a527f3b

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

compiler/src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,14 +1407,14 @@ object SymDenotations {
14071407
baseData._2
14081408

14091409
def computeBaseData(implicit onBehalf: BaseData, ctx: Context): (List[ClassSymbol], BaseClassSet) = {
1410-
val seen = mutable.SortedSet[Int]()
1410+
val seen = new BaseClassSetBuilder
14111411
def addBaseClasses(bcs: List[ClassSymbol], to: List[ClassSymbol])
14121412
: List[ClassSymbol] = bcs match {
14131413
case bc :: bcs1 =>
14141414
val bcs1added = addBaseClasses(bcs1, to)
1415-
if (seen contains bc.id) bcs1added
1415+
if (seen contains bc) bcs1added
14161416
else {
1417-
seen += bc.id
1417+
seen.add(bc)
14181418
bc :: bcs1added
14191419
}
14201420
case nil =>
@@ -1432,7 +1432,7 @@ object SymDenotations {
14321432
if (classParents.isEmpty && !emptyParentsExpected)
14331433
onBehalf.signalProvisional()
14341434
(classSymbol :: addParentBaseClasses(classParents, Nil),
1435-
new BaseClassSet(seen.toArray))
1435+
seen.result)
14361436
}
14371437

14381438
final override def derivesFrom(base: Symbol)(implicit ctx: Context): Boolean =
@@ -2080,17 +2080,44 @@ object SymDenotations {
20802080
}
20812081

20822082
class BaseClassSet(val classIds: Array[Int]) extends AnyVal {
2083-
def contains(sym: Symbol): Boolean = {
2083+
def contains(sym: Symbol, limit: Int) = {
20842084
val id = sym.id
2085-
var lo = 0
2086-
var hi = classIds.length - 1
2087-
while (lo <= hi) {
2088-
val mid = (lo + hi) / 2
2089-
if (id < classIds(mid)) hi = mid - 1
2090-
else if (id > classIds(mid)) lo = mid + 1
2091-
else return true
2085+
var i = 0
2086+
while (i < limit && classIds(i) != id) i += 1
2087+
i < limit && {
2088+
if (i > 0) {
2089+
val t = classIds(i)
2090+
classIds(i) = classIds(i - 1)
2091+
classIds(i - 1) = t
2092+
}
2093+
true
20922094
}
2093-
false
2095+
}
2096+
def contains(sym: Symbol): Boolean = contains(sym, classIds.length)
2097+
}
2098+
2099+
private class BaseClassSetBuilder {
2100+
private var classIds = new Array[Int](32)
2101+
private var length = 0
2102+
2103+
private def resize(size: Int) = {
2104+
val classIds1 = new Array[Int](size)
2105+
Array.copy(classIds, 0, classIds1, 0, classIds.length min size)
2106+
classIds = classIds1
2107+
}
2108+
2109+
def contains(sym: Symbol): Boolean =
2110+
new BaseClassSet(classIds).contains(sym, length)
2111+
2112+
def add(sym: Symbol): Unit = {
2113+
if (length == classIds.length) resize(length * 2)
2114+
classIds(length) = sym.id
2115+
length += 1
2116+
}
2117+
2118+
def result = {
2119+
if (length != classIds.length) resize(length)
2120+
new BaseClassSet(classIds)
20942121
}
20952122
}
20962123

0 commit comments

Comments
 (0)