--- a/nashorn/src/jdk/internal/dynalink/DynamicLinkerFactory.java Thu Aug 01 12:23:38 2013 +0200
+++ b/nashorn/src/jdk/internal/dynalink/DynamicLinkerFactory.java Wed Aug 07 16:38:44 2013 +0200
@@ -84,6 +84,8 @@
package jdk.internal.dynalink;
import java.lang.invoke.MutableCallSite;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -117,7 +119,9 @@
*/
public static final int DEFAULT_UNSTABLE_RELINK_THRESHOLD = 8;
- private ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ private boolean classLoaderExplicitlySet = false;
+ private ClassLoader classLoader;
+
private List<? extends GuardingDynamicLinker> prioritizedLinkers;
private List<? extends GuardingDynamicLinker> fallbackLinkers;
private int runtimeContextArgCount = 0;
@@ -126,12 +130,13 @@
/**
* Sets the class loader for automatic discovery of available linkers. If not set explicitly, then the thread
- * context class loader at the time of the constructor invocation will be used.
+ * context class loader at the time of {@link #createLinker()} invocation will be used.
*
* @param classLoader the class loader used for the autodiscovery of available linkers.
*/
public void setClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
+ classLoaderExplicitlySet = true;
}
/**
@@ -260,7 +265,8 @@
addClasses(knownLinkerClasses, prioritizedLinkers);
addClasses(knownLinkerClasses, fallbackLinkers);
- final List<GuardingDynamicLinker> discovered = AutoDiscovery.loadLinkers(classLoader);
+ final ClassLoader effectiveClassLoader = classLoaderExplicitlySet ? classLoader : getThreadContextClassLoader();
+ final List<GuardingDynamicLinker> discovered = AutoDiscovery.loadLinkers(effectiveClassLoader);
// Now, concatenate ...
final List<GuardingDynamicLinker> linkers =
new ArrayList<>(prioritizedLinkers.size() + discovered.size()
@@ -303,6 +309,15 @@
runtimeContextArgCount, syncOnRelink, unstableRelinkThreshold);
}
+ private static ClassLoader getThreadContextClassLoader() {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+ @Override
+ public ClassLoader run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+
private static void addClasses(Set<Class<? extends GuardingDynamicLinker>> knownLinkerClasses,
List<? extends GuardingDynamicLinker> linkers) {
for(GuardingDynamicLinker linker: linkers) {