| Index: src/d8.js
|
| ===================================================================
|
| --- src/d8.js (revision 2147)
|
| +++ src/d8.js (working copy)
|
| @@ -98,6 +98,13 @@
|
| JSON: 2 };
|
|
|
|
|
| +// The different types of scopes matching constants runtime.cc.
|
| +Debug.ScopeType = { Global: 0,
|
| + Local: 1,
|
| + With: 2,
|
| + Closure: 3 };
|
| +
|
| +
|
| // Current debug state.
|
| const kNoFrame = -1;
|
| Debug.State = {
|
| @@ -295,6 +302,14 @@
|
| this.request_ = this.frameCommandToJSONRequest_(args);
|
| break;
|
|
|
| + case 'scopes':
|
| + this.request_ = this.scopesCommandToJSONRequest_(args);
|
| + break;
|
| +
|
| + case 'scope':
|
| + this.request_ = this.scopeCommandToJSONRequest_(args);
|
| + break;
|
| +
|
| case 'print':
|
| case 'p':
|
| this.request_ = this.printCommandToJSONRequest_(args);
|
| @@ -394,13 +409,17 @@
|
|
|
| // Create a JSON request for the evaluation command.
|
| DebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) {
|
| + // Global varaible used to store whether a handle was requested.
|
| + lookup_handle = null;
|
| // Check if the expression is a handle id in the form #<handle>#.
|
| var handle_match = expression.match(/^#([0-9]*)#$/);
|
| if (handle_match) {
|
| + // Remember the handle requested in a global variable.
|
| + lookup_handle = parseInt(handle_match[1]);
|
| // Build a lookup request.
|
| var request = this.createRequest('lookup');
|
| request.arguments = {};
|
| - request.arguments.handle = parseInt(handle_match[1]);
|
| + request.arguments.handles = [ lookup_handle ];
|
| return request.toJSONProtocol();
|
| } else {
|
| // Build an evaluate request.
|
| @@ -559,6 +578,27 @@
|
| };
|
|
|
|
|
| +// Create a JSON request for the scopes command.
|
| +DebugRequest.prototype.scopesCommandToJSONRequest_ = function(args) {
|
| + // Build a scopes request from the text command.
|
| + var request = this.createRequest('scopes');
|
| + return request.toJSONProtocol();
|
| +};
|
| +
|
| +
|
| +// Create a JSON request for the scope command.
|
| +DebugRequest.prototype.scopeCommandToJSONRequest_ = function(args) {
|
| + // Build a scope request from the text command.
|
| + var request = this.createRequest('scope');
|
| + args = args.split(/\s*[ ]+\s*/g);
|
| + if (args.length > 0 && args[0].length > 0) {
|
| + request.arguments = {};
|
| + request.arguments.number = args[0];
|
| + }
|
| + return request.toJSONProtocol();
|
| +};
|
| +
|
| +
|
| // Create a JSON request for the print command.
|
| DebugRequest.prototype.printCommandToJSONRequest_ = function(args) {
|
| // Build an evaluate request from the text command.
|
| @@ -783,8 +823,11 @@
|
| print('clear <breakpoint #>');
|
| print('backtrace [n] | [-n] | [from to]');
|
| print('frame <frame #>');
|
| + print('scopes');
|
| + print('scope <scope #>');
|
| print('step [in | next | out| min [step count]]');
|
| print('print <expression>');
|
| + print('dir <expression>');
|
| print('source [from line [num lines]]');
|
| print('scripts');
|
| print('continue');
|
| @@ -794,7 +837,11 @@
|
|
|
|
|
| function formatHandleReference_(value) {
|
| - return '#' + value.handle() + '#';
|
| + if (value.handle() >= 0) {
|
| + return '#' + value.handle() + '#';
|
| + } else {
|
| + return '#Transient#';
|
| + }
|
| }
|
|
|
|
|
| @@ -818,10 +865,14 @@
|
| result += value.propertyName(i);
|
| result += ': ';
|
| var property_value = value.propertyValue(i);
|
| - if (property_value && property_value.type()) {
|
| - result += property_value.type();
|
| + if (property_value instanceof ProtocolReference) {
|
| + result += '<no type>';
|
| } else {
|
| - result += '<no type>';
|
| + if (property_value && property_value.type()) {
|
| + result += property_value.type();
|
| + } else {
|
| + result += '<no type>';
|
| + }
|
| }
|
| result += ' ';
|
| result += formatHandleReference_(property_value);
|
| @@ -832,6 +883,33 @@
|
| }
|
|
|
|
|
| +function formatScope_(scope) {
|
| + var result = '';
|
| + var index = scope.index;
|
| + result += '#' + (index <= 9 ? '0' : '') + index;
|
| + result += ' ';
|
| + switch (scope.type) {
|
| + case Debug.ScopeType.Global:
|
| + result += 'Global, ';
|
| + result += '#' + scope.object.ref + '#';
|
| + break;
|
| + case Debug.ScopeType.Local:
|
| + result += 'Local';
|
| + break;
|
| + case Debug.ScopeType.With:
|
| + result += 'With, ';
|
| + result += '#' + scope.object.ref + '#';
|
| + break;
|
| + case Debug.ScopeType.Closure:
|
| + result += 'Closure';
|
| + break;
|
| + default:
|
| + result += 'UNKNOWN';
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +
|
| // Convert a JSON response to text for display in a text based debugger.
|
| function DebugResponseDetails(response) {
|
| details = {text:'', running:false}
|
| @@ -881,12 +959,41 @@
|
| Debug.State.currentFrame = body.index;
|
| break;
|
|
|
| + case 'scopes':
|
| + if (body.totalScopes == 0) {
|
| + result = '(no scopes)';
|
| + } else {
|
| + result = 'Scopes #' + body.fromScope + ' to #' +
|
| + (body.toScope - 1) + ' of ' + body.totalScopes + '\n';
|
| + for (i = 0; i < body.scopes.length; i++) {
|
| + if (i != 0) {
|
| + result += '\n';
|
| + }
|
| + result += formatScope_(body.scopes[i]);
|
| + }
|
| + }
|
| + details.text = result;
|
| + break;
|
| +
|
| + case 'scope':
|
| + result += formatScope_(body);
|
| + result += '\n';
|
| + var scope_object_value = response.lookup(body.object.ref);
|
| + result += formatObject_(scope_object_value, true);
|
| + details.text = result;
|
| + break;
|
| +
|
| case 'evaluate':
|
| case 'lookup':
|
| if (last_cmd == 'p' || last_cmd == 'print') {
|
| result = body.text;
|
| } else {
|
| - var value = response.bodyValue();
|
| + var value;
|
| + if (lookup_handle) {
|
| + value = response.bodyValue(lookup_handle);
|
| + } else {
|
| + value = response.bodyValue();
|
| + }
|
| if (value.isObject()) {
|
| result += formatObject_(value, true);
|
| } else {
|
| @@ -1103,7 +1210,7 @@
|
|
|
|
|
| ProtocolPackage.prototype.bodyValue = function(index) {
|
| - if (index) {
|
| + if (index != null) {
|
| return new ProtocolValue(this.packet_.body[index], this);
|
| } else {
|
| return new ProtocolValue(this.packet_.body, this);
|
|
|