src/scripttools/debugging/scripts/commands/info.qs
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripttools/debugging/scripts/commands/info.qs	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,128 @@
+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
+    }
+}