From 6a350c86bf1b5dc88017cec5aecebe5e20cde304 Mon Sep 17 00:00:00 2001 From: "yurys@chromium.org" Date: Fri, 15 May 2009 15:52:37 +0000 Subject: [PATCH] If 'compactFormat' argument is passed in the request the response won't include referenced mirrors in the refs section instead each protocol reference object will contain some details necessary for displaying the referenced object in the graphical debugger when the object is not expanded. That allows to request full information lazily when the object is expanded. Review URL: http://codereview.chromium.org/115401 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1977 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/debug-delay.js | 7 +++++ src/mirror-delay.js | 70 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/debug-delay.js b/src/debug-delay.js index c7d1a87a7b..f196031ded 100644 --- a/src/debug-delay.js +++ b/src/debug-delay.js @@ -1462,6 +1462,9 @@ DebugCommandProcessor.prototype.backtraceRequest_ = function(request, response) if (from_index < 0 || to_index < 0) { return response.failed('Invalid frame number'); } + if (request.arguments.compactFormat) { + response.setOption('compactFormat', true); + } } // Adjust the index. @@ -1589,6 +1592,10 @@ DebugCommandProcessor.prototype.lookupRequest_ = function(request, response) { includeSource = %ToBoolean(request.arguments.includeSource); response.setOption('includeSource', includeSource); } + + if (request.arguments.compactFormat) { + response.setOption('compactFormat', true); + } // Lookup handles. var mirrors = {}; diff --git a/src/mirror-delay.js b/src/mirror-delay.js index b6dc495772..371bc059eb 100644 --- a/src/mirror-delay.js +++ b/src/mirror-delay.js @@ -1752,6 +1752,11 @@ JSONProtocolSerializer.prototype.includeSource_ = function() { } +JSONProtocolSerializer.prototype.compactFormat_ = function() { + return this.options_ && this.options_.compactFormat; +} + + JSONProtocolSerializer.prototype.add_ = function(mirror) { // If this mirror is already in the list just return. for (var i = 0; i < this.mirrors_.length; i++) { @@ -1765,14 +1770,58 @@ JSONProtocolSerializer.prototype.add_ = function(mirror) { } +/** + * Formats mirror object to protocol reference object with some data that can + * be used to display the value in debugger. + * @param {Mirror} mirror Mirror to serialize. + * @return {Object} Protocol reference object. + */ +JSONProtocolSerializer.prototype.serializeReferenceWithDisplayData_ = + function(mirror) { + var o = {}; + o.ref = mirror.handle(); + o.type = mirror.type(); + switch (mirror.type()) { + case UNDEFINED_TYPE: + case NULL_TYPE: + case BOOLEAN_TYPE: + case NUMBER_TYPE: + o.value = mirror.value(); + break; + case STRING_TYPE: + // Limit string length. + o.value = mirror.toText(); + break; + case FUNCTION_TYPE: + o.name = mirror.name(); + o.inferredName = mirror.inferredName(); + if (mirror.script()) { + o.scriptId = mirror.script().id(); + } + break; + case ERROR_TYPE: + case REGEXP_TYPE: + o.value = mirror.toText(); + break; + case OBJECT_TYPE: + o.className = mirror.className(); + break; + } + return o; +}; + JSONProtocolSerializer.prototype.serialize_ = function(mirror, reference, details) { // If serializing a reference to a mirror just return the reference and add // the mirror to the referenced mirrors. if (reference && (mirror.isValue() || mirror.isScript() || mirror.isContext())) { - this.add_(mirror); - return {'ref' : mirror.handle()}; + if (this.compactFormat_() && mirror.isValue()) { + return this.serializeReferenceWithDisplayData_(mirror); + } else { + this.add_(mirror); + return {'ref' : mirror.handle()}; + } } // Collect the JSON property/value pairs. @@ -1965,13 +2014,18 @@ JSONProtocolSerializer.prototype.serializeProperty_ = function(propertyMirror) { var result = {}; result.name = propertyMirror.name(); - if (propertyMirror.attributes() != PropertyAttribute.None) { - result.attributes = propertyMirror.attributes(); + var propertyValue = propertyMirror.value(); + if (this.compactFormat_() && propertyValue.isValue()) { + result.value = this.serializeReferenceWithDisplayData_(propertyValue); + } else { + if (propertyMirror.attributes() != PropertyAttribute.None) { + result.attributes = propertyMirror.attributes(); + } + if (propertyMirror.propertyType() != PropertyType.Normal) { + result.propertyType = propertyMirror.propertyType(); + } + result.ref = propertyValue.handle(); } - if (propertyMirror.propertyType() != PropertyType.Normal) { - result.propertyType = propertyMirror.propertyType(); - } - result.ref = propertyMirror.value().handle(); return result; }