Skip to content

Commit d4764c5

Browse files
committed
Cache all method and polytypes
1 parent ef993ab commit d4764c5

File tree

2 files changed

+18
-20
lines changed

2 files changed

+18
-20
lines changed

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2663,6 +2663,7 @@ object Types {
26632663
final def isHigherKinded = isInstanceOf[TypeProxy]
26642664

26652665
private[this] var myParamRefs: List[ParamRefType] = null
2666+
private[this] var myStableHash: Byte = 0
26662667

26672668
def paramRefs: List[ParamRefType] = {
26682669
if (myParamRefs == null) myParamRefs = paramNames.indices.toList.map(newParamRef)
@@ -2695,24 +2696,20 @@ object Types {
26952696
x => paramInfos.mapConserve(_.subst(this, x).asInstanceOf[PInfo]),
26962697
x => resType.subst(this, x))
26972698

2698-
protected def prefixString: String
2699-
final override def toString = s"$prefixString($paramNames, $paramInfos, $resType)"
2700-
}
2701-
2702-
abstract class HKLambda extends CachedProxyType with LambdaType {
2703-
final override def underlying(implicit ctx: Context) = resType
2704-
27052699
override def computeHash(bs: Binders) =
27062700
doHash(new Binders(this, bs), paramNames, resType, paramInfos)
27072701

2708-
override def stableHash = resType.stableHash && paramInfos.stableHash
2702+
override def stableHash = {
2703+
if (myStableHash == 0) myStableHash = if (resType.stableHash && paramInfos.stableHash) 1 else -1
2704+
myStableHash > 0
2705+
}
27092706

27102707
final override def equals(that: Any) = equals(that, null)
27112708

27122709
// No definition of `eql` --> fall back on equals, which calls iso
27132710

27142711
final override def iso(that: Any, bs: BinderPairs) = that match {
2715-
case that: HKLambda =>
2712+
case that: LambdaType =>
27162713
paramNames.eqElements(that.paramNames) &&
27172714
companion.eq(that.companion) && {
27182715
val bs1 = new BinderPairs(this, that, bs)
@@ -2722,13 +2719,17 @@ object Types {
27222719
case _ =>
27232720
false
27242721
}
2722+
2723+
protected def prefixString: String
2724+
final override def toString = s"$prefixString($paramNames, $paramInfos, $resType)"
27252725
}
27262726

2727-
abstract class MethodOrPoly extends UncachedGroundType with LambdaType with MethodicType {
2728-
final override def hashCode = System.identityHashCode(this)
2729-
final override def equals(other: Any) = this `eq` other.asInstanceOf[AnyRef]
2727+
abstract class HKLambda extends CachedProxyType with LambdaType {
2728+
final override def underlying(implicit ctx: Context) = resType
27302729
}
27312730

2731+
abstract class MethodOrPoly extends CachedGroundType with LambdaType with MethodicType
2732+
27322733
trait TermLambda extends LambdaType { thisLambdaType =>
27332734
import DepStatus._
27342735
type ThisName = TermName

compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -400,14 +400,11 @@ object ProtoTypes {
400400
/** Ensure that `tl` is not already in constraint, make a copy of necessary */
401401
def ensureFresh(tl: TypeLambda): TypeLambda =
402402
if (state.constraint contains tl) {
403-
var paramInfos = tl.paramInfos
404-
if (tl.isInstanceOf[HKLambda]) {
405-
// HKLambdas care hash-consed, need to create an artificial difference by adding
406-
// a LazyRef to a bound.
407-
val TypeBounds(lo, hi) :: pinfos1 = tl.paramInfos
408-
paramInfos = TypeBounds(lo, LazyRef(_ => hi)) :: pinfos1
409-
}
410-
ensureFresh(tl.newLikeThis(tl.paramNames, paramInfos, tl.resultType))
403+
// Type lambdas are hash-consed, need to create an artificial difference by adding
404+
// a LazyRef to a bound.
405+
val TypeBounds(lo, hi) :: pinfos1 = tl.paramInfos
406+
val newParamInfos = TypeBounds(lo, LazyRef(_ => hi)) :: pinfos1
407+
ensureFresh(tl.newLikeThis(tl.paramNames, newParamInfos, tl.resultType))
411408
}
412409
else tl
413410
val added = ensureFresh(tl)

0 commit comments

Comments
 (0)