name = "info"; | |
group = "status"; | |
shortDescription = "Display information about something"; | |
longDescription = "info scripts : Names of scripts being debugged"; | |
longDescription += "\ninfo breakpoints : Status of breakpoints currently set"; | |
longDescription += "\ninfo locals : Local variables of current stack frame"; | |
argumentTypes = [ "subcommand-name" ]; | |
subCommands = [ "breakpoints", "locals", "scripts" ]; | |
function execute() { | |
var arg = arguments[0]; | |
if (arg == undefined) { | |
message("\"info\" must be followed by the name of an info command."); | |
return; | |
} else if (arg == "scripts") { | |
scheduleGetScripts(); | |
state = 1; | |
} else if (arg == "breakpoints") { | |
if (arguments.length > 1) { | |
var id = parseInt(arguments[1]); | |
if (isNaN(id)) { | |
message("Breakpoint id expected."); | |
return; | |
} | |
scheduleGetBreakpointData(id); | |
breakpointId = id; | |
state = 3; | |
} else { | |
scheduleGetBreakpoints(); | |
state = 2; | |
} | |
} else if (arg == "locals") { | |
scheduleGetActivationObject(getCurrentFrameIndex()); | |
state = 4; | |
} else { | |
warning("Undefined info command \"" + arg + "\". Try \"help info\"."); | |
} | |
} | |
function breakpointString(id, data) { | |
var fn = data.fileName; | |
if (fn.length == 0) | |
fn = "<anonymous script, id=" + data.scriptId + ">"; | |
var ret = id + "\t" + (data.enabled ? "yes" : "no") | |
+ "\t" + fn + ":" + data.lineNumber; | |
if (data.condition.length != 0) { | |
ret += "\n\tstop only if " + data.condition; | |
} | |
return ret; | |
} | |
function handleResponse(resp) { | |
if (state == 1) { | |
// info scripts | |
var scripts = resp.result; | |
if (scripts == undefined) { | |
message("No scripts loaded."); | |
return; | |
} | |
for (var id in scripts) { | |
var fn = scripts[id].fileName; | |
if (fn.length == 0) | |
fn = "<anonymous script, id=" + id + ">"; | |
message("\t" + fn); | |
} | |
} | |
else if (state == 2) { | |
// info breakpoints | |
var breakpoints = resp.result; | |
if (breakpoints == undefined) { | |
message("No breakpoints set."); | |
return; | |
} | |
message("Id\tEnabled\tWhere"); | |
for (var id in breakpoints) { | |
var data = breakpoints[id]; | |
message(breakpointString(id, data)); | |
} | |
} else if (state == 3) { | |
// info breakpoints N | |
var data = resp.result; | |
if (data == undefined) { | |
message("No breakpoint number " + breakpointId + "."); | |
return; | |
} | |
message("Id\tEnabled\tWhere"); | |
message(breakpointString(breakpointId, data)); | |
} | |
else if (state == 4) { | |
// info locals | |
var act = resp.result; | |
scheduleNewScriptValueIterator(act); | |
state = 5; | |
} else if (state == 5) { | |
var id = resp.result; | |
scheduleGetPropertiesByIterator(id, 100); | |
iteratorId = id; | |
state = 6; | |
} else if (state == 6) { | |
var props = resp.result; | |
if (props.length == 0) { | |
scheduleDeleteScriptValueIterator(iteratorId); | |
state = 7; | |
return; | |
} | |
var maxLength = 0; | |
for (var i = 0; i < props.length; ++i) | |
maxLength = Math.max(props[i].name.length, maxLength); | |
for (var i = 0; i < props.length; ++i) { | |
var prop = props[i]; | |
var msg = prop.name; | |
var pad = maxLength - prop.name.length; | |
for (var j = 0; j < pad; ++j) | |
msg += ' '; | |
message(msg + " : " + prop.valueAsString); | |
} | |
scheduleGetPropertiesByIterator(iteratorId, 100); | |
} else if (state == 7) { | |
// done | |
} | |
} |