Reviewers: Erik Corry, Description: Improved JSON stringify.
Please review this at http://codereview.chromium.org/5578004/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/array.js M src/json.js M test/mjsunit/json.js Index: test/mjsunit/json.js =================================================================== --- test/mjsunit/json.js (revision 5918) +++ test/mjsunit/json.js (working copy) @@ -278,6 +278,12 @@ JSON.stringify({a:"b",c:"d"}, null, 1)); assertEquals('{"y":6,"x":5}', JSON.stringify({x:5,y:6}, ['y', 'x'])); +// toJSON get string keys. +var checker = {}; +var array = [checker]; +checker.toJSON = function(key) { return 1 + key; }; +assertEquals('["10"]', JSON.stringify(array)); + // The gap is capped at ten characters if specified as string. assertEquals('{\n "a": "b",\n "c": "d"\n}', JSON.stringify({a:"b",c:"d"}, null, Index: src/array.js =================================================================== --- src/array.js (revision 5918) +++ src/array.js (working copy) @@ -148,6 +148,9 @@ } } } + elements.length = elements_length; + var result = %_FastAsciiArrayJoin(elements, ""); + if (!IS_UNDEFINED(result)) return result; return %StringBuilderConcat(elements, elements_length, ''); } finally { // Make sure to pop the visited array no matter what happens. @@ -366,7 +369,7 @@ } var result = %_FastAsciiArrayJoin(this, separator); - if (typeof result != "undefined") return result; + if (!IS_UNDEFINED(result)) return result; var length = TO_UINT32(this.length); return Join(this, length, separator, ConvertToString); Index: src/json.js =================================================================== --- src/json.js (revision 5918) +++ src/json.js (working copy) @@ -205,7 +205,7 @@ var len = value.length; for (var i = 0; i < len; i++) { var before = builder.length; - BasicJSONSerialize($String(i), value, stack, builder); + BasicJSONSerialize(i, value, stack, builder); if (before == builder.length) builder.push("null"); builder.push(","); } @@ -226,8 +226,9 @@ stack.push(value); builder.push("{"); for (var p in value) { - if (ObjectHasOwnProperty.call(value, p)) { - builder.push(%QuoteJSONString(p), ":"); + if (%HasLocalProperty(value, p)) { + builder.push(%QuoteJSONString(p)); + builder.push(":"); var before = builder.length; BasicJSONSerialize(p, value, stack, builder); if (before == builder.length) { @@ -251,7 +252,7 @@ var value = holder[key]; if (IS_OBJECT(value) && value) { var toJSON = value.toJSON; - if (IS_FUNCTION(toJSON)) value = toJSON.call(value, key); + if (IS_FUNCTION(toJSON)) value = toJSON.call(value, $String(key)); } if (IS_STRING(value)) { builder.push(%QuoteJSONString(value)); -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
