Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: src/d8.js

Issue 123021: Add scope chain information to the debugger (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/debug-delay.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 Normal: 2 }; 91 Normal: 2 };
92 92
93 93
94 // The different types of script compilations matching enum 94 // The different types of script compilations matching enum
95 // Script::CompilationType in objects.h. 95 // Script::CompilationType in objects.h.
96 Debug.ScriptCompilationType = { Host: 0, 96 Debug.ScriptCompilationType = { Host: 0,
97 Eval: 1, 97 Eval: 1,
98 JSON: 2 }; 98 JSON: 2 };
99 99
100 100
101 // The different types of scopes matching constants runtime.cc.
102 Debug.ScopeType = { Global: 0,
103 Local: 1,
104 With: 2,
105 Closure: 3 };
106
107
101 // Current debug state. 108 // Current debug state.
102 const kNoFrame = -1; 109 const kNoFrame = -1;
103 Debug.State = { 110 Debug.State = {
104 currentFrame: kNoFrame, 111 currentFrame: kNoFrame,
105 currentSourceLine: -1 112 currentSourceLine: -1
106 } 113 }
107 var trace_compile = false; // Tracing all compile events? 114 var trace_compile = false; // Tracing all compile events?
108 115
109 116
110 // Process a debugger JSON message into a display text and a running status. 117 // Process a debugger JSON message into a display text and a running status.
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 case 'backtrace': 295 case 'backtrace':
289 case 'bt': 296 case 'bt':
290 this.request_ = this.backtraceCommandToJSONRequest_(args); 297 this.request_ = this.backtraceCommandToJSONRequest_(args);
291 break; 298 break;
292 299
293 case 'frame': 300 case 'frame':
294 case 'f': 301 case 'f':
295 this.request_ = this.frameCommandToJSONRequest_(args); 302 this.request_ = this.frameCommandToJSONRequest_(args);
296 break; 303 break;
297 304
305 case 'scopes':
306 this.request_ = this.scopesCommandToJSONRequest_(args);
307 break;
308
309 case 'scope':
310 this.request_ = this.scopeCommandToJSONRequest_(args);
311 break;
312
298 case 'print': 313 case 'print':
299 case 'p': 314 case 'p':
300 this.request_ = this.printCommandToJSONRequest_(args); 315 this.request_ = this.printCommandToJSONRequest_(args);
301 break; 316 break;
302 317
303 case 'dir': 318 case 'dir':
304 this.request_ = this.dirCommandToJSONRequest_(args); 319 this.request_ = this.dirCommandToJSONRequest_(args);
305 break; 320 break;
306 321
307 case 'references': 322 case 'references':
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 } 402 }
388 403
389 404
390 DebugRequest.prototype.createRequest = function(command) { 405 DebugRequest.prototype.createRequest = function(command) {
391 return new RequestPacket(command); 406 return new RequestPacket(command);
392 }; 407 };
393 408
394 409
395 // Create a JSON request for the evaluation command. 410 // Create a JSON request for the evaluation command.
396 DebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) { 411 DebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) {
412 // Global varaible used to store whether a handle was requested.
413 lookup_handle = null;
397 // Check if the expression is a handle id in the form #<handle>#. 414 // Check if the expression is a handle id in the form #<handle>#.
398 var handle_match = expression.match(/^#([0-9]*)#$/); 415 var handle_match = expression.match(/^#([0-9]*)#$/);
399 if (handle_match) { 416 if (handle_match) {
417 // Remember the handle requested in a global variable.
418 lookup_handle = parseInt(handle_match[1]);
400 // Build a lookup request. 419 // Build a lookup request.
401 var request = this.createRequest('lookup'); 420 var request = this.createRequest('lookup');
402 request.arguments = {}; 421 request.arguments = {};
403 request.arguments.handle = parseInt(handle_match[1]); 422 request.arguments.handles = [ lookup_handle ];
404 return request.toJSONProtocol(); 423 return request.toJSONProtocol();
405 } else { 424 } else {
406 // Build an evaluate request. 425 // Build an evaluate request.
407 var request = this.createRequest('evaluate'); 426 var request = this.createRequest('evaluate');
408 request.arguments = {}; 427 request.arguments = {};
409 request.arguments.expression = expression; 428 request.arguments.expression = expression;
410 // Request a global evaluation if there is no current frame. 429 // Request a global evaluation if there is no current frame.
411 if (Debug.State.currentFrame == kNoFrame) { 430 if (Debug.State.currentFrame == kNoFrame) {
412 request.arguments.global = true; 431 request.arguments.global = true;
413 } 432 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 var request = this.createRequest('frame'); 571 var request = this.createRequest('frame');
553 args = args.split(/\s*[ ]+\s*/g); 572 args = args.split(/\s*[ ]+\s*/g);
554 if (args.length > 0 && args[0].length > 0) { 573 if (args.length > 0 && args[0].length > 0) {
555 request.arguments = {}; 574 request.arguments = {};
556 request.arguments.number = args[0]; 575 request.arguments.number = args[0];
557 } 576 }
558 return request.toJSONProtocol(); 577 return request.toJSONProtocol();
559 }; 578 };
560 579
561 580
581 // Create a JSON request for the scopes command.
582 DebugRequest.prototype.scopesCommandToJSONRequest_ = function(args) {
583 // Build a scopes request from the text command.
584 var request = this.createRequest('scopes');
585 return request.toJSONProtocol();
586 };
587
588
589 // Create a JSON request for the scope command.
590 DebugRequest.prototype.scopeCommandToJSONRequest_ = function(args) {
591 // Build a scope request from the text command.
592 var request = this.createRequest('scope');
593 args = args.split(/\s*[ ]+\s*/g);
594 if (args.length > 0 && args[0].length > 0) {
595 request.arguments = {};
596 request.arguments.number = args[0];
597 }
598 return request.toJSONProtocol();
599 };
600
601
562 // Create a JSON request for the print command. 602 // Create a JSON request for the print command.
563 DebugRequest.prototype.printCommandToJSONRequest_ = function(args) { 603 DebugRequest.prototype.printCommandToJSONRequest_ = function(args) {
564 // Build an evaluate request from the text command. 604 // Build an evaluate request from the text command.
565 if (args.length == 0) { 605 if (args.length == 0) {
566 throw new Error('Missing expression.'); 606 throw new Error('Missing expression.');
567 } 607 }
568 return this.makeEvaluateJSONRequest_(args); 608 return this.makeEvaluateJSONRequest_(args);
569 }; 609 };
570 610
571 611
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 print('warning: arguments to \'help\' are ignored'); 816 print('warning: arguments to \'help\' are ignored');
777 } 817 }
778 818
779 print('break location [condition]'); 819 print('break location [condition]');
780 print(' break on named function: location is a function name'); 820 print(' break on named function: location is a function name');
781 print(' break on function: location is #<id>#'); 821 print(' break on function: location is #<id>#');
782 print(' break on script position: location is name:line[:column]'); 822 print(' break on script position: location is name:line[:column]');
783 print('clear <breakpoint #>'); 823 print('clear <breakpoint #>');
784 print('backtrace [n] | [-n] | [from to]'); 824 print('backtrace [n] | [-n] | [from to]');
785 print('frame <frame #>'); 825 print('frame <frame #>');
826 print('scopes');
827 print('scope <scope #>');
786 print('step [in | next | out| min [step count]]'); 828 print('step [in | next | out| min [step count]]');
787 print('print <expression>'); 829 print('print <expression>');
830 print('dir <expression>');
788 print('source [from line [num lines]]'); 831 print('source [from line [num lines]]');
789 print('scripts'); 832 print('scripts');
790 print('continue'); 833 print('continue');
791 print('trace compile'); 834 print('trace compile');
792 print('help'); 835 print('help');
793 } 836 }
794 837
795 838
796 function formatHandleReference_(value) { 839 function formatHandleReference_(value) {
797 return '#' + value.handle() + '#'; 840 if (value.handle() >= 0) {
841 return '#' + value.handle() + '#';
842 } else {
843 return '#Transient#';
844 }
798 } 845 }
799 846
800 847
801 function formatObject_(value, include_properties) { 848 function formatObject_(value, include_properties) {
802 var result = ''; 849 var result = '';
803 result += formatHandleReference_(value); 850 result += formatHandleReference_(value);
804 result += ', type: object' 851 result += ', type: object'
805 result += ', constructor '; 852 result += ', constructor ';
806 var ctor = value.constructorFunctionValue(); 853 var ctor = value.constructorFunctionValue();
807 result += formatHandleReference_(ctor); 854 result += formatHandleReference_(ctor);
808 result += ', __proto__ '; 855 result += ', __proto__ ';
809 var proto = value.protoObjectValue(); 856 var proto = value.protoObjectValue();
810 result += formatHandleReference_(proto); 857 result += formatHandleReference_(proto);
811 result += ', '; 858 result += ', ';
812 result += value.propertyCount(); 859 result += value.propertyCount();
813 result += ' properties.'; 860 result += ' properties.';
814 if (include_properties) { 861 if (include_properties) {
815 result += '\n'; 862 result += '\n';
816 for (var i = 0; i < value.propertyCount(); i++) { 863 for (var i = 0; i < value.propertyCount(); i++) {
817 result += ' '; 864 result += ' ';
818 result += value.propertyName(i); 865 result += value.propertyName(i);
819 result += ': '; 866 result += ': ';
820 var property_value = value.propertyValue(i); 867 var property_value = value.propertyValue(i);
821 if (property_value && property_value.type()) { 868 if (property_value instanceof ProtocolReference) {
822 result += property_value.type(); 869 result += '<no type>';
823 } else { 870 } else {
824 result += '<no type>'; 871 if (property_value && property_value.type()) {
872 result += property_value.type();
873 } else {
874 result += '<no type>';
875 }
825 } 876 }
826 result += ' '; 877 result += ' ';
827 result += formatHandleReference_(property_value); 878 result += formatHandleReference_(property_value);
828 result += '\n'; 879 result += '\n';
829 } 880 }
830 } 881 }
831 return result; 882 return result;
832 } 883 }
833 884
834 885
886 function formatScope_(scope) {
887 var result = '';
888 var index = scope.index;
889 result += '#' + (index <= 9 ? '0' : '') + index;
890 result += ' ';
891 switch (scope.type) {
892 case Debug.ScopeType.Global:
893 result += 'Global, ';
894 result += '#' + scope.object.ref + '#';
895 break;
896 case Debug.ScopeType.Local:
897 result += 'Local';
898 break;
899 case Debug.ScopeType.With:
900 result += 'With, ';
901 result += '#' + scope.object.ref + '#';
902 break;
903 case Debug.ScopeType.Closure:
904 result += 'Closure';
905 break;
906 default:
907 result += 'UNKNOWN';
908 }
909 return result;
910 }
911
912
835 // Convert a JSON response to text for display in a text based debugger. 913 // Convert a JSON response to text for display in a text based debugger.
836 function DebugResponseDetails(response) { 914 function DebugResponseDetails(response) {
837 details = {text:'', running:false} 915 details = {text:'', running:false}
838 916
839 try { 917 try {
840 if (!response.success()) { 918 if (!response.success()) {
841 details.text = response.message(); 919 details.text = response.message();
842 return details; 920 return details;
843 } 921 }
844 922
(...skipping 29 matching lines...) Expand all
874 details.text = result; 952 details.text = result;
875 break; 953 break;
876 954
877 case 'frame': 955 case 'frame':
878 details.text = SourceUnderline(body.sourceLineText, 956 details.text = SourceUnderline(body.sourceLineText,
879 body.column); 957 body.column);
880 Debug.State.currentSourceLine = body.line; 958 Debug.State.currentSourceLine = body.line;
881 Debug.State.currentFrame = body.index; 959 Debug.State.currentFrame = body.index;
882 break; 960 break;
883 961
962 case 'scopes':
963 if (body.totalScopes == 0) {
964 result = '(no scopes)';
965 } else {
966 result = 'Scopes #' + body.fromScope + ' to #' +
967 (body.toScope - 1) + ' of ' + body.totalScopes + '\n';
968 for (i = 0; i < body.scopes.length; i++) {
969 if (i != 0) {
970 result += '\n';
971 }
972 result += formatScope_(body.scopes[i]);
973 }
974 }
975 details.text = result;
976 break;
977
978 case 'scope':
979 result += formatScope_(body);
980 result += '\n';
981 var scope_object_value = response.lookup(body.object.ref);
982 result += formatObject_(scope_object_value, true);
983 details.text = result;
984 break;
985
884 case 'evaluate': 986 case 'evaluate':
885 case 'lookup': 987 case 'lookup':
886 if (last_cmd == 'p' || last_cmd == 'print') { 988 if (last_cmd == 'p' || last_cmd == 'print') {
887 result = body.text; 989 result = body.text;
888 } else { 990 } else {
889 var value = response.bodyValue(); 991 var value;
992 if (lookup_handle) {
993 value = response.bodyValue(lookup_handle);
994 } else {
995 value = response.bodyValue();
996 }
890 if (value.isObject()) { 997 if (value.isObject()) {
891 result += formatObject_(value, true); 998 result += formatObject_(value, true);
892 } else { 999 } else {
893 result += 'type: '; 1000 result += 'type: ';
894 result += value.type(); 1001 result += value.type();
895 if (!value.isUndefined() && !value.isNull()) { 1002 if (!value.isUndefined() && !value.isNull()) {
896 result += ', '; 1003 result += ', ';
897 if (value.isString()) { 1004 if (value.isString()) {
898 result += '"'; 1005 result += '"';
899 } 1006 }
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 return this.packet_.command; 1203 return this.packet_.command;
1097 } 1204 }
1098 1205
1099 1206
1100 ProtocolPackage.prototype.body = function() { 1207 ProtocolPackage.prototype.body = function() {
1101 return this.packet_.body; 1208 return this.packet_.body;
1102 } 1209 }
1103 1210
1104 1211
1105 ProtocolPackage.prototype.bodyValue = function(index) { 1212 ProtocolPackage.prototype.bodyValue = function(index) {
1106 if (index) { 1213 if (index != null) {
1107 return new ProtocolValue(this.packet_.body[index], this); 1214 return new ProtocolValue(this.packet_.body[index], this);
1108 } else { 1215 } else {
1109 return new ProtocolValue(this.packet_.body, this); 1216 return new ProtocolValue(this.packet_.body, this);
1110 } 1217 }
1111 } 1218 }
1112 1219
1113 1220
1114 ProtocolPackage.prototype.body = function() { 1221 ProtocolPackage.prototype.body = function() {
1115 return this.packet_.body; 1222 return this.packet_.body;
1116 } 1223 }
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
1504 json += NumberToJSON_(elem); 1611 json += NumberToJSON_(elem);
1505 } else if (typeof(elem) === 'string') { 1612 } else if (typeof(elem) === 'string') {
1506 json += StringToJSON_(elem); 1613 json += StringToJSON_(elem);
1507 } else { 1614 } else {
1508 json += elem; 1615 json += elem;
1509 } 1616 }
1510 } 1617 }
1511 json += ']'; 1618 json += ']';
1512 return json; 1619 return json;
1513 } 1620 }
OLDNEW
« no previous file with comments | « no previous file | src/debug-delay.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698