Skip to content

Commit 93f4b99

Browse files
committed
Link directly to a JAR
1 parent e1365d9 commit 93f4b99

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

compiler/src/dotty/tools/backend/jvm/GenBCode.scala

+16-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import Denotations._
2626
import Phases._
2727
import java.lang.AssertionError
2828
import java.io.{DataOutputStream, File => JFile}
29+
import dotty.tools.io.{Jar, File, Directory}
2930

3031
import scala.tools.asm
3132
import scala.tools.asm.tree._
@@ -49,11 +50,25 @@ class GenBCode extends Phase {
4950
def outputDir(implicit ctx: Context): AbstractFile =
5051
new PlainDirectory(ctx.settings.outputDir.value)
5152

53+
private[this] var classFileOutput: AbstractFile = _
54+
5255
def run(implicit ctx: Context): Unit = {
5356
new GenBCodePipeline(entryPoints.toList,
54-
new DottyBackendInterface(outputDir, superCallsMap.toMap)(ctx))(ctx).run(ctx.compilationUnit.tpdTree)
57+
new DottyBackendInterface(classFileOutput, superCallsMap.toMap)(ctx))(ctx).run(ctx.compilationUnit.tpdTree)
5558
entryPoints.clear()
5659
}
60+
61+
override def runOn(units: List[CompilationUnit])(implicit ctx: Context) = {
62+
val out = outputDir
63+
lazy val tmp = out.subdirectoryNamed("tmp-" + System.currentTimeMillis().toHexString)
64+
classFileOutput = if (ctx.settings.XlinkOptimise.value) tmp else out
65+
val res = super.runOn(units)
66+
if (ctx.settings.XlinkOptimise.value) {
67+
Jar.create(new File(out.fileNamed("linked.jar").file), new Directory(classFileOutput.file), mainClass = "")
68+
tmp.delete()
69+
}
70+
res
71+
}
5772
}
5873

5974
class GenBCodePipeline(val entryPoints: List[Symbol], val int: DottyBackendInterface)(implicit val ctx: Context) extends BCodeSyncAndTry{

compiler/test/dotty/tools/dotc/LinkOptimiseTests.scala

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package dotty
22
package tools
33
package dotc
44

5+
import dotty.tools.io.Jar
6+
57
import java.io.{File => JFile}
68
import java.nio.file.{Files, Path, Paths}
79

@@ -56,11 +58,11 @@ class LinkOptimiseTests extends ParallelTesting {
5658
for (check <- new JFile(sourceDir).listFiles().filter(_.toString.endsWith(checkExt))) {
5759
val outDir = {
5860
def path(str: String) = str.substring(linkDir.length, str.length - checkExt.length)
59-
defaultOutputDir + testName + path(check.toString) + "/"
61+
defaultOutputDir + testName + path(check.toString) + "/linked.jar"
6062
}
6163
val expectedClasses = scala.io.Source.fromFile(check).getLines().toSet
62-
val actualClasses = Files.walk(Paths.get(outDir)).iterator().asScala.collect {
63-
case f if f.toString.endsWith(".class") => f.toString.substring(outDir.length, f.toString.length - ".class".length)
64+
val actualClasses = new Jar(outDir).iterator.collect {
65+
case f if f.toString.endsWith(".class") => f.toString.substring(0, f.toString.length - ".class".length)
6466
}.toSet
6567
assertEquals(check.toString, expectedClasses, actualClasses)
6668
}

compiler/test/dotty/tools/vulpix/ParallelTesting.scala

+4-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ trait ParallelTesting extends RunnerOrchestration { self =>
5252
def outDir: JFile
5353
def flags: TestFlags
5454

55-
def runClassPath: String = outDir.getAbsolutePath + ":" + flags.runClassPath
55+
def runClassPath: String = {
56+
val out = outDir.getAbsolutePath + (if (flags.isLinkedOptimised) "/linked.jar" else "")
57+
out + ":" + flags.runClassPath
58+
}
5659

5760
def title: String = self match {
5861
case self: JointCompilationSource =>

compiler/test/dotty/tools/vulpix/TestFlags.scala

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ final case class TestFlags(
1212
TestFlags(defaultClassPath, runClassPath, options diff flags)
1313

1414
def all: Array[String] = Array("-classpath", defaultClassPath) ++ options
15+
16+
def isLinkedOptimised: Boolean = options.contains("-Xlink-optimise")
1517
}
1618

1719
object TestFlags {

0 commit comments

Comments
 (0)