diff --git a/src/main/java/lua/CallInfo.java b/src/main/java/lua/CallInfo.java index b98396ef..ad7f1eb8 100644 --- a/src/main/java/lua/CallInfo.java +++ b/src/main/java/lua/CallInfo.java @@ -4,19 +4,20 @@ import lua.io.Closure; public class CallInfo { - public Closure closure; - public int base; + public Closure closure; + public int base; public int top; - public int pc; - public int resultbase; - public int nresults; + public int pc; + public int resultbase; + public int nresults; - public CallInfo(Closure c, int base, int resultoff, int nresults) { - this.closure = c; - this.base = base; - this.resultbase = resultoff; - this.nresults = nresults; - this.pc = 0; - } + public CallInfo(Closure c, int base, int top, int resultoff, int nresults) { + this.closure = c; + this.base = base; + this.top = top; + this.resultbase = resultoff; + this.nresults = nresults; + this.pc = 0; + } } diff --git a/src/main/java/lua/Print.java b/src/main/java/lua/Print.java index 3373b7a1..5f95b13e 100644 --- a/src/main/java/lua/Print.java +++ b/src/main/java/lua/Print.java @@ -291,12 +291,12 @@ public class Print extends Lua { for ( ; i localVariables[i].endpc) { + if (!isActiveVariable(callInfo.pc, localVariables[i])) { + continue; + } else { + DebugUtils.println("localvars["+i+"]=" + localVariables[i].varname.toJavaString()); + } + } + } + + private String getVariable(CallInfo callInfo, int index) { + int count = -1; + LocVars[] localVariables = callInfo.closure.p.locvars; + for (int i = 0; i < localVariables.length; i++) { + if (!isActiveVariable(callInfo.pc, localVariables[i])) { continue; } else { count++; @@ -482,6 +502,10 @@ public class DebugStackState extends StackState implements DebugRequestListener return null; } + + private boolean isActiveVariable(int pc, LocVars localVariable) { + return pc >= localVariable.startpc && pc <= localVariable.endpc; + } private void addVariables(Vector variables, Hashtable variablesSeen, int index) { CallInfo callInfo = calls[index]; @@ -503,6 +527,8 @@ public class DebugStackState extends StackState implements DebugRequestListener for (int i = base; i < top; i++) { String varName = getVariable(callInfo, i-base); if (varName == null) { + // we don't care about the temporary variables and constants + // on the stack continue; } diff --git a/src/main/java/lua/debug/j2se/StandardLuaJVM.java b/src/main/java/lua/debug/j2se/StandardLuaJVM.java index d9c3fbf2..31034c4d 100644 --- a/src/main/java/lua/debug/j2se/StandardLuaJVM.java +++ b/src/main/java/lua/debug/j2se/StandardLuaJVM.java @@ -210,7 +210,8 @@ public class StandardLuaJVM { DebugUtils.println("start debugging..."); DebugSupport debugSupport = new DebugSupportImpl(getRequestPort(), getEventPort()); - getDebugState().setDebugSupport(debugSupport); + getDebugState().setDebugSupport(debugSupport); + getDebugState().setSuspendAtStart(true); // create closure and execute final Closure c = new Closure(state, p);