1. refactored getCurrentPc() to retrieve the current pc for the stack frame

2. reverted the code to aggregate all visible variables. due to the lack of debugging info about the lexical scope, only local visible variables are returned for now.
This commit is contained in:
Shu Lei
2007-11-06 01:29:57 +00:00
parent d0bd5c9ff8
commit 439f14c267

View File

@@ -100,18 +100,20 @@ public class DebugStackState extends StackState implements DebugRequestListener
Proto p = call.closure.p; Proto p = call.closure.p;
if (p != null && p.source != null) if (p != null && p.source != null)
source = p.source.toJavaString(); source = p.source.toJavaString();
if (p.lineinfo != null && p.lineinfo.length > call.pc) int pc = getCurrentPc(call);
line = String.valueOf(p.lineinfo[call.pc]); if (p.lineinfo != null && p.lineinfo.length > pc)
line = String.valueOf(p.lineinfo[pc]);
// TODO: reverse lookup on function name ???? // TODO: reverse lookup on function name ????
func = call.closure.toJavaString(); func = call.closure.toJavaString();
} }
return source + ":" + line + "(" + func + ")"; return source + ":" + line + "(" + func + ")";
} }
// override and fill in line number info // override and fill in line number info
public void error(String message, int level) { public void error(String message, int level) {
super.error(level <= 0 ? message : getFileLine(cc + 1 - level) + ": " super.error(level <= 0 ?
+ message); message :
getFileLine(cc + 1 - level) + ": " + message);
} }
// use line numbers by default // use line numbers by default
@@ -268,13 +270,18 @@ public class DebugStackState extends StackState implements DebugRequestListener
*/ */
private int getLineNumber(CallInfo ci) { private int getLineNumber(CallInfo ci) {
int[] lineNumbers = ci.closure.p.lineinfo; int[] lineNumbers = ci.closure.p.lineinfo;
int pc = (ci != calls[cc] ? ci.pc - 1 : ci.pc); int pc = getCurrentPc(ci);
int line = (lineNumbers != null && lineNumbers.length > pc ? int line = (lineNumbers != null && lineNumbers.length > pc ?
lineNumbers[pc] : lineNumbers[pc] :
-1); -1);
return line; return line;
} }
private int getCurrentPc(CallInfo ci) {
int pc = (ci != calls[cc] ? ci.pc - 1 : ci.pc);
return pc;
}
// ------------------ commands coming from the debugger ------------------- // ------------------ commands coming from the debugger -------------------
public DebugResponse handleRequest(DebugRequest request) { public DebugResponse handleRequest(DebugRequest request) {
@@ -468,9 +475,7 @@ public class DebugStackState extends StackState implements DebugRequestListener
Vector variables = new Vector(); Vector variables = new Vector();
Hashtable variablesSeen = new Hashtable(); Hashtable variablesSeen = new Hashtable();
for (int i = index; i >= 0; i--) { addVariables(variables, variablesSeen, index);
addVariables(variables, variablesSeen, i);
}
Variable[] result = new Variable[variables.size()]; Variable[] result = new Variable[variables.size()];
for (int i = 0; i < variables.size(); i++) { for (int i = 0; i < variables.size(); i++) {
@@ -483,8 +488,9 @@ public class DebugStackState extends StackState implements DebugRequestListener
private void dumpStack(int index) { private void dumpStack(int index) {
CallInfo callInfo = calls[index]; CallInfo callInfo = calls[index];
LocVars[] localVariables = callInfo.closure.p.locvars; LocVars[] localVariables = callInfo.closure.p.locvars;
int pc = getCurrentPc(callInfo);
for (int i = 0; i < localVariables.length; i++) { for (int i = 0; i < localVariables.length; i++) {
if (!isActiveVariable(callInfo.pc, localVariables[i])) { if (!isActiveVariable(pc, localVariables[i])) {
continue; continue;
} else { } else {
DebugUtils.println("localvars["+i+"]=" + localVariables[i].varname.toJavaString()); DebugUtils.println("localvars["+i+"]=" + localVariables[i].varname.toJavaString());
@@ -495,8 +501,9 @@ public class DebugStackState extends StackState implements DebugRequestListener
private String getVariable(CallInfo callInfo, int index) { private String getVariable(CallInfo callInfo, int index) {
int count = -1; int count = -1;
LocVars[] localVariables = callInfo.closure.p.locvars; LocVars[] localVariables = callInfo.closure.p.locvars;
int pc = getCurrentPc(callInfo);
for (int i = 0; i < localVariables.length; i++) { for (int i = 0; i < localVariables.length; i++) {
if (!isActiveVariable(callInfo.pc, localVariables[i])) { if (!isActiveVariable(pc, localVariables[i])) {
continue; continue;
} else { } else {
count++; count++;