diff options
author | Lukas Rytz <lukas.rytz@typesafe.com> | 2016-04-01 14:05:31 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@typesafe.com> | 2016-04-01 14:05:31 +0200 |
commit | 19dac8212090f81ffd18bad6d7cc929fbff9bec8 (patch) | |
tree | 37943111ae925d9fdd092073a336cff3f6a38e98 /src/reflect/scala | |
parent | ad361859546aaa84349714c0a5890492fec38939 (diff) | |
parent | 6181525f60588228ce99ab3ef2593ecfcfd35066 (diff) | |
download | scala-19dac8212090f81ffd18bad6d7cc929fbff9bec8.tar.gz scala-19dac8212090f81ffd18bad6d7cc929fbff9bec8.tar.bz2 scala-19dac8212090f81ffd18bad6d7cc929fbff9bec8.zip |
Merge pull request #5068 from retronym/topic/jdk8ism2v2.12.0-M4
Accomodate and exploit new library, lang features JDK 8
Diffstat (limited to 'src/reflect/scala')
-rw-r--r-- | src/reflect/scala/reflect/internal/SymbolTable.scala | 28 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/util/ScalaClassLoader.scala | 4 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala index 88a94ab530..6d988479af 100644 --- a/src/reflect/scala/reflect/internal/SymbolTable.scala +++ b/src/reflect/scala/reflect/internal/SymbolTable.scala @@ -375,20 +375,30 @@ abstract class SymbolTable extends macros.Universe def newWeakSet[K <: AnyRef]() = recordCache(new WeakHashSet[K]()) def newAnyRefMap[K <: AnyRef, V]() = recordCache(mutable.AnyRefMap[K, V]()) - def newGeneric[T](f: => T): () => T = { + /** + * Register a cache specified by a factory function and (optionally) a cleanup function. + * + * @return A function that will return cached value, or create a fresh value when a new run is started. + */ + def newGeneric[T](f: => T, cleanup: T => Unit = (x: Any) => ()): () => T = { val NoCached: T = null.asInstanceOf[T] var cached: T = NoCached var cachedRunId = NoRunId - recordCache(new Clearable { - def clear(): Unit = cached = NoCached - }) - () => { - if (currentRunId != cachedRunId || cached == NoCached) { - cached = f - cachedRunId = currentRunId + val clearable = new Clearable with (() => T) { + def clear(): Unit = { + if (cached != NoCached) + cleanup(cached) + cached = NoCached + } + def apply(): T = { + if (currentRunId != cachedRunId || cached == NoCached) { + cached = f + cachedRunId = currentRunId + } + cached } - cached } + recordCache(clearable) } } diff --git a/src/reflect/scala/reflect/internal/util/ScalaClassLoader.scala b/src/reflect/scala/reflect/internal/util/ScalaClassLoader.scala index cc5be92489..f3db2017be 100644 --- a/src/reflect/scala/reflect/internal/util/ScalaClassLoader.scala +++ b/src/reflect/scala/reflect/internal/util/ScalaClassLoader.scala @@ -139,6 +139,10 @@ object ScalaClassLoader { classloaderURLs :+= url super.addURL(url) } + override def close(): Unit = { + super.close() + classloaderURLs = null + } } def fromURLs(urls: Seq[URL], parent: ClassLoader = null): URLClassLoader = |