Skip to content

Commit e350bd2

Browse files
committed
[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.
1 parent 371bad2 commit e350bd2

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package interpreter
77

88
import scala.tools.nsc.io.{ File, AbstractFile }
99
import util.ScalaClassLoader
10-
import java.net.URL
10+
import java.net.{ URL, URLConnection, URLStreamHandler }
1111
import scala.collection.{ mutable, immutable }
1212

1313
/**
@@ -55,10 +55,24 @@ class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader)
5555
return file
5656
}
5757

58+
// parent delegation in JCL uses getResource; so either add parent.getResAsStream
59+
// or implement findResource, which we do here as a study in scarlet (my complexion
60+
// after looking at CLs and URLs)
61+
override def findResource(name: String): URL = findAbstractFile(name) match {
62+
case null => null
63+
case file => new URL(null, "repldir:" + file.path, new URLStreamHandler {
64+
override def openConnection(url: URL): URLConnection = new URLConnection(url) {
65+
override def connect() { }
66+
override def getInputStream = file.input
67+
}
68+
})
69+
}
70+
// this inverts delegation order: super.getResAsStr calls parent.getRes if we fail
5871
override def getResourceAsStream(name: String) = findAbstractFile(name) match {
5972
case null => super.getResourceAsStream(name)
6073
case file => file.input
6174
}
75+
// ScalaClassLoader.classBytes uses getResAsStream, so we'll try again before delegating
6276
override def classBytes(name: String): Array[Byte] = findAbstractFile(name) match {
6377
case null => super.classBytes(name)
6478
case file => file.toByteArray

test/disabled/run/t6026.check

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Type in expressions to have them evaluated.
2+
Type :help for more information.
3+
4+
scala> class Foo
5+
defined class Foo
6+
7+
scala> :javap Foo
8+
Compiled from "<console>"public class Foo extends java.lang.Object{ public Foo();}
9+
scala>

test/disabled/run/t6026.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
import scala.tools.partest.ReplTest
3+
4+
object Test extends ReplTest {
5+
override def code =
6+
"""|class Foo
7+
|:javap Foo
8+
|""".stripMargin
9+
}

0 commit comments

Comments
 (0)