Skip to content

Commit 9128816

Browse files
committed
Cache PhantomNothing, PhantomAny and PhantomAssume symbols.
1 parent 6cadf8d commit 9128816

File tree

4 files changed

+12
-13
lines changed

4 files changed

+12
-13
lines changed

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -976,15 +976,9 @@ class Definitions {
976976

977977
cls
978978
}
979-
980-
def isPhantomAnyOrNothingClass(sym: Symbol)(implicit ctx: Context): Boolean =
981-
(sym.name == tpnme.Any || sym.name == tpnme.Nothing) && (sym.owner eq PhantomClass)
982-
983-
def isPhantomNothingClass(sym: Symbol)(implicit ctx: Context): Boolean =
984-
sym.name == tpnme.Nothing && (sym.owner eq PhantomClass)
985-
986-
def isPhantomAssume(sym: Symbol)(implicit ctx: Context): Boolean =
987-
sym.name == nme.assume_ && (sym.owner eq PhantomClass)
979+
lazy val PhantomAny = PhantomClass.unforcedDecls.find(_.name eq tpnme.Any).asClass
980+
lazy val PhantomNothing = PhantomClass.unforcedDecls.find(_.name eq tpnme.Nothing).asClass
981+
lazy val PhantomAssume = PhantomClass.unforcedDecls.find(_.name eq nme.assume_)
988982

989983
lazy val ErasedPhantomClass = ctx.requiredClass("dotty.runtime.ErasedPhantom")
990984
def ErasedPhantomType(implicit ctx: Context) = ErasedPhantomClass.typeRef

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
4848
private var myAnyClass: ClassSymbol = null
4949
private var myNothingClass: ClassSymbol = null
5050
private var myNullClass: ClassSymbol = null
51+
private var myPhantomNothingClass: ClassSymbol = null
5152
private var myObjectClass: ClassSymbol = null
5253
private var myAnyType: TypeRef = null
5354
private var myNothingType: TypeRef = null
@@ -64,6 +65,10 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
6465
if (myNullClass == null) myNullClass = defn.NullClass
6566
myNullClass
6667
}
68+
def PhantomNothing = {
69+
if (myPhantomNothingClass == null) myPhantomNothingClass = defn.PhantomNothing
70+
myPhantomNothingClass
71+
}
6772
def ObjectClass = {
6873
if (myObjectClass == null) myObjectClass = defn.ObjectClass
6974
myObjectClass
@@ -553,7 +558,7 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
553558
}
554559
if (tp1.symbol eq NothingClass) tp2.isValueTypeOrLambda && (tp2.topType.classSymbol eq AnyClass)
555560
else if (tp1.symbol eq NullClass) isNullable(tp2) && (tp2.topType.classSymbol eq AnyClass)
556-
else if (defn.isPhantomNothingClass(tp1.symbol)) tp2.isValueTypeOrLambda && (tp1.topType == tp2.topType)
561+
else if (tp1.symbol eq PhantomNothing) tp2.isValueTypeOrLambda && (tp1.topType == tp2.topType)
557562
else false
558563
}
559564
case tp1: SingletonType =>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
364364
else if (semiEraseVCs && isDerivedValueClass(sym)) eraseDerivedValueClassRef(tp)
365365
else if (sym == defn.ArrayClass) apply(tp.appliedTo(TypeBounds.empty)) // i966 shows that we can hit a raw Array type.
366366
else if (defn.isSyntheticFunctionClass(sym)) defn.erasedFunctionType(sym)
367-
else if (defn.isPhantomAnyOrNothingClass(tp.symbol)) defn.ErasedPhantomType
367+
else if ((tp.symbol eq defn.PhantomAny) || (tp.symbol eq defn.PhantomNothing)) defn.ErasedPhantomType
368368
else eraseNormalClassRef(tp)
369369
case tp: RefinedType =>
370370
val parent = tp.parent
@@ -507,7 +507,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
507507
}
508508
if (defn.isSyntheticFunctionClass(sym))
509509
sigName(defn.erasedFunctionType(sym))
510-
else if (defn.isPhantomAnyOrNothingClass(tp.symbol))
510+
else if ((tp.symbol eq defn.PhantomAny) || (tp.symbol eq defn.PhantomNothing))
511511
sigName(defn.ErasedPhantomType)
512512
else
513513
normalizeClass(sym.asClass).fullName.asTypeName

compiler/src/dotty/tools/dotc/transform/Erasure.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ object Erasure extends TypeTestsCasts{
454454
val Apply(fun, args) = tree
455455
if (fun.symbol == defn.dummyApply)
456456
typedUnadapted(args.head, pt)
457-
else if (defn.isPhantomAssume(fun.symbol)) {
457+
else if (fun.symbol eq defn.PhantomAssume) {
458458
/* All phantom types are erased to `ErasedPhantom` (an un-instantiable final abstract class),
459459
* hence the only valid term for a `ErasedPhantom` is `null`.
460460
* As `Phantom.assume` is the only way to instantiate phantoms, all runtime values of

0 commit comments

Comments
 (0)