From 370d026c3135cb3a1ee1838201d008a6d88e028f Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Tue, 26 Dec 2017 23:06:25 -0800 Subject: 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 --- .../src/main/scala/mill/scalaplugin/Lib.scala | 23 +++++++++++++++++----- .../main/scala/mill/scalaplugin/ScalaModule.scala | 5 +++-- 2 files changed, 21 insertions(+), 7 deletions(-) (limited to 'scalaplugin') 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), -- cgit v1.2.3