@@ -1400,14 +1400,14 @@ object SymDenotations {
1400
1400
baseData._2
1401
1401
1402
1402
def computeBaseData (implicit onBehalf : BaseData , ctx : Context ): (List [ClassSymbol ], BaseClassSet ) = {
1403
- val seen = mutable. SortedSet [ Int ]()
1403
+ val seen = new BaseClassSetBuilder
1404
1404
def addBaseClasses (bcs : List [ClassSymbol ], to : List [ClassSymbol ])
1405
1405
: List [ClassSymbol ] = bcs match {
1406
1406
case bc :: bcs1 =>
1407
1407
val bcs1added = addBaseClasses(bcs1, to)
1408
- if (seen contains bc.id ) bcs1added
1408
+ if (seen contains bc) bcs1added
1409
1409
else {
1410
- seen += bc.id
1410
+ seen.add(bc)
1411
1411
bc :: bcs1added
1412
1412
}
1413
1413
case nil =>
@@ -1425,7 +1425,7 @@ object SymDenotations {
1425
1425
if (classParents.isEmpty && ! emptyParentsExpected)
1426
1426
onBehalf.signalProvisional()
1427
1427
(classSymbol :: addParentBaseClasses(classParents, Nil ),
1428
- new BaseClassSet ( seen.toArray) )
1428
+ seen.result )
1429
1429
}
1430
1430
1431
1431
final override def derivesFrom (base : Symbol )(implicit ctx : Context ): Boolean =
@@ -2073,17 +2073,44 @@ object SymDenotations {
2073
2073
}
2074
2074
2075
2075
class BaseClassSet (val classIds : Array [Int ]) extends AnyVal {
2076
- def contains (sym : Symbol ) : Boolean = {
2076
+ def contains (sym : Symbol , limit : Int ) = {
2077
2077
val id = sym.id
2078
- var lo = 0
2079
- var hi = classIds.length - 1
2080
- while (lo <= hi) {
2081
- val mid = (lo + hi) / 2
2082
- if (id < classIds(mid)) hi = mid - 1
2083
- else if (id > classIds(mid)) lo = mid + 1
2084
- else return true
2078
+ var i = 0
2079
+ while (i < limit && classIds(i) != id) i += 1
2080
+ i < limit && {
2081
+ if (i > 0 ) {
2082
+ val t = classIds(i)
2083
+ classIds(i) = classIds(i - 1 )
2084
+ classIds(i - 1 ) = t
2085
+ }
2086
+ true
2085
2087
}
2086
- false
2088
+ }
2089
+ def contains (sym : Symbol ): Boolean = contains(sym, classIds.length)
2090
+ }
2091
+
2092
+ private class BaseClassSetBuilder {
2093
+ private var classIds = new Array [Int ](32 )
2094
+ private var length = 0
2095
+
2096
+ private def resize (size : Int ) = {
2097
+ val classIds1 = new Array [Int ](size)
2098
+ Array .copy(classIds, 0 , classIds1, 0 , classIds.length min size)
2099
+ classIds = classIds1
2100
+ }
2101
+
2102
+ def contains (sym : Symbol ): Boolean =
2103
+ new BaseClassSet (classIds).contains(sym, length)
2104
+
2105
+ def add (sym : Symbol ): Unit = {
2106
+ if (length == classIds.length) resize(length * 2 )
2107
+ classIds(length) = sym.id
2108
+ length += 1
2109
+ }
2110
+
2111
+ def result = {
2112
+ if (length != classIds.length) resize(length)
2113
+ new BaseClassSet (classIds)
2087
2114
}
2088
2115
}
2089
2116
0 commit comments