diff options
author | Som Snytt <som.snytt@gmail.com> | 2013-10-18 12:49:17 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2013-10-18 12:49:17 -0700 |
commit | e350bd2cbc0183d5bedbdb8fd4101f93da30483b (patch) | |
tree | 31dfdd0e3f640ee053b23c72bf984230f258cd19 /src | |
parent | 371bad2fe657d7fd065a47dc38fa5ae1fea882a7 (diff) | |
download | scala-e350bd2cbc0183d5bedbdb8fd4101f93da30483b.tar.gz scala-e350bd2cbc0183d5bedbdb8fd4101f93da30483b.tar.bz2 scala-e350bd2cbc0183d5bedbdb8fd4101f93da30483b.zip |
[nomaster] SI-6026 backport getResource bug fix
Submitted to master under SI-4936, this fix allows :javap
to work when tools.jar is discovered by REPL.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala index 638bca8a72..59508fa951 100644 --- a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala +++ b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala @@ -7,7 +7,7 @@ package interpreter import scala.tools.nsc.io.{ File, AbstractFile } import util.ScalaClassLoader -import java.net.URL +import java.net.{ URL, URLConnection, URLStreamHandler } import scala.collection.{ mutable, immutable } /** @@ -55,10 +55,24 @@ class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader) return file } + // parent delegation in JCL uses getResource; so either add parent.getResAsStream + // or implement findResource, which we do here as a study in scarlet (my complexion + // after looking at CLs and URLs) + override def findResource(name: String): URL = findAbstractFile(name) match { + case null => null + case file => new URL(null, "repldir:" + file.path, new URLStreamHandler { + override def openConnection(url: URL): URLConnection = new URLConnection(url) { + override def connect() { } + override def getInputStream = file.input + } + }) + } + // this inverts delegation order: super.getResAsStr calls parent.getRes if we fail override def getResourceAsStream(name: String) = findAbstractFile(name) match { case null => super.getResourceAsStream(name) case file => file.input } + // ScalaClassLoader.classBytes uses getResAsStream, so we'll try again before delegating override def classBytes(name: String): Array[Byte] = findAbstractFile(name) match { case null => super.classBytes(name) case file => file.toByteArray |