Fix xpcall arg check logic.

This commit is contained in:
James Roseborough
2010-04-15 14:35:05 +00:00
parent 576cf2068d
commit a77b93681f
3 changed files with 17 additions and 7 deletions

View File

@@ -330,6 +330,10 @@ public class Print extends Lua {
private static String id(Prototype f) { private static String id(Prototype f) {
return "Proto"; return "Proto";
} }
private void _assert(boolean b) {
if ( !b )
throw new NullPointerException("_assert failed");
}
public static void printState(LuaClosure cl, int pc, LuaValue[] stack, int top, Varargs varargs) { public static void printState(LuaClosure cl, int pc, LuaValue[] stack, int top, Varargs varargs) {
// print opcode into buffer // print opcode into buffer

View File

@@ -137,7 +137,8 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
if ( arg == null ) if ( arg == null )
LuaValue.argerror(1, "invalid level"); LuaValue.argerror(1, "invalid level");
} }
return arg.getfenv(); LuaValue e = arg.getfenv();
return e!=null? e: NIL;
} }
case 1: // "getmetatable", // ( object ) -> table case 1: // "getmetatable", // ( object ) -> table
LuaValue mt = arg.getmetatable(); LuaValue mt = arg.getmetatable();
@@ -252,13 +253,15 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
return varargsOf(FALSE, valueOf(m!=null? m: e.toString())); 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 { try {
LuaThread.onCall(this); LuaThread.onCall(this);
try { try {
LuaThread thread = LuaThread.getRunning(); LuaThread thread = LuaThread.getRunning();
LuaValue olderr = thread.err; LuaValue olderr = thread.err;
try { try {
thread.err = args.arg(2); thread.err = errfunc;
return varargsOf(LuaValue.TRUE, args.arg1().invoke(args.subargs(2))); return varargsOf(LuaValue.TRUE, args.arg1().invoke(args.subargs(2)));
} finally { } finally {
thread.err = olderr; thread.err = olderr;
@@ -266,13 +269,14 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
} finally { } finally {
LuaThread.onReturn(); LuaThread.onReturn();
} }
} catch ( LuaError le ) {
String m = le.getMessage();
return varargsOf(FALSE, m!=null? valueOf(m): NIL);
} catch ( Exception e ) { } catch ( Exception e ) {
try { String m = e.getMessage();
return args.arg(2).invoke(valueOf(e.getMessage())); return varargsOf(FALSE, valueOf(m!=null? m: e.toString()));
} catch ( Exception f ) {
return varargsOf(FALSE, valueOf(f.getMessage()));
}
} }
}
case 7: // "print", // (...) -> void case 7: // "print", // (...) -> void
{ {
LuaValue tostring = env.get("tostring"); LuaValue tostring = env.get("tostring");

View File

@@ -29,6 +29,7 @@ import java.net.URL;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.luaj.vm2.LuaThread;
import org.luaj.vm2.LuaValue; import org.luaj.vm2.LuaValue;
/** /**
@@ -89,6 +90,7 @@ public class Luajvm1CompatibilityTest extends TestCase {
PrintStream printStream = new PrintStream( outputStream ); PrintStream printStream = new PrintStream( outputStream );
try { try {
org.luaj.vm2.LuaTable _G = org.luaj.vm2.lib.JsePlatform.standardGlobals(); org.luaj.vm2.LuaTable _G = org.luaj.vm2.lib.JsePlatform.standardGlobals();
LuaThread.getRunning().setfenv(_G);
_G.get("package").get("loaders").checktable().insert(1, new org.luaj.vm2.lib.OneArgFunction(_G) { _G.get("package").get("loaders").checktable().insert(1, new org.luaj.vm2.lib.OneArgFunction(_G) {
public LuaValue call(LuaValue arg) { public LuaValue call(LuaValue arg) {
String name = arg.toString(); String name = arg.toString();