Improve compatibility with C-based lua.
This commit is contained in:
@@ -40,10 +40,14 @@ public class LuaError extends RuntimeException {
|
|||||||
private static String errorHook(String msg) {
|
private static String errorHook(String msg) {
|
||||||
LuaThread thread = LuaThread.getRunning();
|
LuaThread thread = LuaThread.getRunning();
|
||||||
if ( thread.err != null ) {
|
if ( thread.err != null ) {
|
||||||
|
LuaValue errfunc = thread.err;
|
||||||
|
thread.err = null;
|
||||||
try {
|
try {
|
||||||
return thread.err.call( LuaValue.valueOf(msg) ).tojstring();
|
return errfunc.call( LuaValue.valueOf(msg) ).tojstring();
|
||||||
} catch ( Throwable t ) {
|
} catch ( Throwable t ) {
|
||||||
return "error in error handling";
|
return "error in error handling";
|
||||||
|
} finally {
|
||||||
|
thread.err = errfunc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return msg;
|
return msg;
|
||||||
|
|||||||
@@ -238,44 +238,22 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
|
|||||||
return varargsOf(NIL, valueOf(e.getMessage()));
|
return varargsOf(NIL, valueOf(e.getMessage()));
|
||||||
}
|
}
|
||||||
case 5: // "pcall", // (f, arg1, ...) -> status, result1, ...
|
case 5: // "pcall", // (f, arg1, ...) -> status, result1, ...
|
||||||
try {
|
{
|
||||||
LuaThread.onCall(this);
|
LuaThread.onCall(this);
|
||||||
try {
|
try {
|
||||||
return varargsOf(LuaValue.TRUE, args.arg1().invoke(args.subargs(2)));
|
return pcall(args.arg1(),args.subargs(2),null);
|
||||||
} finally {
|
} finally {
|
||||||
LuaThread.onReturn();
|
LuaThread.onReturn();
|
||||||
}
|
}
|
||||||
} catch ( LuaError le ) {
|
|
||||||
String m = le.getMessage();
|
|
||||||
return varargsOf(FALSE, m!=null? valueOf(m): NIL);
|
|
||||||
} catch ( Exception e ) {
|
|
||||||
String m = e.getMessage();
|
|
||||||
return varargsOf(FALSE, valueOf(m!=null? m: e.toString()));
|
|
||||||
}
|
}
|
||||||
case 6: // "xpcall", // (f, err) -> result1, ...
|
case 6: // "xpcall", // (f, err) -> result1, ...
|
||||||
{
|
{
|
||||||
LuaValue errfunc = args.checkvalue(2);
|
|
||||||
try {
|
|
||||||
LuaThread.onCall(this);
|
LuaThread.onCall(this);
|
||||||
try {
|
try {
|
||||||
LuaThread thread = LuaThread.getRunning();
|
return pcall(args.arg1(),NONE,args.checkvalue(2));
|
||||||
LuaValue olderr = thread.err;
|
|
||||||
try {
|
|
||||||
thread.err = errfunc;
|
|
||||||
return varargsOf(LuaValue.TRUE, args.arg1().invoke(args.subargs(2)));
|
|
||||||
} finally {
|
|
||||||
thread.err = olderr;
|
|
||||||
}
|
|
||||||
} finally {
|
} finally {
|
||||||
LuaThread.onReturn();
|
LuaThread.onReturn();
|
||||||
}
|
}
|
||||||
} catch ( LuaError le ) {
|
|
||||||
String m = le.getMessage();
|
|
||||||
return varargsOf(FALSE, m!=null? valueOf(m): NIL);
|
|
||||||
} catch ( Exception e ) {
|
|
||||||
String m = e.getMessage();
|
|
||||||
return varargsOf(FALSE, valueOf(m!=null? m: e.toString()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case 7: // "print", // (...) -> void
|
case 7: // "print", // (...) -> void
|
||||||
{
|
{
|
||||||
@@ -358,6 +336,25 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Varargs pcall(LuaValue func, Varargs args, LuaValue errfunc) {
|
||||||
|
try {
|
||||||
|
LuaThread thread = LuaThread.getRunning();
|
||||||
|
LuaValue olderr = thread.err;
|
||||||
|
try {
|
||||||
|
thread.err = errfunc;
|
||||||
|
return varargsOf(LuaValue.TRUE, func.invoke(args));
|
||||||
|
} finally {
|
||||||
|
thread.err = olderr;
|
||||||
|
}
|
||||||
|
} catch ( LuaError le ) {
|
||||||
|
String m = le.getMessage();
|
||||||
|
return varargsOf(FALSE, m!=null? valueOf(m): NIL);
|
||||||
|
} catch ( Exception e ) {
|
||||||
|
String m = e.getMessage();
|
||||||
|
return varargsOf(FALSE, valueOf(m!=null? m: e.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Varargs loadFile(String filename) throws IOException {
|
public static Varargs loadFile(String filename) throws IOException {
|
||||||
InputStream is = FINDER.findResource(filename);
|
InputStream is = FINDER.findResource(filename);
|
||||||
if ( is == null )
|
if ( is == null )
|
||||||
|
|||||||
@@ -286,3 +286,20 @@ print( 'pcall(unpack,t,function() end)', pcall(unpack,t,function() end) );
|
|||||||
-- _VERSION
|
-- _VERSION
|
||||||
print( '_VERSION', type(_VERSION) )
|
print( '_VERSION', type(_VERSION) )
|
||||||
|
|
||||||
|
-- xpcall
|
||||||
|
local errfunc = function( detail )
|
||||||
|
print( ' in errfunc', type(detail) )
|
||||||
|
return 'response-from-xpcall'
|
||||||
|
end
|
||||||
|
local badfunc = function() error( 'error-from-badfunc' ) end
|
||||||
|
local wrappedbad = function() pcall( badfunc ) end
|
||||||
|
print( 'pcall(badfunc)', pcall(badfunc) )
|
||||||
|
print( 'pcall(badfunc,errfunc)', pcall(badfunc,errfunc) )
|
||||||
|
print( 'pcall(badfunc,badfunc)', pcall(badfunc,badfunc) )
|
||||||
|
print( 'pcall(wrappedbad)', pcall(wrappedbad) )
|
||||||
|
print( 'pcall(wrappedbad,errfunc)', pcall(wrappedbad,errfunc) )
|
||||||
|
print( 'pcall(xpcall(badfunc))', pcall(xpcall,badfunc) )
|
||||||
|
print( 'pcall(xpcall(badfunc,errfunc))', pcall(xpcall,badfunc,errfunc) )
|
||||||
|
print( 'pcall(xpcall(badfunc,badfunc))', pcall(xpcall,badfunc,badfunc) )
|
||||||
|
print( 'pcall(xpcall(wrappedbad))', pcall(xpcall,wrappedbad) )
|
||||||
|
print( 'xpcall(wrappedbad,errfunc)', xpcall(wrappedbad,errfunc) )
|
||||||
|
|||||||
Reference in New Issue
Block a user