diff options
author | Simon Ochsenreither <simon@ochsenreither.de> | 2013-11-19 19:41:43 +0100 |
---|---|---|
committer | Simon Ochsenreither <simon@ochsenreither.de> | 2014-01-03 02:03:45 +0100 |
commit | 5e1e472fa10145606fbe3ff2966c35e2842d3894 (patch) | |
tree | ec94101520add84606c941007503a20bd4b8faf3 /src/reflect/scala/reflect/internal/SymbolTable.scala | |
parent | b2bf66a4681dec76281da9469e66e0100ad2709f (diff) | |
download | scala-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.scala | 12 |
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 |