aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-04-27 09:51:14 -0400
committerChristopher Vogt <oss.nsp@cvogt.org>2016-04-28 13:34:01 -0400
commit1de728fc751669fb08b5263d5ba4df11b64afda0 (patch)
treee362a2c719107c49ed634235ec9f40e22bcc3461
parentb37ccc12d3d6e8fc5fcf2730fc498f5bb8b08655 (diff)
downloadcbt-1de728fc751669fb08b5263d5ba4df11b64afda0.tar.gz
cbt-1de728fc751669fb08b5263d5ba4df11b64afda0.tar.bz2
cbt-1de728fc751669fb08b5263d5ba4df11b64afda0.zip
for better performance do not generate exceptions during class loading for control flow, but use null instead
-rw-r--r--nailgun_launcher/CBTUrlClassLoader.java4
-rw-r--r--stage1/CachingClassLoader.scala9
-rw-r--r--stage1/MultiClassLoader.scala5
3 files changed, 13 insertions, 5 deletions
diff --git a/nailgun_launcher/CBTUrlClassLoader.java b/nailgun_launcher/CBTUrlClassLoader.java
index c05391b..0ba8a61 100644
--- a/nailgun_launcher/CBTUrlClassLoader.java
+++ b/nailgun_launcher/CBTUrlClassLoader.java
@@ -3,6 +3,7 @@ import java.io.*;
import java.net.*;
import java.util.*;
import static cbt.Stage0Lib.*;
+import java.util.concurrent.ConcurrentHashMap;
class CbtURLClassLoader extends java.net.URLClassLoader{
public String toString(){
return (
@@ -15,6 +16,9 @@ class CbtURLClassLoader extends java.net.URLClassLoader{
);
}
public Class loadClass(String name) throws ClassNotFoundException{
+ Class _class = super.loadClass(name);
+ if(_class == null) throw new ClassNotFoundException(name);
+ else return _class;
//System.out.println("loadClass("+name+") on \n"+this);
return super.loadClass(name);
}
diff --git a/stage1/CachingClassLoader.scala b/stage1/CachingClassLoader.scala
index e75f14c..4ddebda 100644
--- a/stage1/CachingClassLoader.scala
+++ b/stage1/CachingClassLoader.scala
@@ -5,8 +5,13 @@ import scala.util.Try
trait CachingClassLoader extends ClassLoader{
def logger: Logger
- val cache = new KeyLockedLazyCache[String,Try[Class[_]]]( new ConcurrentHashMap, new ConcurrentHashMap, Some(logger) )
+ val cache = new KeyLockedLazyCache[String,Option[Class[_]]]( new ConcurrentHashMap, new ConcurrentHashMap, Some(logger) )
override def loadClass(name: String, resolve: Boolean) = {
- cache.get( name, Try(super.loadClass(name, resolve)) ).get
+ cache.get( name, Try(super.loadClass(name, resolve)).toOption ).getOrElse(null)
+ }
+ override def loadClass(name: String) = {
+ val _class = super.loadClass(name)
+ if(_class == null) throw new ClassNotFoundException(name)
+ else _class
}
}
diff --git a/stage1/MultiClassLoader.scala b/stage1/MultiClassLoader.scala
index 5a93a63..cce4cd5 100644
--- a/stage1/MultiClassLoader.scala
+++ b/stage1/MultiClassLoader.scala
@@ -8,14 +8,13 @@ class MultiClassLoader(parents: Seq[ClassLoader])(implicit val logger: Logger) e
override def findClass(name: String) = {
parents.find( parent =>
try{
- parent.loadClass(name)
- true
+ null != parent.loadClass(name) // FIXME: is it correct to just ignore the resolve argument here?
} catch {
case _:ClassNotFoundException => false
}
).map(
_.loadClass(name)
- ).getOrElse( throw new ClassNotFoundException(name) )
+ ).getOrElse( null )
}
override def toString = (
scala.Console.BLUE