If 'compactFormat' argument is passed in the request the response won't include refer...
authoryurys@chromium.org <yurys@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 15 May 2009 15:52:37 +0000 (15:52 +0000)
committeryurys@chromium.org <yurys@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 15 May 2009 15:52:37 +0000 (15:52 +0000)
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
src/mirror-delay.js

index c7d1a87a7b0e97099886e7ae446977aecf7e55ab..f196031dedf98f498712a51166096d1549685c31 100644 (file)
@@ -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 = {};
index b6dc4957728fef161952ebcaebf46713b70a056c..371bc059ebb0a03b17c2ea22318dd8c1afd9506b 100644 (file)
@@ -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();
-  }
-  if (propertyMirror.propertyType() != PropertyType.Normal) {
-    result.propertyType = propertyMirror.propertyType();
+  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();
   }
-  result.ref = propertyMirror.value().handle();
   return result;
 }