Reviewers: Erik Corry, Description: Improved JSON stringify and leverage FastAsciiArrayJoin code where possible.
Please review this at http://codereview.chromium.org/5656001/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/array.js M src/json.js M src/string.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) @@ -85,6 +85,9 @@ last_key = key; } } + elements.length = elements_length; + var result = %_FastAsciiArrayJoin(elements, ""); + if (!IS_UNDEFINED(result)) return result; return %StringBuilderConcat(elements, elements_length, ''); } @@ -148,6 +151,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 +372,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/string.js =================================================================== --- src/string.js (revision 5918) +++ src/string.js (working copy) @@ -93,6 +93,8 @@ var part = %_Arguments(i); parts[i + 1] = TO_STRING_INLINE(part); } + var result = %_FastAsciiArrayJoin(parts, ""); + if (!IS_UNDEFINED(result)) return result; return %StringBuilderConcat(parts, len + 1, ""); } 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
