Skip to content

Commit 5e1e472

Browse files
committed
SI-7974 Avoid calling nonPrivateMember after erasure
One example were this would lead to subtle bugs otherwise is Symbol_apply, where after erasure an overloaded symbol containing Symbol#apply and UniquenessCache#apply is returned. // findMember considered harmful after erasure; e.g. // // scala> exitingErasure(Symbol_apply).isOverloaded // res27: Boolean = true
1 parent b2bf66a commit 5e1e472

File tree

4 files changed

+24
-12
lines changed

4 files changed

+24
-12
lines changed

src/reflect/scala/reflect/internal/Definitions.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,15 +1207,21 @@ trait Definitions extends api.StandardDefinitions {
12071207
}
12081208
def getMemberMethod(owner: Symbol, name: Name): TermSymbol = {
12091209
getMember(owner, name.toTermName) match {
1210-
// todo. member symbol becomes a term symbol in cleanup. is this a bug?
1211-
// case x: MethodSymbol => x
12121210
case x: TermSymbol => x
12131211
case _ => fatalMissingSymbol(owner, name, "method")
12141212
}
12151213
}
12161214

1215+
private lazy val erasurePhase = findPhaseWithName("erasure")
12171216
def getMemberIfDefined(owner: Symbol, name: Name): Symbol =
1218-
owner.info.nonPrivateMember(name)
1217+
// findMember considered harmful after erasure; e.g.
1218+
//
1219+
// scala> exitingErasure(Symbol_apply).isOverloaded
1220+
// res27: Boolean = true
1221+
//
1222+
enteringPhaseNotLaterThan(erasurePhase )(
1223+
owner.info.nonPrivateMember(name)
1224+
)
12191225

12201226
/** Using getDecl rather than getMember may avoid issues with
12211227
* OverloadedTypes turning up when you don't want them, if you

src/reflect/scala/reflect/internal/SymbolTable.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,18 @@ abstract class SymbolTable extends macros.Universe
244244
finally popPhase(saved)
245245
}
246246

247+
final def findPhaseWithName(phaseName: String): Phase = {
248+
var ph = phase
249+
while (ph != NoPhase && ph.name != phaseName) {
250+
ph = ph.prev
251+
}
252+
if (ph eq NoPhase) phase else ph
253+
}
254+
final def enteringPhaseWithName[T](phaseName: String)(body: => T): T = {
255+
val phase = findPhaseWithName(phaseName)
256+
enteringPhase(phase)(body)
257+
}
258+
247259
def slowButSafeEnteringPhase[T](ph: Phase)(op: => T): T = {
248260
if (isCompilerUniverse) enteringPhase(ph)(op)
249261
else op

src/reflect/scala/reflect/internal/util/TraceSymbolActivity.scala

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ trait TraceSymbolActivity {
4141
}
4242
}
4343

44-
private def signature(id: Int) = runBeforeErasure(allSymbols(id).defString)
44+
private lazy val erasurePhase = findPhaseWithName("erasure")
45+
private def signature(id: Int) = enteringPhase(erasurePhase)(allSymbols(id).defString)
4546

4647
private def dashes(s: Any): String = ("" + s) map (_ => '-')
4748
private def show(s1: Any, ss: Any*) {
@@ -87,14 +88,6 @@ trait TraceSymbolActivity {
8788
private def showFreq[T, U](xs: Traversable[T])(groupFn: T => U, showFn: U => String) = {
8889
showMapFreq(xs.toList groupBy groupFn)(showFn)
8990
}
90-
private lazy val findErasurePhase: Phase = {
91-
var ph = phase
92-
while (ph != NoPhase && ph.name != "erasure") {
93-
ph = ph.prev
94-
}
95-
if (ph eq NoPhase) phase else ph
96-
}
97-
private def runBeforeErasure[T](body: => T): T = enteringPhase(findErasurePhase)(body)
9891

9992
def showAllSymbols() {
10093
if (!enabled) return

src/reflect/scala/reflect/runtime/JavaUniverseForce.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ trait JavaUniverseForce { self: runtime.JavaUniverse =>
425425
definitions.languageFeatureModule
426426
definitions.metaAnnotations
427427
definitions.AnnotationDefaultAttr
428+
// inaccessible: definitions.erasurePhase
428429
definitions.isPhantomClass
429430
definitions.syntheticCoreClasses
430431
definitions.syntheticCoreMethods

0 commit comments

Comments
 (0)