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

Unified Diff: src/mirror-delay.js

Issue 113399: Use JSON.stringify to serialize debugger messages (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/debug-delay.js ('k') | test/mjsunit/mirror-array.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/mirror-delay.js
===================================================================
--- src/mirror-delay.js (revision 1956)
+++ src/mirror-delay.js (working copy)
@@ -29,8 +29,7 @@
// Touch the RegExp and Date functions to make sure that date-delay.js and
// regexp-delay.js has been loaded. This is required as the mirrors use
-// functions within these files through the builtins object. See the
-// function DateToISO8601_ as an example.
+// functions within these files through the builtins object.
RegExp;
Date;
@@ -935,7 +934,8 @@
DateMirror.prototype.toText = function() {
- return DateToISO8601_(this.value_);
+ var s = JSON.stringify(this.value_);
+ return s.substring(1, s.length - 1); // cut quotes
}
@@ -1728,12 +1728,13 @@
/**
* Returns a serialization of all the objects referenced.
*
- * @param {Mirror} mirror The mirror to serialize
- * @returns {String} JSON serialization
+ * @param {Mirror} mirror The mirror to serialize.
+ * @returns {Array.<Object>} Array of the referenced objects converted to
+ * protcol objects.
*/
JSONProtocolSerializer.prototype.serializeReferencedObjects = function() {
- // Collect the JSON serialization of the referenced objects in an array.
- var content = new Array();
+ // Collect the protocol representation of the referenced objects in an array.
+ var content = [];
// Get the number of referenced objects.
var count = this.mirrors_.length;
@@ -1742,8 +1743,7 @@
content.push(this.serialize_(this.mirrors_[i], false, false));
}
- var json = ArrayToJSONArray_(content);
- return json;
+ return content;
}
@@ -1772,19 +1772,19 @@
if (reference &&
(mirror.isValue() || mirror.isScript() || mirror.isContext())) {
this.add_(mirror);
- return '{"ref":' + mirror.handle() + '}';
+ return {'ref' : mirror.handle()};
}
- // Collect the JSON property/value pairs in an array.
- var content = new Array();
+ // Collect the JSON property/value pairs.
+ var content = {};
// Add the mirror handle.
if (mirror.isValue() || mirror.isScript() || mirror.isContext()) {
- content.push(MakeJSONPair_('handle', NumberToJSON_(mirror.handle())));
+ content.handle = mirror.handle();
}
// Always add the type.
- content.push(MakeJSONPair_('type', StringToJSON_(mirror.type())));
+ content.type = mirror.type();
switch (mirror.type()) {
case UNDEFINED_TYPE:
@@ -1794,26 +1794,25 @@
case BOOLEAN_TYPE:
// Boolean values are simply represented by their value.
- content.push(MakeJSONPair_('value', BooleanToJSON_(mirror.value())));
+ content.value = mirror.value();
break;
case NUMBER_TYPE:
// Number values are simply represented by their value.
- content.push(MakeJSONPair_('value', NumberToJSON_(mirror.value())));
+ content.value = NumberToJSON_(mirror.value());
break;
case STRING_TYPE:
// String values might have their value cropped to keep down size.
if (mirror.length() > kMaxProtocolStringLength) {
var str = mirror.value().substring(0, kMaxProtocolStringLength);
- content.push(MakeJSONPair_('value', StringToJSON_(str)));
- content.push(MakeJSONPair_('fromIndex', NumberToJSON_(0)));
- content.push(MakeJSONPair_('toIndex',
- NumberToJSON_(kMaxProtocolStringLength)));
+ content.value = str;
+ content.fromIndex = 0;
+ content.toIndex = kMaxProtocolStringLength;
} else {
- content.push(MakeJSONPair_('value', StringToJSON_(mirror.value())));
+ content.value = mirror.value();
}
- content.push(MakeJSONPair_('length', NumberToJSON_(mirror.length())));
+ content.length = mirror.length();
break;
case OBJECT_TYPE:
@@ -1836,46 +1835,38 @@
case SCRIPT_TYPE:
// Script is represented by id, name and source attributes.
if (mirror.name()) {
- content.push(MakeJSONPair_('name', StringToJSON_(mirror.name())));
+ content.name = mirror.name();
}
- content.push(MakeJSONPair_('id', NumberToJSON_(mirror.id())));
- content.push(MakeJSONPair_('lineOffset',
- NumberToJSON_(mirror.lineOffset())));
- content.push(MakeJSONPair_('columnOffset',
- NumberToJSON_(mirror.columnOffset())));
- content.push(MakeJSONPair_('lineCount',
- NumberToJSON_(mirror.lineCount())));
+ content.id = mirror.id();
+ content.lineOffset = mirror.lineOffset();
+ content.columnOffset = mirror.columnOffset();
+ content.lineCount = mirror.lineCount();
if (mirror.data()) {
- content.push(MakeJSONPair_('data', JSON.stringify(mirror.data())));
+ content.data = mirror.data();
}
if (this.includeSource_()) {
- content.push(MakeJSONPair_('source',
- StringToJSON_(mirror.source())));
+ content.source = mirror.source();
} else {
var sourceStart = mirror.source().substring(0, 80);
- content.push(MakeJSONPair_('sourceStart',
- StringToJSON_(sourceStart)));
+ content.sourceStart = sourceStart;
}
- content.push(MakeJSONPair_('sourceLength',
- NumberToJSON_(mirror.source().length)));
- content.push(MakeJSONPair_('scriptType',
- NumberToJSON_(mirror.scriptType())));
+ content.sourceLength = mirror.source().length;
+ content.scriptType = mirror.scriptType();
if (mirror.context()) {
- content.push(MakeJSONPair_('context',
- this.serializeReference(mirror.context())));
+ content.context = this.serializeReference(mirror.context());
}
break;
case CONTEXT_TYPE:
- content.push(MakeJSONPair_('data', JSON.stringify(mirror.data())));
+ content.data = mirror.data();
break;
}
// Always add the text representation.
- content.push(MakeJSONPair_('text', StringToJSON_(mirror.toText())));
+ content.text = mirror.toText();
// Create and return the JSON string.
- return ArrayToJSONObject_(content);
+ return content;
}
@@ -1893,44 +1884,40 @@
JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content,
details) {
// Add general object properties.
- content.push(MakeJSONPair_('className',
- StringToJSON_(mirror.className())));
- content.push(MakeJSONPair_('constructorFunction',
- this.serializeReference(mirror.constructorFunction())));
- content.push(MakeJSONPair_('protoObject',
- this.serializeReference(mirror.protoObject())));
- content.push(MakeJSONPair_('prototypeObject',
- this.serializeReference(mirror.prototypeObject())));
+ content.className = mirror.className();
+ content.constructorFunction =
+ this.serializeReference(mirror.constructorFunction());
+ content.protoObject = this.serializeReference(mirror.protoObject());
+ content.prototypeObject = this.serializeReference(mirror.prototypeObject());
// Add flags to indicate whether there are interceptors.
if (mirror.hasNamedInterceptor()) {
- content.push(MakeJSONPair_('namedInterceptor', BooleanToJSON_(true)));
+ content.namedInterceptor = true;
}
if (mirror.hasIndexedInterceptor()) {
- content.push(MakeJSONPair_('indexedInterceptor', BooleanToJSON_(true)));
+ content.indexedInterceptor = true;
}
// Add function specific properties.
if (mirror.isFunction()) {
// Add function specific properties.
- content.push(MakeJSONPair_('name', StringToJSON_(mirror.name())));
+ content.name = mirror.name();
if (!IS_UNDEFINED(mirror.inferredName())) {
- content.push(MakeJSONPair_('inferredName',
- StringToJSON_(mirror.inferredName())));
+ content.inferredName = mirror.inferredName();
}
- content.push(MakeJSONPair_('resolved', BooleanToJSON_(mirror.resolved())));
+ content.resolved = mirror.resolved();
if (mirror.resolved()) {
- content.push(MakeJSONPair_('source', StringToJSON_(mirror.source())));
+ content.source = mirror.source();
}
if (mirror.script()) {
- content.push(MakeJSONPair_('script', this.serializeReference(mirror.script())));
+ content.script = this.serializeReference(mirror.script());
}
}
// Add date specific properties.
if (mirror.isDate()) {
// Add date specific properties.
- content.push(MakeJSONPair_('value', DateToJSON_(mirror.value())));
+ content.value = mirror.value();
}
// Add actual properties - named properties followed by indexed properties.
@@ -1938,20 +1925,20 @@
var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed);
var p = new Array(propertyNames.length + propertyIndexes.length);
for (var i = 0; i < propertyNames.length; i++) {
- var property_mirror = mirror.property(propertyNames[i]);
- p[i] = this.serializeProperty_(property_mirror);
+ var propertyMirror = mirror.property(propertyNames[i]);
+ p[i] = this.serializeProperty_(propertyMirror);
if (details) {
- this.add_(property_mirror.value());
+ this.add_(propertyMirror.value());
}
}
for (var i = 0; i < propertyIndexes.length; i++) {
- var property_mirror = mirror.property(propertyIndexes[i]);
- p[propertyNames.length + i] = this.serializeProperty_(property_mirror);
+ var propertyMirror = mirror.property(propertyIndexes[i]);
+ p[propertyNames.length + i] = this.serializeProperty_(propertyMirror);
if (details) {
- this.add_(property_mirror.value());
+ this.add_(propertyMirror.value());
}
}
- content.push(MakeJSONPair_('properties', ArrayToJSONArray_(p)));
+ content.properties = p;
}
@@ -1971,207 +1958,88 @@
* {"name":"hello","ref":1}
* {"name":"length","attributes":7,"propertyType":3,"ref":2}
*
- * @param {PropertyMirror} property_mirror The property to serialize
- * @returns {String} JSON serialization
+ * @param {PropertyMirror} propertyMirror The property to serialize.
+ * @returns {Object} Protocol object representing the property.
*/
-JSONProtocolSerializer.prototype.serializeProperty_ = function(property_mirror) {
- var builder = new builtins.StringBuilder();
- builder.add('{"name":');
- builder.add(StringToJSON_(property_mirror.name()));
- if (property_mirror.attributes() != PropertyAttribute.None) {
- builder.add(',"attributes":');
- builder.add(NumberToJSON_(property_mirror.attributes()));
+JSONProtocolSerializer.prototype.serializeProperty_ = function(propertyMirror) {
+ var result = {};
+
+ result.name = propertyMirror.name();
+ if (propertyMirror.attributes() != PropertyAttribute.None) {
+ result.attributes = propertyMirror.attributes();
}
- if (property_mirror.propertyType() != PropertyType.Normal) {
- builder.add(',"propertyType":');
- builder.add(NumberToJSON_(property_mirror.propertyType()));
+ if (propertyMirror.propertyType() != PropertyType.Normal) {
+ result.propertyType = propertyMirror.propertyType();
}
- builder.add(',"ref":');
- builder.add(NumberToJSON_(property_mirror.value().handle()));
- builder.add('}');
- return builder.generate();
+ result.ref = propertyMirror.value().handle();
+ return result;
}
JSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) {
- content.push(MakeJSONPair_('index', NumberToJSON_(mirror.index())));
- content.push(MakeJSONPair_('receiver',
- this.serializeReference(mirror.receiver())));
+ content.index = mirror.index();
+ content.receiver = this.serializeReference(mirror.receiver());
var func = mirror.func();
- content.push(MakeJSONPair_('func', this.serializeReference(func)));
+ content.func = this.serializeReference(func);
if (func.script()) {
- content.push(MakeJSONPair_('script',
- this.serializeReference(func.script())));
+ content.script = this.serializeReference(func.script());
}
- content.push(MakeJSONPair_('constructCall',
- BooleanToJSON_(mirror.isConstructCall())));
- content.push(MakeJSONPair_('debuggerFrame',
- BooleanToJSON_(mirror.isDebuggerFrame())));
+ content.constructCall = mirror.isConstructCall();
+ content.debuggerFrame = mirror.isDebuggerFrame();
var x = new Array(mirror.argumentCount());
for (var i = 0; i < mirror.argumentCount(); i++) {
- arg = new Array();
+ var arg = {};
var argument_name = mirror.argumentName(i)
if (argument_name) {
- arg.push(MakeJSONPair_('name', StringToJSON_(argument_name)));
+ arg.name = argument_name;
}
- arg.push(MakeJSONPair_('value',
- this.serializeReference(mirror.argumentValue(i))));
- x[i] = ArrayToJSONObject_(arg);
+ arg.value = this.serializeReference(mirror.argumentValue(i));
+ x[i] = arg;
}
- content.push(MakeJSONPair_('arguments', ArrayToJSONArray_(x)));
+ content.arguments = x;
var x = new Array(mirror.localCount());
for (var i = 0; i < mirror.localCount(); i++) {
- var name = MakeJSONPair_('name', StringToJSON_(mirror.localName(i)));
- var value = MakeJSONPair_('value',
- this.serializeReference(mirror.localValue(i)));
- x[i] = '{' + name + ',' + value + '}';
+ var local = {};
+ local.name = mirror.localName(i);
+ local.value = this.serializeReference(mirror.localValue(i));
+ x[i] = local;
}
- content.push(MakeJSONPair_('locals', ArrayToJSONArray_(x)));
- content.push(MakeJSONPair_('position',
- NumberToJSON_(mirror.sourcePosition())));
+ content.locals = x;
+ content.position = mirror.sourcePosition();
var line = mirror.sourceLine();
if (!IS_UNDEFINED(line)) {
- content.push(MakeJSONPair_('line', NumberToJSON_(line)));
+ content.line = line;
}
var column = mirror.sourceColumn();
if (!IS_UNDEFINED(column)) {
- content.push(MakeJSONPair_('column', NumberToJSON_(column)));
+ content.column = column;
}
var source_line_text = mirror.sourceLineText();
if (!IS_UNDEFINED(source_line_text)) {
- content.push(MakeJSONPair_('sourceLineText',
- StringToJSON_(source_line_text)));
+ content.sourceLineText = source_line_text;
}
}
-function MakeJSONPair_(name, value) {
- return '"' + name + '":' + value;
-}
-
-
-function ArrayToJSONObject_(content) {
- return '{' + content.join(',') + '}';
-}
-
-
-function ArrayToJSONArray_(content) {
- return '[' + content.join(',') + ']';
-}
-
-
-function BooleanToJSON_(value) {
- return String(value);
-}
-
-
/**
- * Convert a number to a JSON string value. For all finite numbers the number
- * literal representation is used. For non finite numbers NaN, Infinite and
+ * Convert a number to a protocol value. For all finite numbers the number
+ * itself is returned. For non finite numbers NaN, Infinite and
* -Infinite the string representation "NaN", "Infinite" or "-Infinite"
- * (including the quotes) is returned.
+ * (not including the quotes) is returned.
*
- * @param {number} value The number value to convert to a JSON value
- * @returns {String} JSON value
+ * @param {number} value The number value to convert to a protocol value.
+ * @returns {number|string} Protocol value.
*/
function NumberToJSON_(value) {
if (isNaN(value)) {
- return '"NaN"';
+ return 'NaN';
}
if (!isFinite(value)) {
if (value > 0) {
- return '"Infinity"';
+ return 'Infinity';
} else {
- return '"-Infinity"';
+ return '-Infinity';
}
}
- return String(value);
+ return value;
}
-
-
-// Mapping of some control characters to avoid the \uXXXX syntax for most
-// commonly used control cahracters.
-const ctrlCharMap_ = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
-};
-
-
-// Regular expression testing for ", \ and control characters (0x00 - 0x1F).
-const ctrlCharTest_ = new RegExp('["\\\\\x00-\x1F]');
-
-
-// Regular expression matching ", \ and control characters (0x00 - 0x1F)
-// globally.
-const ctrlCharMatch_ = new RegExp('["\\\\\x00-\x1F]', 'g');
-
-
-/**
- * Convert a String to its JSON representation (see http://www.json.org/). To
- * avoid depending on the String object this method calls the functions in
- * string.js directly and not through the value.
- * @param {String} value The String value to format as JSON
- * @return {string} JSON formatted String value
- */
-function StringToJSON_(value) {
- // Check for" , \ and control characters (0x00 - 0x1F). No need to call
- // RegExpTest as ctrlchar is constructed using RegExp.
- if (ctrlCharTest_.test(value)) {
- // Replace ", \ and control characters (0x00 - 0x1F).
- return '"' +
- value.replace(ctrlCharMatch_, function (char) {
- // Use charmap if possible.
- var mapped = ctrlCharMap_[char];
- if (mapped) return mapped;
- mapped = char.charCodeAt();
- // Convert control character to unicode escape sequence.
- return '\\u00' +
- %NumberToRadixString(Math.floor(mapped / 16), 16) +
- %NumberToRadixString(mapped % 16, 16);
- })
- + '"';
- }
-
- // Simple string with no special characters.
- return '"' + value + '"';
-}
-
-
-/**
- * Convert a Date to ISO 8601 format. To avoid depending on the Date object
- * this method calls the functions in date.js directly and not through the
- * value.
- * @param {Date} value The Date value to format as JSON
- * @return {string} JSON formatted Date value
- */
-function DateToISO8601_(value) {
- function f(n) {
- return n < 10 ? '0' + n : n;
- }
- function g(n) {
- return n < 10 ? '00' + n : n < 100 ? '0' + n : n;
- }
- return builtins.GetUTCFullYearFrom(value) + '-' +
- f(builtins.GetUTCMonthFrom(value) + 1) + '-' +
- f(builtins.GetUTCDateFrom(value)) + 'T' +
- f(builtins.GetUTCHoursFrom(value)) + ':' +
- f(builtins.GetUTCMinutesFrom(value)) + ':' +
- f(builtins.GetUTCSecondsFrom(value)) + '.' +
- g(builtins.GetUTCMillisecondsFrom(value)) + 'Z';
-}
-
-/**
- * Convert a Date to ISO 8601 format. To avoid depending on the Date object
- * this method calls the functions in date.js directly and not through the
- * value.
- * @param {Date} value The Date value to format as JSON
- * @return {string} JSON formatted Date value
- */
-function DateToJSON_(value) {
- return '"' + DateToISO8601_(value) + '"';
-}
« no previous file with comments | « src/debug-delay.js ('k') | test/mjsunit/mirror-array.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698