improve error reporting.
This commit is contained in:
@@ -173,7 +173,7 @@ public class DebugLib extends LFunction {
|
|||||||
|
|
||||||
protected int sethook(LuaState vm) {
|
protected int sethook(LuaState vm) {
|
||||||
LuaState threadVm = optthreadvm(vm, 1);
|
LuaState threadVm = optthreadvm(vm, 1);
|
||||||
LFunction func = vm.isnoneornil(1)? null: vm.checkfunction(2);
|
LFunction func = vm.isnoneornil(1)? null: vm.checkfunction(1);
|
||||||
String str = vm.optstring(2,"");
|
String str = vm.optstring(2,"");
|
||||||
int count = vm.optint(3,0);
|
int count = vm.optint(3,0);
|
||||||
int mask = 0;
|
int mask = 0;
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class LValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private LValue indexError(LuaState vm, LValue nontable) {
|
private LValue indexError(LuaState vm, LValue nontable) {
|
||||||
vm.error( "attempt to index ? (a "+nontable.luaGetTypeName()+" value)", 1 );
|
vm.error( "attempt to index ? (a "+nontable.luaGetTypeName()+" value)" );
|
||||||
return LNil.NIL;
|
return LNil.NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -982,7 +982,7 @@ public class LuaState extends Lua {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void indexError(LValue nontable) {
|
private void indexError(LValue nontable) {
|
||||||
error( "attempt to index ? (a "+nontable.luaGetTypeName()+" value)", 1 );
|
error( "attempt to index ? (a "+nontable.luaGetTypeName()+" value)" );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LValue luaV_getmetafield(LValue t, LString tag) {
|
public static LValue luaV_getmetafield(LValue t, LString tag) {
|
||||||
@@ -1073,6 +1073,15 @@ public class LuaState extends Lua {
|
|||||||
// Lua Java API
|
// Lua Java API
|
||||||
//===============================================================
|
//===============================================================
|
||||||
|
|
||||||
|
/** @deprecated: use LPrototype.source or LPrototype.sourceshort() instead */
|
||||||
|
public String getSourceFileName(LString s) {
|
||||||
|
return getSourceFileName(s.toJavaString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @deprecated: use LPrototype.source or LPrototype.sourceshort() instead */
|
||||||
|
protected String getSourceFileName(String s) {
|
||||||
|
return LoadState.getSourceName(s);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the file line number info for a particular call frame.
|
* Get the file line number info for a particular call frame.
|
||||||
@@ -2401,7 +2410,7 @@ public class LuaState extends Lua {
|
|||||||
// line number and count hooks
|
// line number and count hooks
|
||||||
private void debugBytecodeHooks(int pc) {
|
private void debugBytecodeHooks(int pc) {
|
||||||
if ( hookfunc != null && (hookmask & LUA_MASKLINE) != 0 ) {
|
if ( hookfunc != null && (hookmask & LUA_MASKLINE) != 0 ) {
|
||||||
int line = debugGetLineNumber(calls[cc]);
|
int line = calls[cc].currentline();
|
||||||
if ( (line != hookline || cc != hookcc) && line >= 0 ) {
|
if ( (line != hookline || cc != hookcc) && line >= 0 ) {
|
||||||
hookline = line;
|
hookline = line;
|
||||||
hookcc = cc;
|
hookcc = cc;
|
||||||
@@ -2418,37 +2427,36 @@ public class LuaState extends Lua {
|
|||||||
|
|
||||||
private void debugCallHooks() {
|
private void debugCallHooks() {
|
||||||
if ( hookfunc != null && ((hookmask & LUA_MASKCALL) != 0) ) {
|
if ( hookfunc != null && ((hookmask & LUA_MASKCALL) != 0) ) {
|
||||||
debugCallHook(LUA_HOOKCALL, debugGetLineNumber(calls[cc]));
|
debugCallHook(LUA_HOOKCALL, calls[cc].currentline());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debugReturnHooks() {
|
private void debugReturnHooks() {
|
||||||
if ( hookfunc != null && ((hookmask & LUA_MASKRET) != 0) ) {
|
if ( hookfunc != null && ((hookmask & LUA_MASKRET) != 0) ) {
|
||||||
debugCallHook(LUA_HOOKRET, debugGetLineNumber(calls[cc]));
|
debugCallHook(LUA_HOOKRET, calls[cc].currentline());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debugTailReturnHooks() {
|
private void debugTailReturnHooks() {
|
||||||
if ( hookfunc != null && ((hookmask & LUA_MASKRET) != 0) ) {
|
if ( hookfunc != null && ((hookmask & LUA_MASKRET) != 0) ) {
|
||||||
debugCallHook(LUA_HOOKTAILRET, debugGetLineNumber(calls[cc]));
|
debugCallHook(LUA_HOOKTAILRET, calls[cc].currentline());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated use CallInfo.currentline() instead
|
|
||||||
*/
|
|
||||||
public static int debugGetLineNumber(CallInfo ci) {
|
|
||||||
return ci.currentline();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void debugCallHook(int mask, int line) {
|
private void debugCallHook(int mask, int line) {
|
||||||
int prevmask = hookmask;
|
int oldmask = hookmask;
|
||||||
int oldtop = top;
|
int oldtop = top;
|
||||||
LValue lineval = LNil.NIL;
|
int oldbase = base;
|
||||||
|
int oldcc = cc;
|
||||||
|
int oldnresults = nresults;
|
||||||
|
int beyond = (cc>=0? base+calls[cc].closure.p.maxstacksize: top);
|
||||||
try {
|
try {
|
||||||
if ( cc >= 0 )
|
|
||||||
top = base + this.calls[cc].closure.p.maxstacksize;
|
|
||||||
hookmask = 0;
|
hookmask = 0;
|
||||||
|
|
||||||
|
// adjust base and top to beyond call frame
|
||||||
|
top = base = beyond;
|
||||||
|
|
||||||
|
// push hook function and arguments
|
||||||
this.pushfunction(hookfunc);
|
this.pushfunction(hookfunc);
|
||||||
switch ( mask ) {
|
switch ( mask ) {
|
||||||
case LUA_HOOKCOUNT: this.pushstring("count"); break;
|
case LUA_HOOKCOUNT: this.pushstring("count"); break;
|
||||||
@@ -2456,17 +2464,25 @@ public class LuaState extends Lua {
|
|||||||
case LUA_HOOKRET: this.pushstring("return"); break;
|
case LUA_HOOKRET: this.pushstring("return"); break;
|
||||||
case LUA_HOOKTAILRET: this.pushstring("tail return"); break;
|
case LUA_HOOKTAILRET: this.pushstring("tail return"); break;
|
||||||
default:
|
default:
|
||||||
lineval = LInteger.valueOf(line);
|
|
||||||
this.pushstring("line");
|
this.pushstring("line");
|
||||||
|
this.pushinteger(line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this.pushlvalue(lineval);
|
|
||||||
this.pcall(2, 0, 0);
|
// make or set up the call
|
||||||
|
this.nresults = 0;
|
||||||
|
if ( this.stack[base].luaStackCall(this) )
|
||||||
|
execute();
|
||||||
|
|
||||||
|
} catch ( Throwable t ) {
|
||||||
|
System.err.println("hook exception: "+t);
|
||||||
} finally {
|
} finally {
|
||||||
hookmask = prevmask;
|
luaV_settop_fillabove(beyond);
|
||||||
top = oldtop;
|
cc = oldcc;
|
||||||
|
base = oldbase;
|
||||||
|
top = oldtop;
|
||||||
|
nresults = oldnresults;
|
||||||
|
hookmask = oldmask ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user