diff -r 06d196031fa1 src/org/python/core/Py.java --- a/src/org/python/core/Py.java Wed Jun 25 17:44:39 2014 -0600 +++ b/src/org/python/core/Py.java Thu Jun 26 15:49:37 2014 -0600 @@ -882,7 +882,6 @@ } return loadAndInitClass(name, Thread.currentThread().getContextClassLoader()); } - /** * Tries to find a Java class. * @param name Name of the Java class. diff -r 06d196031fa1 src/org/python/core/PyBaseCode.java --- a/src/org/python/core/PyBaseCode.java Wed Jun 25 17:44:39 2014 -0600 +++ b/src/org/python/core/PyBaseCode.java Thu Jun 26 15:49:37 2014 -0600 @@ -64,7 +64,7 @@ } PyObject ret; - ThreadStateMapping.enterCall(ts); + ClassLoader previous_classloader = ThreadStateMapping.enterCall(ts); try { ret = interpret(frame, ts); } catch (Throwable t) { @@ -86,7 +86,7 @@ ts.frame = ts.frame.f_back; throw pye; } finally { - ThreadStateMapping.exitCall(ts); + ThreadStateMapping.exitCall(ts, previous_classloader); } if (frame.tracefunc != null) { diff -r 06d196031fa1 src/org/python/core/PyTableCode.java --- a/src/org/python/core/PyTableCode.java Wed Jun 25 17:44:39 2014 -0600 +++ b/src/org/python/core/PyTableCode.java Thu Jun 26 15:49:37 2014 -0600 @@ -161,7 +161,7 @@ } PyObject ret; - ThreadStateMapping.enterCall(ts); + ClassLoader previous_classloader = ThreadStateMapping.enterCall(ts); try { ret = funcs.call_function(func_id, frame, ts); } catch (Throwable t) { @@ -183,7 +183,7 @@ ts.frame = ts.frame.f_back; throw pye; } finally { - ThreadStateMapping.exitCall(ts); + ThreadStateMapping.exitCall(ts, previous_classloader); } if (frame.tracefunc != null) { diff -r 06d196031fa1 src/org/python/core/ThreadStateMapping.java --- a/src/org/python/core/ThreadStateMapping.java Wed Jun 25 17:44:39 2014 -0600 +++ b/src/org/python/core/ThreadStateMapping.java Thu Jun 26 15:49:37 2014 -0600 @@ -39,21 +39,34 @@ return ts; } - public static void enterCall(ThreadState ts) { + public static ClassLoader enterCall(ThreadState ts) { + ClassLoader previous = null; if (ts.call_depth == 0) { scopedThreadState.get()[0] = ts; -// Thread.currentThread().setContextClassLoader(imp.getSyspathJavaLoader()); + previous = Thread.currentThread().getContextClassLoader(); + if (previous != null) + try { + Thread.currentThread().setContextClassLoader(imp.getSyspathJavaLoader()); + } catch (SecurityException e) { + } } else if (ts.call_depth > ts.systemState.getrecursionlimit()) { throw Py.RuntimeError("maximum recursion depth exceeded"); } ts.call_depth++; + return previous; } - public static void exitCall(ThreadState ts) { + public static void exitCall(ThreadState ts, ClassLoader previous) { ts.call_depth--; if (ts.call_depth == 0) { + assert scopedThreadState.get()[0] == ts; scopedThreadState.get()[0] = null; -// Thread.currentThread().setContextClassLoader(null); + System.err.println( + "contextClassLoader thread=" + Thread.currentThread() + + ", previous=" + previous); + if (previous == null) { + Thread.currentThread().setContextClassLoader(previous); + } } } }