summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/SymbolTable.scala
diff options
context:
space:
mode:
authorSimon Ochsenreither <simon@ochsenreither.de>2013-11-19 19:41:43 +0100
committerSimon Ochsenreither <simon@ochsenreither.de>2014-01-03 02:03:45 +0100
commit5e1e472fa10145606fbe3ff2966c35e2842d3894 (patch)
treeec94101520add84606c941007503a20bd4b8faf3 /src/reflect/scala/reflect/internal/SymbolTable.scala
parentb2bf66a4681dec76281da9469e66e0100ad2709f (diff)
downloadscala-5e1e472fa10145606fbe3ff2966c35e2842d3894.tar.gz
scala-5e1e472fa10145606fbe3ff2966c35e2842d3894.tar.bz2
scala-5e1e472fa10145606fbe3ff2966c35e2842d3894.zip
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
Diffstat (limited to 'src/reflect/scala/reflect/internal/SymbolTable.scala')
-rw-r--r--src/reflect/scala/reflect/internal/SymbolTable.scala12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala
index 0ce5a0fbea..c46a559d6d 100644
--- a/src/reflect/scala/reflect/internal/SymbolTable.scala
+++ b/src/reflect/scala/reflect/internal/SymbolTable.scala
@@ -244,6 +244,18 @@ abstract class SymbolTable extends macros.Universe
finally popPhase(saved)
}
+ final def findPhaseWithName(phaseName: String): Phase = {
+ var ph = phase
+ while (ph != NoPhase && ph.name != phaseName) {
+ ph = ph.prev
+ }
+ if (ph eq NoPhase) phase else ph
+ }
+ final def enteringPhaseWithName[T](phaseName: String)(body: => T): T = {
+ val phase = findPhaseWithName(phaseName)
+ enteringPhase(phase)(body)
+ }
+
def slowButSafeEnteringPhase[T](ph: Phase)(op: => T): T = {
if (isCompilerUniverse) enteringPhase(ph)(op)
else op