Improve detection and handling of orphaned coroutine threads.

This commit is contained in:
James Roseborough
2012-01-23 17:17:17 +00:00
parent c46ee6b9bd
commit f283aae6a8

View File

@@ -24,7 +24,6 @@ package org.luaj.vm2.lib;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.lang.ref.WeakReference;
import org.luaj.vm2.LoadState; import org.luaj.vm2.LoadState;
import org.luaj.vm2.Lua; import org.luaj.vm2.Lua;
@@ -359,24 +358,17 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
} }
public static Varargs pcall(LuaValue func, Varargs args, LuaValue errfunc) { public static Varargs pcall(LuaValue func, Varargs args, LuaValue errfunc) {
LuaValue olderr = LuaThread.setErrorFunc(errfunc);
try { try {
if (errfunc == null) { Varargs result = varargsOf(LuaValue.TRUE, func.invoke(args));
return varargsOf(LuaValue.TRUE, func.invoke(args)); LuaThread.setErrorFunc(olderr);
} else { return result;
LuaValue preverr = LuaThread.setErrorFunc(errfunc);
WeakReference ref = new WeakReference(LuaThread.getRunning());
try {
return varargsOf(LuaValue.TRUE, func.invoke(args));
} finally {
LuaThread lt = (LuaThread) ref.get();
if (lt != null)
lt.err = preverr;
}
}
} catch ( LuaError le ) { } catch ( LuaError le ) {
LuaThread.setErrorFunc(olderr);
String m = le.getMessage(); String m = le.getMessage();
return varargsOf(FALSE, m!=null? valueOf(m): NIL); return varargsOf(FALSE, m!=null? valueOf(m): NIL);
} catch ( Exception e ) { } catch ( Exception e ) {
LuaThread.setErrorFunc(olderr);
String m = e.getMessage(); String m = e.getMessage();
return varargsOf(FALSE, valueOf(m!=null? m: e.toString())); return varargsOf(FALSE, valueOf(m!=null? m: e.toString()));
} }