Index: src/org/python/core/PyReflectedConstructor.java =================================================================== --- src/org/python/core/PyReflectedConstructor.java (revision 7128) +++ src/org/python/core/PyReflectedConstructor.java (working copy) @@ -203,9 +203,9 @@ protected void constructProxy(PyObject obj, Constructor ctor, Object[] args, Class proxy) { // Do the actual constructor call Object jself = null; - ThreadState ts = Py.getThreadState(); + PyObject previous = ThreadContext.initializingProxy.get(); + ThreadContext.initializingProxy.set(obj); try { - ts.pushInitializingProxy(obj); try { jself = ctor.newInstance(args); } catch (InvocationTargetException e) { @@ -222,7 +222,7 @@ throw Py.JavaError(t); } } finally { - ts.popInitializingProxy(); + ThreadContext.initializingProxy.set(previous); } obj.javaProxy = jself; } Index: src/org/python/core/PyObject.java =================================================================== --- src/org/python/core/PyObject.java (revision 7128) +++ src/org/python/core/PyObject.java (working copy) @@ -130,9 +130,9 @@ throw Py.SystemError("Automatic proxy initialization should only occur on proxy classes"); } PyProxy proxy; - ThreadState ts = Py.getThreadState(); + PyObject previous = ThreadContext.initializingProxy.get(); + ThreadContext.initializingProxy.set(this); try { - ts.pushInitializingProxy(this); try { proxy = (PyProxy)c.newInstance(); } catch (java.lang.InstantiationException e) { @@ -148,7 +148,7 @@ throw Py.JavaError(exc); } } finally { - ts.popInitializingProxy(); + ThreadContext.initializingProxy.set(previous); } if (javaProxy != null && javaProxy != proxy) { throw Py.TypeError("Proxy instance already initialized"); Index: src/org/python/core/ThreadState.java =================================================================== --- src/org/python/core/ThreadState.java (revision 7128) +++ src/org/python/core/ThreadState.java (working copy) @@ -25,31 +25,8 @@ public TraceFunction profilefunc; - private LinkedList initializingProxies; - private PyDictionary compareStateDict; - public PyObject getInitializingProxy() { - if (initializingProxies == null) { - return null; - } - return initializingProxies.peek(); - } - - public void pushInitializingProxy(PyObject proxy) { - if (initializingProxies == null) { - initializingProxies = new LinkedList(); - } - initializingProxies.addFirst(proxy); - } - - public void popInitializingProxy() { - if (initializingProxies == null || initializingProxies.isEmpty()) { - throw Py.RuntimeError("invalid initializing proxies state"); - } - initializingProxies.removeFirst(); - } - public ThreadState(Thread t, PySystemState systemState) { this.systemState = systemState; thread = t; Index: src/org/python/core/ThreadContext.java =================================================================== --- src/org/python/core/ThreadContext.java (revision 0) +++ src/org/python/core/ThreadContext.java (revision 0) @@ -0,0 +1,8 @@ +// Used to manage re-entrant context on the stack, as opposed to a thread-specific global state +package org.python.core; + +class ThreadContext { + + static ThreadLocal initializingProxy = new ThreadLocal(); + +} \ No newline at end of file Index: src/org/python/core/Py.java =================================================================== --- src/org/python/core/Py.java (revision 7128) +++ src/org/python/core/Py.java (working copy) @@ -892,8 +892,8 @@ { if (proxy._getPyInstance() != null) return; - ThreadState ts = getThreadState(); - PyObject instance = ts.getInitializingProxy(); + PyObject instance = ThreadContext.initializingProxy.get(); + ThreadState ts = Py.getThreadState(); if (instance != null) { if (instance.javaProxy != null) { throw Py.TypeError("Proxy instance reused");