|
1 name = "info"; |
|
2 |
|
3 group = "status"; |
|
4 |
|
5 shortDescription = "Display information about something"; |
|
6 |
|
7 longDescription = "info scripts : Names of scripts being debugged"; |
|
8 longDescription += "\ninfo breakpoints : Status of breakpoints currently set"; |
|
9 longDescription += "\ninfo locals : Local variables of current stack frame"; |
|
10 |
|
11 argumentTypes = [ "subcommand-name" ]; |
|
12 |
|
13 subCommands = [ "breakpoints", "locals", "scripts" ]; |
|
14 |
|
15 function execute() { |
|
16 var arg = arguments[0]; |
|
17 if (arg == undefined) { |
|
18 message("\"info\" must be followed by the name of an info command."); |
|
19 return; |
|
20 } else if (arg == "scripts") { |
|
21 scheduleGetScripts(); |
|
22 state = 1; |
|
23 } else if (arg == "breakpoints") { |
|
24 if (arguments.length > 1) { |
|
25 var id = parseInt(arguments[1]); |
|
26 if (isNaN(id)) { |
|
27 message("Breakpoint id expected."); |
|
28 return; |
|
29 } |
|
30 scheduleGetBreakpointData(id); |
|
31 breakpointId = id; |
|
32 state = 3; |
|
33 } else { |
|
34 scheduleGetBreakpoints(); |
|
35 state = 2; |
|
36 } |
|
37 } else if (arg == "locals") { |
|
38 scheduleGetActivationObject(getCurrentFrameIndex()); |
|
39 state = 4; |
|
40 } else { |
|
41 warning("Undefined info command \"" + arg + "\". Try \"help info\"."); |
|
42 } |
|
43 } |
|
44 |
|
45 function breakpointString(id, data) { |
|
46 var fn = data.fileName; |
|
47 if (fn.length == 0) |
|
48 fn = "<anonymous script, id=" + data.scriptId + ">"; |
|
49 var ret = id + "\t" + (data.enabled ? "yes" : "no") |
|
50 + "\t" + fn + ":" + data.lineNumber; |
|
51 if (data.condition.length != 0) { |
|
52 ret += "\n\tstop only if " + data.condition; |
|
53 } |
|
54 return ret; |
|
55 } |
|
56 |
|
57 function handleResponse(resp) { |
|
58 if (state == 1) { |
|
59 // info scripts |
|
60 var scripts = resp.result; |
|
61 if (scripts == undefined) { |
|
62 message("No scripts loaded."); |
|
63 return; |
|
64 } |
|
65 for (var id in scripts) { |
|
66 var fn = scripts[id].fileName; |
|
67 if (fn.length == 0) |
|
68 fn = "<anonymous script, id=" + id + ">"; |
|
69 message("\t" + fn); |
|
70 } |
|
71 } |
|
72 |
|
73 else if (state == 2) { |
|
74 // info breakpoints |
|
75 var breakpoints = resp.result; |
|
76 if (breakpoints == undefined) { |
|
77 message("No breakpoints set."); |
|
78 return; |
|
79 } |
|
80 message("Id\tEnabled\tWhere"); |
|
81 for (var id in breakpoints) { |
|
82 var data = breakpoints[id]; |
|
83 message(breakpointString(id, data)); |
|
84 } |
|
85 } else if (state == 3) { |
|
86 // info breakpoints N |
|
87 var data = resp.result; |
|
88 if (data == undefined) { |
|
89 message("No breakpoint number " + breakpointId + "."); |
|
90 return; |
|
91 } |
|
92 message("Id\tEnabled\tWhere"); |
|
93 message(breakpointString(breakpointId, data)); |
|
94 } |
|
95 |
|
96 else if (state == 4) { |
|
97 // info locals |
|
98 var act = resp.result; |
|
99 scheduleNewScriptValueIterator(act); |
|
100 state = 5; |
|
101 } else if (state == 5) { |
|
102 var id = resp.result; |
|
103 scheduleGetPropertiesByIterator(id, 100); |
|
104 iteratorId = id; |
|
105 state = 6; |
|
106 } else if (state == 6) { |
|
107 var props = resp.result; |
|
108 if (props.length == 0) { |
|
109 scheduleDeleteScriptValueIterator(iteratorId); |
|
110 state = 7; |
|
111 return; |
|
112 } |
|
113 var maxLength = 0; |
|
114 for (var i = 0; i < props.length; ++i) |
|
115 maxLength = Math.max(props[i].name.length, maxLength); |
|
116 for (var i = 0; i < props.length; ++i) { |
|
117 var prop = props[i]; |
|
118 var msg = prop.name; |
|
119 var pad = maxLength - prop.name.length; |
|
120 for (var j = 0; j < pad; ++j) |
|
121 msg += ' '; |
|
122 message(msg + " : " + prop.valueAsString); |
|
123 } |
|
124 scheduleGetPropertiesByIterator(iteratorId, 100); |
|
125 } else if (state == 7) { |
|
126 // done |
|
127 } |
|
128 } |