summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-12-26 23:06:25 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-12-26 23:06:25 -0800
commit370d026c3135cb3a1ee1838201d008a6d88e028f (patch)
treedacdb88cbacc7681a26d195b7b699b69d988b6dc
parent761b0297b44a491b2874068eefcccbbfccec2804 (diff)
downloadmill-370d026c3135cb3a1ee1838201d008a6d88e028f.tar.gz
mill-370d026c3135cb3a1ee1838201d008a6d88e028f.tar.bz2
mill-370d026c3135cb3a1ee1838201d008a6d88e028f.zip
Cache scala compiler jars in a separate classloader from the compiler plugin jars, since the compiler jars change much less frequently and the code can thus be kept hot rather than being discarded each time
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala23
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala5
2 files changed, 21 insertions, 7 deletions
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala b/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala
index b314454c..7dad791d 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/Lib.scala
@@ -26,6 +26,7 @@ object ZincWorker extends Worker[ZincWorker]{
def make() = new ZincWorker
}
class ZincWorker{
+ var scalaClassloaderCache = Option.empty[(Long, ClassLoader)]
var scalaInstanceCache = Option.empty[(Long, ScalaInstance)]
}
object Lib{
@@ -49,6 +50,7 @@ object Lib{
sources: Seq[Path],
compileClasspath: Seq[Path],
compilerClasspath: Seq[Path],
+ pluginClasspath: Seq[Path],
compilerBridge: Path,
scalacOptions: Seq[String],
scalacPluginClasspath: Seq[Path],
@@ -58,21 +60,32 @@ object Lib{
val compileClasspathFiles = compileClasspath.map(_.toIO).toArray
val compilerJars = compilerClasspath.toArray.map(_.toIO)
+ val pluginJars = pluginClasspath.toArray.map(_.toIO)
- val classloaderSig = compilerClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+ val compilerClassloaderSig = compilerClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+ val scalaInstanceSig =
+ compilerClassloaderSig + pluginClasspath.map(p => p.toString().hashCode + p.mtime.toMillis).sum
+
+ val compilerClassLoader = zincWorker.scalaClassloaderCache match{
+ case Some((k, v)) if k == compilerClassloaderSig => v
+ case _ =>
+ val classloader = new URLClassLoader(compilerJars.map(_.toURI.toURL), null)
+ zincWorker.scalaClassloaderCache = Some((compilerClassloaderSig, classloader))
+ classloader
+ }
val scalaInstance = zincWorker.scalaInstanceCache match{
- case Some((k, v)) if k == classloaderSig => v
+ case Some((k, v)) if k == scalaInstanceSig => v
case _ =>
val scalaInstance = new ScalaInstance(
version = scalaVersion,
- loader = new URLClassLoader(compilerJars.map(_.toURI.toURL), null),
+ loader = new URLClassLoader(pluginJars.map(_.toURI.toURL), compilerClassLoader),
libraryJar = grepJar(compilerClasspath, s"scala-library-$scalaVersion.jar"),
compilerJar = grepJar(compilerClasspath, s"scala-compiler-$scalaVersion.jar"),
- allJars = compilerJars,
+ allJars = compilerJars ++ pluginJars,
explicitActual = None
)
- zincWorker.scalaInstanceCache = Some((classloaderSig, scalaInstance))
+ zincWorker.scalaInstanceCache = Some((scalaInstanceSig, scalaInstance))
scalaInstance
}
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
index 49720863..b1102234 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/ScalaModule.scala
@@ -164,8 +164,8 @@ trait ScalaModule extends Module with TaskModule { outer =>
*/
def scalaCompilerClasspath: T[Seq[PathRef]] = T{
resolveDeps(
- T.task{scalaCompilerIvyDeps(scalaVersion()) ++ scalaRuntimeIvyDeps(scalaVersion())},
- )() ++ scalacPluginClasspath()
+ T.task{scalaCompilerIvyDeps(scalaVersion()) ++ scalaRuntimeIvyDeps(scalaVersion())}
+ )()
}
/**
@@ -191,6 +191,7 @@ trait ScalaModule extends Module with TaskModule { outer =>
allSources().map(_.path),
compileDepClasspath().map(_.path),
scalaCompilerClasspath().map(_.path),
+ scalacPluginClasspath().map(_.path),
compilerBridge().path,
scalacOptions(),
scalacPluginClasspath().map(_.path),