Improve detection and handling of orphaned coroutine threads.
This commit is contained in:
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user