@@ -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