Fixes to getinfo when function is supplied.

This commit is contained in:
James Roseborough
2009-04-08 00:09:46 +00:00
parent 250fde7859
commit 85db250622

View File

@@ -31,6 +31,7 @@ import org.luaj.vm.LPrototype;
import org.luaj.vm.LString; import org.luaj.vm.LString;
import org.luaj.vm.LTable; import org.luaj.vm.LTable;
import org.luaj.vm.LValue; import org.luaj.vm.LValue;
import org.luaj.vm.LoadState;
import org.luaj.vm.Lua; import org.luaj.vm.Lua;
import org.luaj.vm.LuaErrorException; import org.luaj.vm.LuaErrorException;
import org.luaj.vm.LuaState; import org.luaj.vm.LuaState;
@@ -83,11 +84,8 @@ public class DebugLib extends LFunction {
private static final LString METHOD = new LString("method"); private static final LString METHOD = new LString("method");
private static final LString UPVALUE = new LString("upvalue"); private static final LString UPVALUE = new LString("upvalue");
private static final LString FIELD = new LString("field"); private static final LString FIELD = new LString("field");
private static final LString MAINCHUNK = new LString("main chunk");
private static final LString NOSTRING = new LString(""); private static final LString NOSTRING = new LString("");
public static void install( LuaState vm ) { public static void install( LuaState vm ) {
LTable debug = new LTable(); LTable debug = new LTable();
for (int i = 1; i < NAMES.length; i++) for (int i = 1; i < NAMES.length; i++)
@@ -239,16 +237,17 @@ public class DebugLib extends LFunction {
// look up info // look up info
LTable info = new LTable(); LTable info = new LTable();
vm.pushlvalue(info); vm.pushlvalue(info);
LClosure c = si.closure();
for (int i = 0, n = what.length(); i < n; i++) { for (int i = 0, n = what.length(); i < n; i++) {
switch (what.charAt(i)) { switch (what.charAt(i)) {
case 'S': { case 'S': {
if ( si.luainfo != null ) { if ( c != null ) {
LClosure c = si.luainfo.closure; LPrototype p = c.p;
info.put("what", LUA); info.put("what", LUA);
info.put("source", c.p.source); info.put("source", p.source);
info.put("short_src", new LString(si.luainfo.sourcename())); info.put("short_src", new LString(p.sourceshort()));
info.put("linedefined", c.p.linedefined); info.put("linedefined", p.linedefined);
info.put("lastlinedefined", c.p.lastlinedefined); info.put("lastlinedefined", p.lastlinedefined);
} else { } else {
info.put("what", JAVA); info.put("what", JAVA);
info.put("source", JAVASRC); info.put("source", JAVASRC);
@@ -264,7 +263,7 @@ public class DebugLib extends LFunction {
break; break;
} }
case 'u': { case 'u': {
info.put("nups", (si.luainfo!=null? si.luainfo.closure.p.nups: 0)); info.put("nups", (c!=null? c.p.nups: 0));
break; break;
} }
case 'n': { case 'n': {
@@ -274,14 +273,14 @@ public class DebugLib extends LFunction {
break; break;
} }
case 'f': { case 'f': {
info.put( "func", si.luainfo!=null? si.luainfo.closure: si.javafunc ); info.put( "func", si.func );
break; break;
} }
case 'L': { case 'L': {
LTable lines = new LTable(); LTable lines = new LTable();
info.put("activelines", lines); info.put("activelines", lines);
if ( si.luainfo != null ) { if ( si.luainfo != null ) {
int line = threadVm.debugGetLineNumber(si.luainfo); int line = si.luainfo.currentline();
if ( line >= 0 ) if ( line >= 0 )
lines.put(1, LInteger.valueOf(line)); lines.put(1, LInteger.valueOf(line));
} }
@@ -436,13 +435,18 @@ public class DebugLib extends LFunction {
private CallInfo caller; // or null if first item on stack private CallInfo caller; // or null if first item on stack
private int stackpos; // offset into stack private int stackpos; // offset into stack
private CallInfo luainfo; // or null if a java function private CallInfo luainfo; // or null if a java function
private LValue javafunc; // or null if a lua call private LValue func; // or null if a lua call
public StackInfo(LuaState vm, CallInfo caller, int stackpos, CallInfo luainfo, LValue javafunc) { public StackInfo(LuaState vm, CallInfo caller, int stackpos, CallInfo luainfo, LFunction func) {
this.vm = vm; this.vm = vm;
this.caller = caller; this.caller = caller;
this.stackpos = stackpos; this.stackpos = stackpos;
this.luainfo = luainfo; this.luainfo = luainfo;
this.javafunc = javafunc; this.func = func!=null? func: luainfo!=null? luainfo.closure: null;
}
public LClosure closure() {
return luainfo!=null? luainfo.closure:
func!=null&&func.isClosure()? (LClosure)func:
null;
} }
public String sourceline() { public String sourceline() {
if ( luainfo != null ) { if ( luainfo != null ) {
@@ -462,8 +466,8 @@ public class DebugLib extends LFunction {
public String tracename() { public String tracename() {
if ( caller == null ) if ( caller == null )
return "main chunk"; return "main chunk";
if ( javafunc != null ) if ( func != null )
return javafunc.toString(); return func.toString();
LString[] kind = getfunckind(); LString[] kind = getfunckind();
if ( kind == null ) if ( kind == null )
return "function ?"; return "function ?";
@@ -506,7 +510,7 @@ public class DebugLib extends LFunction {
// is there also a java call? // is there also a java call?
if ( ! f.isClosure() ) { if ( ! f.isClosure() ) {
if ( (level--) <= 0 ) { if ( (level--) <= 0 ) {
si[i++] = new StackInfo( vm, ci, a, null, f); si[i++] = new StackInfo( vm, ci, a, null, (LFunction) f);
if ( i >= countlevels ) if ( i >= countlevels )
return si; return si;
} }