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); |