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

Reply via email to