@@ -1407,14 +1407,14 @@ object SymDenotations {
1407
1407
baseData._2
1408
1408
1409
1409
def computeBaseData (implicit onBehalf : BaseData , ctx : Context ): (List [ClassSymbol ], BaseClassSet ) = {
1410
- val seen = mutable. SortedSet [ Int ]()
1410
+ val seen = new BaseClassSetBuilder
1411
1411
def addBaseClasses (bcs : List [ClassSymbol ], to : List [ClassSymbol ])
1412
1412
: List [ClassSymbol ] = bcs match {
1413
1413
case bc :: bcs1 =>
1414
1414
val bcs1added = addBaseClasses(bcs1, to)
1415
- if (seen contains bc.id ) bcs1added
1415
+ if (seen contains bc) bcs1added
1416
1416
else {
1417
- seen += bc.id
1417
+ seen.add(bc)
1418
1418
bc :: bcs1added
1419
1419
}
1420
1420
case nil =>
@@ -1432,7 +1432,7 @@ object SymDenotations {
1432
1432
if (classParents.isEmpty && ! emptyParentsExpected)
1433
1433
onBehalf.signalProvisional()
1434
1434
(classSymbol :: addParentBaseClasses(classParents, Nil ),
1435
- new BaseClassSet ( seen.toArray) )
1435
+ seen.result )
1436
1436
}
1437
1437
1438
1438
final override def derivesFrom (base : Symbol )(implicit ctx : Context ): Boolean =
@@ -2080,17 +2080,44 @@ object SymDenotations {
2080
2080
}
2081
2081
2082
2082
class BaseClassSet (val classIds : Array [Int ]) extends AnyVal {
2083
- def contains (sym : Symbol ) : Boolean = {
2083
+ def contains (sym : Symbol , limit : Int ) = {
2084
2084
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
2092
2094
}
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)
2094
2121
}
2095
2122
}
2096
2123
0 commit comments