OLD | NEW |
1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 String.prototype.startsWith = function (str) { | 28 String.prototype.startsWith = function (str) { |
29 if (str.length > this.length) | 29 if (str.length > this.length) { |
30 return false; | 30 return false; |
| 31 } |
31 return this.substr(0, str.length) == str; | 32 return this.substr(0, str.length) == str; |
32 } | 33 }; |
33 | 34 |
34 function log10(num) { | 35 function log10(num) { |
35 return Math.log(num)/Math.log(10); | 36 return Math.log(num)/Math.log(10); |
36 } | 37 } |
37 | 38 |
38 function ToInspectableObject(obj) { | 39 function ToInspectableObject(obj) { |
39 if (!obj && typeof obj === 'object') { | 40 if (!obj && typeof obj === 'object') { |
40 return void 0; | 41 return void 0; |
41 } else { | 42 } else { |
42 return Object(obj); | 43 return Object(obj); |
43 } | 44 } |
44 } | 45 } |
45 | 46 |
46 function GetCompletions(global, last, full) { | 47 function GetCompletions(global, last, full) { |
47 var full_tokens = full.split(); | 48 var full_tokens = full.split(); |
48 full = full_tokens.pop(); | 49 full = full_tokens.pop(); |
49 var parts = full.split('.'); | 50 var parts = full.split('.'); |
50 parts.pop(); | 51 parts.pop(); |
51 var current = global; | 52 var current = global; |
52 for (var i = 0; i < parts.length; i++) { | 53 for (var i = 0; i < parts.length; i++) { |
53 var part = parts[i]; | 54 var part = parts[i]; |
54 var next = current[part]; | 55 var next = current[part]; |
55 if (!next) | 56 if (!next) { |
56 return []; | 57 return []; |
| 58 } |
57 current = next; | 59 current = next; |
58 } | 60 } |
59 var result = []; | 61 var result = []; |
60 current = ToInspectableObject(current); | 62 current = ToInspectableObject(current); |
61 while (typeof current !== 'undefined') { | 63 while (typeof current !== 'undefined') { |
62 var mirror = new $debug.ObjectMirror(current); | 64 var mirror = new $debug.ObjectMirror(current); |
63 var properties = mirror.properties(); | 65 var properties = mirror.properties(); |
64 for (var i = 0; i < properties.length; i++) { | 66 for (var i = 0; i < properties.length; i++) { |
65 var name = properties[i].name(); | 67 var name = properties[i].name(); |
66 if (typeof name === 'string' && name.startsWith(last)) | 68 if (typeof name === 'string' && name.startsWith(last)) { |
67 result.push(name); | 69 result.push(name); |
| 70 } |
68 } | 71 } |
69 current = ToInspectableObject(current.__proto__); | 72 current = ToInspectableObject(current.__proto__); |
70 } | 73 } |
71 return result; | 74 return result; |
72 } | 75 } |
73 | 76 |
74 | 77 |
75 // Global object holding debugger related constants and state. | 78 // Global object holding debugger related constants and state. |
76 const Debug = {}; | 79 const Debug = {}; |
77 | 80 |
(...skipping 29 matching lines...) Expand all Loading... |
107 Block: 5 }; | 110 Block: 5 }; |
108 | 111 |
109 | 112 |
110 // Current debug state. | 113 // Current debug state. |
111 const kNoFrame = -1; | 114 const kNoFrame = -1; |
112 Debug.State = { | 115 Debug.State = { |
113 currentFrame: kNoFrame, | 116 currentFrame: kNoFrame, |
114 displaySourceStartLine: -1, | 117 displaySourceStartLine: -1, |
115 displaySourceEndLine: -1, | 118 displaySourceEndLine: -1, |
116 currentSourceLine: -1 | 119 currentSourceLine: -1 |
117 } | 120 }; |
118 var trace_compile = false; // Tracing all compile events? | 121 var trace_compile = false; // Tracing all compile events? |
119 var trace_debug_json = false; // Tracing all debug json packets? | 122 var trace_debug_json = false; // Tracing all debug json packets? |
120 var last_cmd_line = ''; | 123 var last_cmd_line = ''; |
121 //var lol_is_enabled; // Set to true in d8.cc if LIVE_OBJECT_LIST is defined. | 124 //var lol_is_enabled; // Set to true in d8.cc if LIVE_OBJECT_LIST is defined. |
122 var lol_next_dump_index = 0; | 125 var lol_next_dump_index = 0; |
123 const kDefaultLolLinesToPrintAtATime = 10; | 126 const kDefaultLolLinesToPrintAtATime = 10; |
124 const kMaxLolLinesToPrintAtATime = 1000; | 127 const kMaxLolLinesToPrintAtATime = 1000; |
125 var repeat_cmd_line = ''; | 128 var repeat_cmd_line = ''; |
126 var is_running = true; | 129 var is_running = true; |
127 | 130 |
(...skipping 15 matching lines...) Expand all Loading... |
143 is_running = response.running(); | 146 is_running = response.running(); |
144 | 147 |
145 if (response.type() == 'event') { | 148 if (response.type() == 'event') { |
146 return DebugEventDetails(response); | 149 return DebugEventDetails(response); |
147 } else { | 150 } else { |
148 return DebugResponseDetails(response); | 151 return DebugResponseDetails(response); |
149 } | 152 } |
150 } | 153 } |
151 | 154 |
152 function DebugEventDetails(response) { | 155 function DebugEventDetails(response) { |
153 details = {text:'', running:false} | 156 details = {text:'', running:false}; |
154 | 157 |
155 // Get the running state. | 158 // Get the running state. |
156 details.running = response.running(); | 159 details.running = response.running(); |
157 | 160 |
158 var body = response.body(); | 161 var body = response.body(); |
159 var result = ''; | 162 var result = ''; |
160 switch (response.event()) { | 163 switch (response.event()) { |
161 case 'break': | 164 case 'break': |
162 if (body.breakpoints) { | 165 if (body.breakpoints) { |
163 result += 'breakpoint'; | 166 result += 'breakpoint'; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 Debug.State.currentSourceLine = -1; | 213 Debug.State.currentSourceLine = -1; |
211 Debug.State.displaySourceStartLine = -1; | 214 Debug.State.displaySourceStartLine = -1; |
212 Debug.State.displaySourceEndLine = -1; | 215 Debug.State.displaySourceEndLine = -1; |
213 Debug.State.currentFrame = kNoFrame; | 216 Debug.State.currentFrame = kNoFrame; |
214 } | 217 } |
215 details.text = result; | 218 details.text = result; |
216 break; | 219 break; |
217 | 220 |
218 case 'afterCompile': | 221 case 'afterCompile': |
219 if (trace_compile) { | 222 if (trace_compile) { |
220 result = 'Source ' + body.script.name + ' compiled:\n' | 223 result = 'Source ' + body.script.name + ' compiled:\n'; |
221 var source = body.script.source; | 224 var source = body.script.source; |
222 if (!(source[source.length - 1] == '\n')) { | 225 if (!(source[source.length - 1] == '\n')) { |
223 result += source; | 226 result += source; |
224 } else { | 227 } else { |
225 result += source.substring(0, source.length - 1); | 228 result += source.substring(0, source.length - 1); |
226 } | 229 } |
227 } | 230 } |
228 details.text = result; | 231 details.text = result; |
229 break; | 232 break; |
230 | 233 |
231 case 'scriptCollected': | 234 case 'scriptCollected': |
232 details.text = result; | 235 details.text = result; |
233 break; | 236 break; |
234 | 237 |
235 default: | 238 default: |
236 details.text = 'Unknown debug event ' + response.event(); | 239 details.text = 'Unknown debug event ' + response.event(); |
237 } | 240 } |
238 | 241 |
239 return details; | 242 return details; |
240 }; | 243 } |
241 | 244 |
242 | 245 |
243 function SourceInfo(body) { | 246 function SourceInfo(body) { |
244 var result = ''; | 247 var result = ''; |
245 | 248 |
246 if (body.script) { | 249 if (body.script) { |
247 if (body.script.name) { | 250 if (body.script.name) { |
248 result += body.script.name; | 251 result += body.script.name; |
249 } else { | 252 } else { |
250 result += '[unnamed]'; | 253 result += '[unnamed]'; |
(...skipping 21 matching lines...) Expand all Loading... |
272 if (source_text[i] == '\t') { | 275 if (source_text[i] == '\t') { |
273 underline += '\t'; | 276 underline += '\t'; |
274 } else { | 277 } else { |
275 underline += ' '; | 278 underline += ' '; |
276 } | 279 } |
277 } | 280 } |
278 underline += '^'; | 281 underline += '^'; |
279 | 282 |
280 // Return the source line text with the underline beneath. | 283 // Return the source line text with the underline beneath. |
281 return source_text + '\n' + underline; | 284 return source_text + '\n' + underline; |
282 }; | 285 } |
283 | 286 |
284 | 287 |
285 // Converts a text command to a JSON request. | 288 // Converts a text command to a JSON request. |
286 function DebugCommandToJSONRequest(cmd_line) { | 289 function DebugCommandToJSONRequest(cmd_line) { |
287 var result = new DebugRequest(cmd_line).JSONRequest(); | 290 var result = new DebugRequest(cmd_line).JSONRequest(); |
288 if (trace_debug_json && result) { | 291 if (trace_debug_json && result) { |
289 print("sending: '" + result + "'"); | 292 print("sending: '" + result + "'"); |
290 } | 293 } |
291 return result; | 294 return result; |
292 }; | 295 } |
293 | 296 |
294 | 297 |
295 function DebugRequest(cmd_line) { | 298 function DebugRequest(cmd_line) { |
296 // If the very first character is a { assume that a JSON request have been | 299 // If the very first character is a { assume that a JSON request have been |
297 // entered as a command. Converting that to a JSON request is trivial. | 300 // entered as a command. Converting that to a JSON request is trivial. |
298 if (cmd_line && cmd_line.length > 0 && cmd_line.charAt(0) == '{') { | 301 if (cmd_line && cmd_line.length > 0 && cmd_line.charAt(0) == '{') { |
299 this.request_ = cmd_line; | 302 this.request_ = cmd_line; |
300 return; | 303 return; |
301 } | 304 } |
302 | 305 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 break; | 510 break; |
508 } | 511 } |
509 | 512 |
510 default: | 513 default: |
511 throw new Error('Unknown command "' + cmd + '"'); | 514 throw new Error('Unknown command "' + cmd + '"'); |
512 } | 515 } |
513 } | 516 } |
514 | 517 |
515 DebugRequest.prototype.JSONRequest = function() { | 518 DebugRequest.prototype.JSONRequest = function() { |
516 return this.request_; | 519 return this.request_; |
517 } | 520 }; |
518 | 521 |
519 | 522 |
520 function RequestPacket(command) { | 523 function RequestPacket(command) { |
521 this.seq = 0; | 524 this.seq = 0; |
522 this.type = 'request'; | 525 this.type = 'request'; |
523 this.command = command; | 526 this.command = command; |
524 } | 527 } |
525 | 528 |
526 | 529 |
527 RequestPacket.prototype.toJSONProtocol = function() { | 530 RequestPacket.prototype.toJSONProtocol = function() { |
528 // Encode the protocol header. | 531 // Encode the protocol header. |
529 var json = '{'; | 532 var json = '{'; |
530 json += '"seq":' + this.seq; | 533 json += '"seq":' + this.seq; |
531 json += ',"type":"' + this.type + '"'; | 534 json += ',"type":"' + this.type + '"'; |
532 if (this.command) { | 535 if (this.command) { |
533 json += ',"command":' + StringToJSON_(this.command); | 536 json += ',"command":' + StringToJSON_(this.command); |
534 } | 537 } |
535 if (this.arguments) { | 538 if (this.arguments) { |
536 json += ',"arguments":'; | 539 json += ',"arguments":'; |
537 // Encode the arguments part. | 540 // Encode the arguments part. |
538 if (this.arguments.toJSONProtocol) { | 541 if (this.arguments.toJSONProtocol) { |
539 json += this.arguments.toJSONProtocol() | 542 json += this.arguments.toJSONProtocol(); |
540 } else { | 543 } else { |
541 json += SimpleObjectToJSON_(this.arguments); | 544 json += SimpleObjectToJSON_(this.arguments); |
542 } | 545 } |
543 } | 546 } |
544 json += '}'; | 547 json += '}'; |
545 return json; | 548 return json; |
546 } | 549 }; |
547 | 550 |
548 | 551 |
549 DebugRequest.prototype.createRequest = function(command) { | 552 DebugRequest.prototype.createRequest = function(command) { |
550 return new RequestPacket(command); | 553 return new RequestPacket(command); |
551 }; | 554 }; |
552 | 555 |
553 | 556 |
554 // Note: we use detected command repetition as a signal for continuation here. | 557 // Note: we use detected command repetition as a signal for continuation here. |
555 DebugRequest.prototype.createLOLRequest = function(command, | 558 DebugRequest.prototype.createLOLRequest = function(command, |
556 start_index, | 559 start_index, |
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 request.arguments.filter.type = type_filter; | 1306 request.arguments.filter.type = type_filter; |
1304 } | 1307 } |
1305 if (space_filter) { | 1308 if (space_filter) { |
1306 request.arguments.filter.space = space_filter; | 1309 request.arguments.filter.space = space_filter; |
1307 } | 1310 } |
1308 if (prop_filter) { | 1311 if (prop_filter) { |
1309 request.arguments.filter.prop = prop_filter; | 1312 request.arguments.filter.prop = prop_filter; |
1310 } | 1313 } |
1311 | 1314 |
1312 return request; | 1315 return request; |
1313 } | 1316 }; |
1314 | 1317 |
1315 | 1318 |
1316 function extractObjId(args) { | 1319 function extractObjId(args) { |
1317 var id = args; | 1320 var id = args; |
1318 id = id.match(/^@([0-9]+)$/); | 1321 id = id.match(/^@([0-9]+)$/); |
1319 if (id) { | 1322 if (id) { |
1320 id = id[1]; | 1323 id = id[1]; |
1321 } else { | 1324 } else { |
1322 throw new Error('Invalid obj id ' + args + '.'); | 1325 throw new Error('Invalid obj id ' + args + '.'); |
1323 } | 1326 } |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 } else if (args === 'debug json' || args === 'json' || args === 'packets') { | 1495 } else if (args === 'debug json' || args === 'json' || args === 'packets') { |
1493 trace_debug_json = !trace_debug_json; | 1496 trace_debug_json = !trace_debug_json; |
1494 print('Tracing of debug json packets ' + | 1497 print('Tracing of debug json packets ' + |
1495 (trace_debug_json ? 'on' : 'off')); | 1498 (trace_debug_json ? 'on' : 'off')); |
1496 } else { | 1499 } else { |
1497 throw new Error('Invalid trace arguments.'); | 1500 throw new Error('Invalid trace arguments.'); |
1498 } | 1501 } |
1499 } else { | 1502 } else { |
1500 throw new Error('Invalid trace arguments.'); | 1503 throw new Error('Invalid trace arguments.'); |
1501 } | 1504 } |
1502 } | 1505 }; |
1503 | 1506 |
1504 // Handle the help command. | 1507 // Handle the help command. |
1505 DebugRequest.prototype.helpCommand_ = function(args) { | 1508 DebugRequest.prototype.helpCommand_ = function(args) { |
1506 // Help os quite simple. | 1509 // Help os quite simple. |
1507 if (args && args.length > 0) { | 1510 if (args && args.length > 0) { |
1508 print('warning: arguments to \'help\' are ignored'); | 1511 print('warning: arguments to \'help\' are ignored'); |
1509 } | 1512 } |
1510 | 1513 |
1511 print('Note: <> denotes symbollic values to be replaced with real values.'); | 1514 print('Note: <> denotes symbollic values to be replaced with real values.'); |
1512 print('Note: [] denotes optional parts of commands, or optional options / argu
ments.'); | 1515 print('Note: [] denotes optional parts of commands, or optional options / argu
ments.'); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1601 print(' is specified, then a verbose dump will requested. Else, a summa
ry dump'); | 1604 print(' is specified, then a verbose dump will requested. Else, a summa
ry dump'); |
1602 print(' will be requested.'); | 1605 print(' will be requested.'); |
1603 print(''); | 1606 print(''); |
1604 } | 1607 } |
1605 | 1608 |
1606 print('trace compile'); | 1609 print('trace compile'); |
1607 // hidden command: trace debug json - toggles tracing of debug json packets | 1610 // hidden command: trace debug json - toggles tracing of debug json packets |
1608 print(''); | 1611 print(''); |
1609 print('disconnect|exit|quit - disconnects and quits the debugger'); | 1612 print('disconnect|exit|quit - disconnects and quits the debugger'); |
1610 print('help - prints this help information'); | 1613 print('help - prints this help information'); |
1611 } | 1614 }; |
1612 | 1615 |
1613 | 1616 |
1614 function formatHandleReference_(value) { | 1617 function formatHandleReference_(value) { |
1615 if (value.handle() >= 0) { | 1618 if (value.handle() >= 0) { |
1616 return '#' + value.handle() + '#'; | 1619 return '#' + value.handle() + '#'; |
1617 } else { | 1620 } else { |
1618 return '#Transient#'; | 1621 return '#Transient#'; |
1619 } | 1622 } |
1620 } | 1623 } |
1621 | 1624 |
1622 | 1625 |
1623 function formatObject_(value, include_properties) { | 1626 function formatObject_(value, include_properties) { |
1624 var result = ''; | 1627 var result = ''; |
1625 result += formatHandleReference_(value); | 1628 result += formatHandleReference_(value); |
1626 result += ', type: object' | 1629 result += ', type: object'; |
1627 result += ', constructor '; | 1630 result += ', constructor '; |
1628 var ctor = value.constructorFunctionValue(); | 1631 var ctor = value.constructorFunctionValue(); |
1629 result += formatHandleReference_(ctor); | 1632 result += formatHandleReference_(ctor); |
1630 result += ', __proto__ '; | 1633 result += ', __proto__ '; |
1631 var proto = value.protoObjectValue(); | 1634 var proto = value.protoObjectValue(); |
1632 result += formatHandleReference_(proto); | 1635 result += formatHandleReference_(proto); |
1633 result += ', '; | 1636 result += ', '; |
1634 result += value.propertyCount(); | 1637 result += value.propertyCount(); |
1635 result += ' properties.'; | 1638 result += ' properties.'; |
1636 if (include_properties) { | 1639 if (include_properties) { |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1936 | 1939 |
1937 // Rounds number 'num' to 'length' decimal places. | 1940 // Rounds number 'num' to 'length' decimal places. |
1938 function roundNumber(num, length) { | 1941 function roundNumber(num, length) { |
1939 var factor = Math.pow(10, length); | 1942 var factor = Math.pow(10, length); |
1940 return Math.round(num * factor) / factor; | 1943 return Math.round(num * factor) / factor; |
1941 } | 1944 } |
1942 | 1945 |
1943 | 1946 |
1944 // Convert a JSON response to text for display in a text based debugger. | 1947 // Convert a JSON response to text for display in a text based debugger. |
1945 function DebugResponseDetails(response) { | 1948 function DebugResponseDetails(response) { |
1946 details = {text:'', running:false} | 1949 details = { text: '', running: false }; |
1947 | 1950 |
1948 try { | 1951 try { |
1949 if (!response.success()) { | 1952 if (!response.success()) { |
1950 details.text = response.message(); | 1953 details.text = response.message(); |
1951 return details; | 1954 return details; |
1952 } | 1955 } |
1953 | 1956 |
1954 // Get the running state. | 1957 // Get the running state. |
1955 details.running = response.running(); | 1958 details.running = response.running(); |
1956 | 1959 |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2301 default: | 2304 default: |
2302 details.text = | 2305 details.text = |
2303 'Response for unknown command \'' + response.command() + '\'' + | 2306 'Response for unknown command \'' + response.command() + '\'' + |
2304 ' (' + response.raw_json() + ')'; | 2307 ' (' + response.raw_json() + ')'; |
2305 } | 2308 } |
2306 } catch (e) { | 2309 } catch (e) { |
2307 details.text = 'Error: "' + e + '" formatting response'; | 2310 details.text = 'Error: "' + e + '" formatting response'; |
2308 } | 2311 } |
2309 | 2312 |
2310 return details; | 2313 return details; |
2311 }; | 2314 } |
2312 | 2315 |
2313 | 2316 |
2314 /** | 2317 /** |
2315 * Protocol packages send from the debugger. | 2318 * Protocol packages send from the debugger. |
2316 * @param {string} json - raw protocol packet as JSON string. | 2319 * @param {string} json - raw protocol packet as JSON string. |
2317 * @constructor | 2320 * @constructor |
2318 */ | 2321 */ |
2319 function ProtocolPackage(json) { | 2322 function ProtocolPackage(json) { |
2320 this.raw_json_ = json; | 2323 this.raw_json_ = json; |
2321 this.packet_ = JSON.parse(json); | 2324 this.packet_ = JSON.parse(json); |
2322 this.refs_ = []; | 2325 this.refs_ = []; |
2323 if (this.packet_.refs) { | 2326 if (this.packet_.refs) { |
2324 for (var i = 0; i < this.packet_.refs.length; i++) { | 2327 for (var i = 0; i < this.packet_.refs.length; i++) { |
2325 this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i]; | 2328 this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i]; |
2326 } | 2329 } |
2327 } | 2330 } |
2328 } | 2331 } |
2329 | 2332 |
2330 | 2333 |
2331 /** | 2334 /** |
2332 * Get the packet type. | 2335 * Get the packet type. |
2333 * @return {String} the packet type | 2336 * @return {String} the packet type |
2334 */ | 2337 */ |
2335 ProtocolPackage.prototype.type = function() { | 2338 ProtocolPackage.prototype.type = function() { |
2336 return this.packet_.type; | 2339 return this.packet_.type; |
2337 } | 2340 }; |
2338 | 2341 |
2339 | 2342 |
2340 /** | 2343 /** |
2341 * Get the packet event. | 2344 * Get the packet event. |
2342 * @return {Object} the packet event | 2345 * @return {Object} the packet event |
2343 */ | 2346 */ |
2344 ProtocolPackage.prototype.event = function() { | 2347 ProtocolPackage.prototype.event = function() { |
2345 return this.packet_.event; | 2348 return this.packet_.event; |
2346 } | 2349 }; |
2347 | 2350 |
2348 | 2351 |
2349 /** | 2352 /** |
2350 * Get the packet request sequence. | 2353 * Get the packet request sequence. |
2351 * @return {number} the packet request sequence | 2354 * @return {number} the packet request sequence |
2352 */ | 2355 */ |
2353 ProtocolPackage.prototype.requestSeq = function() { | 2356 ProtocolPackage.prototype.requestSeq = function() { |
2354 return this.packet_.request_seq; | 2357 return this.packet_.request_seq; |
2355 } | 2358 }; |
2356 | 2359 |
2357 | 2360 |
2358 /** | 2361 /** |
2359 * Get the packet request sequence. | 2362 * Get the packet request sequence. |
2360 * @return {number} the packet request sequence | 2363 * @return {number} the packet request sequence |
2361 */ | 2364 */ |
2362 ProtocolPackage.prototype.running = function() { | 2365 ProtocolPackage.prototype.running = function() { |
2363 return this.packet_.running ? true : false; | 2366 return this.packet_.running ? true : false; |
2364 } | 2367 }; |
2365 | 2368 |
2366 | 2369 |
2367 ProtocolPackage.prototype.success = function() { | 2370 ProtocolPackage.prototype.success = function() { |
2368 return this.packet_.success ? true : false; | 2371 return this.packet_.success ? true : false; |
2369 } | 2372 }; |
2370 | 2373 |
2371 | 2374 |
2372 ProtocolPackage.prototype.message = function() { | 2375 ProtocolPackage.prototype.message = function() { |
2373 return this.packet_.message; | 2376 return this.packet_.message; |
2374 } | 2377 }; |
2375 | 2378 |
2376 | 2379 |
2377 ProtocolPackage.prototype.command = function() { | 2380 ProtocolPackage.prototype.command = function() { |
2378 return this.packet_.command; | 2381 return this.packet_.command; |
2379 } | 2382 }; |
2380 | 2383 |
2381 | 2384 |
2382 ProtocolPackage.prototype.body = function() { | 2385 ProtocolPackage.prototype.body = function() { |
2383 return this.packet_.body; | 2386 return this.packet_.body; |
2384 } | 2387 }; |
2385 | 2388 |
2386 | 2389 |
2387 ProtocolPackage.prototype.bodyValue = function(index) { | 2390 ProtocolPackage.prototype.bodyValue = function(index) { |
2388 if (index != null) { | 2391 if (index != null) { |
2389 return new ProtocolValue(this.packet_.body[index], this); | 2392 return new ProtocolValue(this.packet_.body[index], this); |
2390 } else { | 2393 } else { |
2391 return new ProtocolValue(this.packet_.body, this); | 2394 return new ProtocolValue(this.packet_.body, this); |
2392 } | 2395 } |
2393 } | 2396 }; |
2394 | 2397 |
2395 | 2398 |
2396 ProtocolPackage.prototype.body = function() { | 2399 ProtocolPackage.prototype.body = function() { |
2397 return this.packet_.body; | 2400 return this.packet_.body; |
2398 } | 2401 }; |
2399 | 2402 |
2400 | 2403 |
2401 ProtocolPackage.prototype.lookup = function(handle) { | 2404 ProtocolPackage.prototype.lookup = function(handle) { |
2402 var value = this.refs_[handle]; | 2405 var value = this.refs_[handle]; |
2403 if (value) { | 2406 if (value) { |
2404 return new ProtocolValue(value, this); | 2407 return new ProtocolValue(value, this); |
2405 } else { | 2408 } else { |
2406 return new ProtocolReference(handle); | 2409 return new ProtocolReference(handle); |
2407 } | 2410 } |
2408 } | 2411 }; |
2409 | 2412 |
2410 | 2413 |
2411 ProtocolPackage.prototype.raw_json = function() { | 2414 ProtocolPackage.prototype.raw_json = function() { |
2412 return this.raw_json_; | 2415 return this.raw_json_; |
2413 } | 2416 }; |
2414 | 2417 |
2415 | 2418 |
2416 function ProtocolValue(value, packet) { | 2419 function ProtocolValue(value, packet) { |
2417 this.value_ = value; | 2420 this.value_ = value; |
2418 this.packet_ = packet; | 2421 this.packet_ = packet; |
2419 } | 2422 } |
2420 | 2423 |
2421 | 2424 |
2422 /** | 2425 /** |
2423 * Get the value type. | 2426 * Get the value type. |
2424 * @return {String} the value type | 2427 * @return {String} the value type |
2425 */ | 2428 */ |
2426 ProtocolValue.prototype.type = function() { | 2429 ProtocolValue.prototype.type = function() { |
2427 return this.value_.type; | 2430 return this.value_.type; |
2428 } | 2431 }; |
2429 | 2432 |
2430 | 2433 |
2431 /** | 2434 /** |
2432 * Get a metadata field from a protocol value. | 2435 * Get a metadata field from a protocol value. |
2433 * @return {Object} the metadata field value | 2436 * @return {Object} the metadata field value |
2434 */ | 2437 */ |
2435 ProtocolValue.prototype.field = function(name) { | 2438 ProtocolValue.prototype.field = function(name) { |
2436 return this.value_[name]; | 2439 return this.value_[name]; |
2437 } | 2440 }; |
2438 | 2441 |
2439 | 2442 |
2440 /** | 2443 /** |
2441 * Check is the value is a primitive value. | 2444 * Check is the value is a primitive value. |
2442 * @return {boolean} true if the value is primitive | 2445 * @return {boolean} true if the value is primitive |
2443 */ | 2446 */ |
2444 ProtocolValue.prototype.isPrimitive = function() { | 2447 ProtocolValue.prototype.isPrimitive = function() { |
2445 return this.isUndefined() || this.isNull() || this.isBoolean() || | 2448 return this.isUndefined() || this.isNull() || this.isBoolean() || |
2446 this.isNumber() || this.isString(); | 2449 this.isNumber() || this.isString(); |
2447 } | 2450 }; |
2448 | 2451 |
2449 | 2452 |
2450 /** | 2453 /** |
2451 * Get the object handle. | 2454 * Get the object handle. |
2452 * @return {number} the value handle | 2455 * @return {number} the value handle |
2453 */ | 2456 */ |
2454 ProtocolValue.prototype.handle = function() { | 2457 ProtocolValue.prototype.handle = function() { |
2455 return this.value_.handle; | 2458 return this.value_.handle; |
2456 } | 2459 }; |
2457 | 2460 |
2458 | 2461 |
2459 /** | 2462 /** |
2460 * Check is the value is undefined. | 2463 * Check is the value is undefined. |
2461 * @return {boolean} true if the value is undefined | 2464 * @return {boolean} true if the value is undefined |
2462 */ | 2465 */ |
2463 ProtocolValue.prototype.isUndefined = function() { | 2466 ProtocolValue.prototype.isUndefined = function() { |
2464 return this.value_.type == 'undefined'; | 2467 return this.value_.type == 'undefined'; |
2465 } | 2468 }; |
2466 | 2469 |
2467 | 2470 |
2468 /** | 2471 /** |
2469 * Check is the value is null. | 2472 * Check is the value is null. |
2470 * @return {boolean} true if the value is null | 2473 * @return {boolean} true if the value is null |
2471 */ | 2474 */ |
2472 ProtocolValue.prototype.isNull = function() { | 2475 ProtocolValue.prototype.isNull = function() { |
2473 return this.value_.type == 'null'; | 2476 return this.value_.type == 'null'; |
2474 } | 2477 }; |
2475 | 2478 |
2476 | 2479 |
2477 /** | 2480 /** |
2478 * Check is the value is a boolean. | 2481 * Check is the value is a boolean. |
2479 * @return {boolean} true if the value is a boolean | 2482 * @return {boolean} true if the value is a boolean |
2480 */ | 2483 */ |
2481 ProtocolValue.prototype.isBoolean = function() { | 2484 ProtocolValue.prototype.isBoolean = function() { |
2482 return this.value_.type == 'boolean'; | 2485 return this.value_.type == 'boolean'; |
2483 } | 2486 }; |
2484 | 2487 |
2485 | 2488 |
2486 /** | 2489 /** |
2487 * Check is the value is a number. | 2490 * Check is the value is a number. |
2488 * @return {boolean} true if the value is a number | 2491 * @return {boolean} true if the value is a number |
2489 */ | 2492 */ |
2490 ProtocolValue.prototype.isNumber = function() { | 2493 ProtocolValue.prototype.isNumber = function() { |
2491 return this.value_.type == 'number'; | 2494 return this.value_.type == 'number'; |
2492 } | 2495 }; |
2493 | 2496 |
2494 | 2497 |
2495 /** | 2498 /** |
2496 * Check is the value is a string. | 2499 * Check is the value is a string. |
2497 * @return {boolean} true if the value is a string | 2500 * @return {boolean} true if the value is a string |
2498 */ | 2501 */ |
2499 ProtocolValue.prototype.isString = function() { | 2502 ProtocolValue.prototype.isString = function() { |
2500 return this.value_.type == 'string'; | 2503 return this.value_.type == 'string'; |
2501 } | 2504 }; |
2502 | 2505 |
2503 | 2506 |
2504 /** | 2507 /** |
2505 * Check is the value is an object. | 2508 * Check is the value is an object. |
2506 * @return {boolean} true if the value is an object | 2509 * @return {boolean} true if the value is an object |
2507 */ | 2510 */ |
2508 ProtocolValue.prototype.isObject = function() { | 2511 ProtocolValue.prototype.isObject = function() { |
2509 return this.value_.type == 'object' || this.value_.type == 'function' || | 2512 return this.value_.type == 'object' || this.value_.type == 'function' || |
2510 this.value_.type == 'error' || this.value_.type == 'regexp'; | 2513 this.value_.type == 'error' || this.value_.type == 'regexp'; |
2511 } | 2514 }; |
2512 | 2515 |
2513 | 2516 |
2514 /** | 2517 /** |
2515 * Get the constructor function | 2518 * Get the constructor function |
2516 * @return {ProtocolValue} constructor function | 2519 * @return {ProtocolValue} constructor function |
2517 */ | 2520 */ |
2518 ProtocolValue.prototype.constructorFunctionValue = function() { | 2521 ProtocolValue.prototype.constructorFunctionValue = function() { |
2519 var ctor = this.value_.constructorFunction; | 2522 var ctor = this.value_.constructorFunction; |
2520 return this.packet_.lookup(ctor.ref); | 2523 return this.packet_.lookup(ctor.ref); |
2521 } | 2524 }; |
2522 | 2525 |
2523 | 2526 |
2524 /** | 2527 /** |
2525 * Get the __proto__ value | 2528 * Get the __proto__ value |
2526 * @return {ProtocolValue} __proto__ value | 2529 * @return {ProtocolValue} __proto__ value |
2527 */ | 2530 */ |
2528 ProtocolValue.prototype.protoObjectValue = function() { | 2531 ProtocolValue.prototype.protoObjectValue = function() { |
2529 var proto = this.value_.protoObject; | 2532 var proto = this.value_.protoObject; |
2530 return this.packet_.lookup(proto.ref); | 2533 return this.packet_.lookup(proto.ref); |
2531 } | 2534 }; |
2532 | 2535 |
2533 | 2536 |
2534 /** | 2537 /** |
2535 * Get the number og properties. | 2538 * Get the number og properties. |
2536 * @return {number} the number of properties | 2539 * @return {number} the number of properties |
2537 */ | 2540 */ |
2538 ProtocolValue.prototype.propertyCount = function() { | 2541 ProtocolValue.prototype.propertyCount = function() { |
2539 return this.value_.properties ? this.value_.properties.length : 0; | 2542 return this.value_.properties ? this.value_.properties.length : 0; |
2540 } | 2543 }; |
2541 | 2544 |
2542 | 2545 |
2543 /** | 2546 /** |
2544 * Get the specified property name. | 2547 * Get the specified property name. |
2545 * @return {string} property name | 2548 * @return {string} property name |
2546 */ | 2549 */ |
2547 ProtocolValue.prototype.propertyName = function(index) { | 2550 ProtocolValue.prototype.propertyName = function(index) { |
2548 var property = this.value_.properties[index]; | 2551 var property = this.value_.properties[index]; |
2549 return property.name; | 2552 return property.name; |
2550 } | 2553 }; |
2551 | 2554 |
2552 | 2555 |
2553 /** | 2556 /** |
2554 * Return index for the property name. | 2557 * Return index for the property name. |
2555 * @param name The property name to look for | 2558 * @param name The property name to look for |
2556 * @return {number} index for the property name | 2559 * @return {number} index for the property name |
2557 */ | 2560 */ |
2558 ProtocolValue.prototype.propertyIndex = function(name) { | 2561 ProtocolValue.prototype.propertyIndex = function(name) { |
2559 for (var i = 0; i < this.propertyCount(); i++) { | 2562 for (var i = 0; i < this.propertyCount(); i++) { |
2560 if (this.value_.properties[i].name == name) { | 2563 if (this.value_.properties[i].name == name) { |
2561 return i; | 2564 return i; |
2562 } | 2565 } |
2563 } | 2566 } |
2564 return null; | 2567 return null; |
2565 } | 2568 }; |
2566 | 2569 |
2567 | 2570 |
2568 /** | 2571 /** |
2569 * Get the specified property value. | 2572 * Get the specified property value. |
2570 * @return {ProtocolValue} property value | 2573 * @return {ProtocolValue} property value |
2571 */ | 2574 */ |
2572 ProtocolValue.prototype.propertyValue = function(index) { | 2575 ProtocolValue.prototype.propertyValue = function(index) { |
2573 var property = this.value_.properties[index]; | 2576 var property = this.value_.properties[index]; |
2574 return this.packet_.lookup(property.ref); | 2577 return this.packet_.lookup(property.ref); |
2575 } | 2578 }; |
2576 | 2579 |
2577 | 2580 |
2578 /** | 2581 /** |
2579 * Check is the value is a string. | 2582 * Check is the value is a string. |
2580 * @return {boolean} true if the value is a string | 2583 * @return {boolean} true if the value is a string |
2581 */ | 2584 */ |
2582 ProtocolValue.prototype.value = function() { | 2585 ProtocolValue.prototype.value = function() { |
2583 return this.value_.value; | 2586 return this.value_.value; |
2584 } | 2587 }; |
2585 | 2588 |
2586 | 2589 |
2587 ProtocolValue.prototype.valueString = function() { | 2590 ProtocolValue.prototype.valueString = function() { |
2588 return this.value_.text; | 2591 return this.value_.text; |
2589 } | 2592 }; |
2590 | 2593 |
2591 | 2594 |
2592 function ProtocolReference(handle) { | 2595 function ProtocolReference(handle) { |
2593 this.handle_ = handle; | 2596 this.handle_ = handle; |
2594 } | 2597 } |
2595 | 2598 |
2596 | 2599 |
2597 ProtocolReference.prototype.handle = function() { | 2600 ProtocolReference.prototype.handle = function() { |
2598 return this.handle_; | 2601 return this.handle_; |
2599 } | 2602 }; |
2600 | 2603 |
2601 | 2604 |
2602 function MakeJSONPair_(name, value) { | 2605 function MakeJSONPair_(name, value) { |
2603 return '"' + name + '":' + value; | 2606 return '"' + name + '":' + value; |
2604 } | 2607 } |
2605 | 2608 |
2606 | 2609 |
2607 function ArrayToJSONObject_(content) { | 2610 function ArrayToJSONObject_(content) { |
2608 return '{' + content.join(',') + '}'; | 2611 return '{' + content.join(',') + '}'; |
2609 } | 2612 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2660 // Replace ", \ and control characters (0x00 - 0x1F). | 2663 // Replace ", \ and control characters (0x00 - 0x1F). |
2661 return '"' + | 2664 return '"' + |
2662 value.replace(ctrlCharMatch_, function (char) { | 2665 value.replace(ctrlCharMatch_, function (char) { |
2663 // Use charmap if possible. | 2666 // Use charmap if possible. |
2664 var mapped = ctrlCharMap_[char]; | 2667 var mapped = ctrlCharMap_[char]; |
2665 if (mapped) return mapped; | 2668 if (mapped) return mapped; |
2666 mapped = char.charCodeAt(); | 2669 mapped = char.charCodeAt(); |
2667 // Convert control character to unicode escape sequence. | 2670 // Convert control character to unicode escape sequence. |
2668 return '\\u00' + | 2671 return '\\u00' + |
2669 '0' + // TODO %NumberToRadixString(Math.floor(mapped / 16), 16) + | 2672 '0' + // TODO %NumberToRadixString(Math.floor(mapped / 16), 16) + |
2670 '0' // TODO %NumberToRadixString(mapped % 16, 16); | 2673 '0'; // TODO %NumberToRadixString(mapped % 16, 16) |
2671 }) | 2674 }) |
2672 + '"'; | 2675 + '"'; |
2673 } | 2676 } |
2674 | 2677 |
2675 // Simple string with no special characters. | 2678 // Simple string with no special characters. |
2676 return '"' + value + '"'; | 2679 return '"' + value + '"'; |
2677 } | 2680 } |
2678 | 2681 |
2679 | 2682 |
2680 /** | 2683 /** |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2731 if (typeof key == 'string') { | 2734 if (typeof key == 'string') { |
2732 var property_value = object[key]; | 2735 var property_value = object[key]; |
2733 | 2736 |
2734 // Format the value based on its type. | 2737 // Format the value based on its type. |
2735 var property_value_json; | 2738 var property_value_json; |
2736 switch (typeof property_value) { | 2739 switch (typeof property_value) { |
2737 case 'object': | 2740 case 'object': |
2738 if (property_value === null) { | 2741 if (property_value === null) { |
2739 property_value_json = 'null'; | 2742 property_value_json = 'null'; |
2740 } else if (typeof property_value.toJSONProtocol == 'function') { | 2743 } else if (typeof property_value.toJSONProtocol == 'function') { |
2741 property_value_json = property_value.toJSONProtocol(true) | 2744 property_value_json = property_value.toJSONProtocol(true); |
2742 } else if (property_value.constructor.name == 'Array'){ | 2745 } else if (property_value.constructor.name == 'Array'){ |
2743 property_value_json = SimpleArrayToJSON_(property_value); | 2746 property_value_json = SimpleArrayToJSON_(property_value); |
2744 } else { | 2747 } else { |
2745 property_value_json = SimpleObjectToJSON_(property_value); | 2748 property_value_json = SimpleObjectToJSON_(property_value); |
2746 } | 2749 } |
2747 break; | 2750 break; |
2748 | 2751 |
2749 case 'boolean': | 2752 case 'boolean': |
2750 property_value_json = BooleanToJSON_(property_value); | 2753 property_value_json = BooleanToJSON_(property_value); |
2751 break; | 2754 break; |
(...skipping 30 matching lines...) Expand all Loading... |
2782 */ | 2785 */ |
2783 function SimpleArrayToJSON_(array) { | 2786 function SimpleArrayToJSON_(array) { |
2784 // Make JSON array representation. | 2787 // Make JSON array representation. |
2785 var json = '['; | 2788 var json = '['; |
2786 for (var i = 0; i < array.length; i++) { | 2789 for (var i = 0; i < array.length; i++) { |
2787 if (i != 0) { | 2790 if (i != 0) { |
2788 json += ','; | 2791 json += ','; |
2789 } | 2792 } |
2790 var elem = array[i]; | 2793 var elem = array[i]; |
2791 if (elem.toJSONProtocol) { | 2794 if (elem.toJSONProtocol) { |
2792 json += elem.toJSONProtocol(true) | 2795 json += elem.toJSONProtocol(true); |
2793 } else if (typeof(elem) === 'object') { | 2796 } else if (typeof(elem) === 'object') { |
2794 json += SimpleObjectToJSON_(elem); | 2797 json += SimpleObjectToJSON_(elem); |
2795 } else if (typeof(elem) === 'boolean') { | 2798 } else if (typeof(elem) === 'boolean') { |
2796 json += BooleanToJSON_(elem); | 2799 json += BooleanToJSON_(elem); |
2797 } else if (typeof(elem) === 'number') { | 2800 } else if (typeof(elem) === 'number') { |
2798 json += NumberToJSON_(elem); | 2801 json += NumberToJSON_(elem); |
2799 } else if (typeof(elem) === 'string') { | 2802 } else if (typeof(elem) === 'string') { |
2800 json += StringToJSON_(elem); | 2803 json += StringToJSON_(elem); |
2801 } else { | 2804 } else { |
2802 json += elem; | 2805 json += elem; |
2803 } | 2806 } |
2804 } | 2807 } |
2805 json += ']'; | 2808 json += ']'; |
2806 return json; | 2809 return json; |
2807 } | 2810 } |
OLD | NEW |