@@ -2,7 +2,7 @@ package dotty.tools
2
2
package dotc
3
3
package core
4
4
5
- // import scala.language.{unsafeNulls => _}
5
+ import scala .language .{unsafeNulls => _ }
6
6
7
7
import Types ._ , Contexts ._ , Symbols ._ , Decorators ._ , TypeApplications ._
8
8
import util .SimpleIdentityMap
@@ -36,7 +36,7 @@ object OrderingConstraint {
36
36
37
37
/** A lens for updating a single entry array in one of the three constraint maps */
38
38
abstract class ConstraintLens [T <: AnyRef : ClassTag ] {
39
- def entries (c : OrderingConstraint , poly : TypeLambda ): Array [T ]
39
+ def entries (c : OrderingConstraint , poly : TypeLambda ): Array [T ] | Null
40
40
def updateEntries (c : OrderingConstraint , poly : TypeLambda , entries : Array [T ])(using Context ): OrderingConstraint
41
41
def initial : T
42
42
@@ -53,20 +53,23 @@ object OrderingConstraint {
53
53
def update (prev : OrderingConstraint , current : OrderingConstraint ,
54
54
poly : TypeLambda , idx : Int , entry : T )(using Context ): OrderingConstraint = {
55
55
var es = entries(current, poly)
56
- if (es != null && (es(idx) eq entry)) current
56
+ if (es != null && (es.nn (idx) eq entry)) current
57
57
else {
58
58
val result =
59
59
if (es == null ) {
60
60
es = Array .fill(poly.paramNames.length)(initial)
61
- updateEntries(current, poly, es)
61
+ updateEntries(current, poly, es.nn )
62
62
}
63
- else if (es ne entries(prev, poly))
64
- current // can re-use existing entries array.
65
63
else {
66
- es = es.clone
67
- updateEntries(current, poly, es)
64
+ val prev_es = entries(prev, poly)
65
+ if (prev_es == null || (es.nn ne prev_es.nn))
66
+ current // can re-use existing entries array.
67
+ else {
68
+ es = es.nn.clone
69
+ updateEntries(current, poly, es.nn)
70
+ }
68
71
}
69
- es(idx) = entry
72
+ es.nn (idx) = entry
70
73
result
71
74
}
72
75
}
@@ -85,23 +88,23 @@ object OrderingConstraint {
85
88
}
86
89
87
90
val boundsLens : ConstraintLens [Type ] = new ConstraintLens [Type ] {
88
- def entries (c : OrderingConstraint , poly : TypeLambda ): Array [Type ] =
91
+ def entries (c : OrderingConstraint , poly : TypeLambda ): Array [Type ] | Null =
89
92
c.boundsMap(poly)
90
93
def updateEntries (c : OrderingConstraint , poly : TypeLambda , entries : Array [Type ])(using Context ): OrderingConstraint =
91
94
newConstraint(c.boundsMap.updated(poly, entries), c.lowerMap, c.upperMap)
92
95
def initial = NoType
93
96
}
94
97
95
98
val lowerLens : ConstraintLens [List [TypeParamRef ]] = new ConstraintLens [List [TypeParamRef ]] {
96
- def entries (c : OrderingConstraint , poly : TypeLambda ): Array [List [TypeParamRef ]] =
99
+ def entries (c : OrderingConstraint , poly : TypeLambda ): Array [List [TypeParamRef ]] | Null =
97
100
c.lowerMap(poly)
98
101
def updateEntries (c : OrderingConstraint , poly : TypeLambda , entries : Array [List [TypeParamRef ]])(using Context ): OrderingConstraint =
99
102
newConstraint(c.boundsMap, c.lowerMap.updated(poly, entries), c.upperMap)
100
103
def initial = Nil
101
104
}
102
105
103
106
val upperLens : ConstraintLens [List [TypeParamRef ]] = new ConstraintLens [List [TypeParamRef ]] {
104
- def entries (c : OrderingConstraint , poly : TypeLambda ): Array [List [TypeParamRef ]] =
107
+ def entries (c : OrderingConstraint , poly : TypeLambda ): Array [List [TypeParamRef ]] | Null =
105
108
c.upperMap(poly)
106
109
def updateEntries (c : OrderingConstraint , poly : TypeLambda , entries : Array [List [TypeParamRef ]])(using Context ): OrderingConstraint =
107
110
newConstraint(c.boundsMap, c.lowerMap, c.upperMap.updated(poly, entries))
@@ -203,11 +206,8 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
203
206
204
207
def typeVarOfParam (param : TypeParamRef ): Type = {
205
208
val entries = boundsMap(param.binder)
206
- if (entries == null ) NoType
207
- else {
208
- val tvar = typeVar(entries, param.paramNum)
209
- if (tvar != null ) tvar else NoType
210
- }
209
+ if entries == null then NoType
210
+ else typeVar(entries, param.paramNum)
211
211
}
212
212
213
213
// ---------- Adding TypeLambdas --------------------------------------------------
@@ -472,7 +472,7 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
472
472
}
473
473
474
474
def isRemovable (pt : TypeLambda ): Boolean = {
475
- val entries = boundsMap(pt)
475
+ val entries = boundsMap(pt).nn
476
476
@ tailrec def allRemovable (last : Int ): Boolean =
477
477
if (last < 0 ) true
478
478
else typeVar(entries, last) match {
@@ -491,7 +491,7 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
491
491
(this .typeVarOfParam(tl.paramRefs(0 )) ne that.typeVarOfParam(tl.paramRefs(0 )))
492
492
493
493
def subst (from : TypeLambda , to : TypeLambda )(using Context ): OrderingConstraint =
494
- def swapKey [T ](m : ArrayValuedMap [T ]) = m.remove(from).updated(to, m(from))
494
+ def swapKey [T ](m : ArrayValuedMap [T ]) = m.remove(from).updated(to, m(from).nn )
495
495
var current = newConstraint(swapKey(boundsMap), swapKey(lowerMap), swapKey(upperMap))
496
496
def subst [T <: Type ](x : T ): T = x.subst(from, to).asInstanceOf [T ]
497
497
current.foreachParam {(p, i) =>
@@ -560,21 +560,21 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
560
560
i += 1
561
561
}
562
562
563
- private var myUninstVars : mutable.ArrayBuffer [TypeVar ] = _
563
+ private var myUninstVars : mutable.ArrayBuffer [TypeVar ] | Null = _
564
564
565
565
/** The uninstantiated typevars of this constraint */
566
566
def uninstVars : collection.Seq [TypeVar ] = {
567
- if (myUninstVars == null || myUninstVars.exists(_.inst.exists)) {
567
+ if (myUninstVars == null || myUninstVars.uncheckedNN. exists(_.inst.exists)) {
568
568
myUninstVars = new mutable.ArrayBuffer [TypeVar ]
569
569
boundsMap.foreachBinding { (poly, entries) =>
570
570
for (i <- 0 until paramCount(entries))
571
571
typeVar(entries, i) match {
572
- case tv : TypeVar if ! tv.inst.exists && isBounds(entries(i)) => myUninstVars += tv
572
+ case tv : TypeVar if ! tv.inst.exists && isBounds(entries(i)) => myUninstVars.nn += tv
573
573
case _ =>
574
574
}
575
575
}
576
576
}
577
- myUninstVars
577
+ myUninstVars.nn
578
578
}
579
579
580
580
// ---------- Checking -----------------------------------------------
@@ -617,7 +617,7 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
617
617
case TypeParamRef (binder : TypeLambda , _) => ! contains(binder)
618
618
case _ => false
619
619
620
- def checkClosedType (tp : Type , where : String ) =
620
+ def checkClosedType (tp : Type | Null , where : String ) =
621
621
if tp != null then
622
622
assert(! tp.existsPart(isFreeTypeParamRef), i " unclosed constraint: $this refers to $tp in $where" )
623
623
0 commit comments