summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-12-16 15:24:34 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-12-16 15:24:34 +0000
commit9ada1110c5311f5a383a8ba48be59aae9337cead (patch)
tree551146091678ce3057b3b91068c668893a478772 /src
parent5c6c2c243c3ba8d4e54af448ef96ed0d8ced3e42 (diff)
downloadscala-9ada1110c5311f5a383a8ba48be59aae9337cead.tar.gz
scala-9ada1110c5311f5a383a8ba48be59aae9337cead.tar.bz2
scala-9ada1110c5311f5a383a8ba48be59aae9337cead.zip
Make the ownPhaseCache field a weak reference.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/SubComponent.scala16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/SubComponent.scala b/src/compiler/scala/tools/nsc/SubComponent.scala
index 445021f22a..4fa9411357 100644
--- a/src/compiler/scala/tools/nsc/SubComponent.scala
+++ b/src/compiler/scala/tools/nsc/SubComponent.scala
@@ -5,6 +5,8 @@
package scala.tools.nsc
+import scala.ref.WeakReference
+
/** An nsc sub-component.
*
* @author Martin Odersky
@@ -42,16 +44,20 @@ abstract class SubComponent {
/** The phase factory */
def newPhase(prev: Phase): Phase
- private var ownPhaseCache: Phase = _
+ private var ownPhaseCache: WeakReference[Phase] = new WeakReference(null)
private var ownPhaseRunId = global.NoRunId
/** The phase corresponding to this subcomponent in the current compiler run */
def ownPhase: Phase = {
- if (ownPhaseRunId != global.currentRunId) {
- ownPhaseCache = global.currentRun.phaseNamed(phaseName)
- ownPhaseRunId = global.currentRunId
+ ownPhaseCache.get match {
+ case Some(phase) if ownPhaseRunId == global.currentRunId =>
+ phase
+ case _ =>
+ val phase = global.currentRun.phaseNamed(phaseName)
+ ownPhaseCache = new WeakReference(phase)
+ ownPhaseRunId = global.currentRunId
+ phase
}
- ownPhaseCache
}
/** The phase defined by this subcomponent. Can be called only after phase is installed by newPhase. */