@@ -7,7 +7,7 @@ package interpreter
7
7
8
8
import scala .tools .nsc .io .{ File , AbstractFile }
9
9
import util .ScalaClassLoader
10
- import java .net .URL
10
+ import java .net .{ URL , URLConnection , URLStreamHandler }
11
11
import scala .collection .{ mutable , immutable }
12
12
13
13
/**
@@ -55,10 +55,24 @@ class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader)
55
55
return file
56
56
}
57
57
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
58
71
override def getResourceAsStream (name : String ) = findAbstractFile(name) match {
59
72
case null => super .getResourceAsStream(name)
60
73
case file => file.input
61
74
}
75
+ // ScalaClassLoader.classBytes uses getResAsStream, so we'll try again before delegating
62
76
override def classBytes (name : String ): Array [Byte ] = findAbstractFile(name) match {
63
77
case null => super .classBytes(name)
64
78
case file => file.toByteArray
0 commit comments