Revision: 6286
Author: [email protected]
Date: Wed Jan 12 06:16:19 2011
Log: Optimize JSON stringify for arrays.
Review URL: http://codereview.chromium.org/6164004
http://code.google.com/p/v8/source/detail?r=6286

Modified:
 /branches/bleeding_edge/src/json.js

=======================================
--- /branches/bleeding_edge/src/json.js Wed Dec 22 05:19:25 2010
+++ /branches/bleeding_edge/src/json.js Wed Jan 12 06:16:19 2011
@@ -179,24 +179,60 @@


 function BasicSerializeArray(value, stack, builder) {
+  var len = value.length;
+  if (len == 0) {
+    builder.push("[]");
+    return;
+  }
   if (!%PushIfAbsent(stack, value)) {
     throw MakeTypeError('circular_structure', []);
   }
   builder.push("[");
-  var len = value.length;
-  for (var i = 0; i < len; i++) {
+  var val = value[0];
+  if (IS_STRING(val)) {
+ // First entry is a string. Remaining entries are likely to be strings too.
+    builder.push(%QuoteJSONString(val));
+    for (var i = 1; i < len; i++) {
+      builder.push(",");
+      val = value[i];
+      if (IS_STRING(val)) {
+        builder.push(%QuoteJSONString(val));
+      } else {
+        var before = builder.length;
+        BasicJSONSerialize(i, value[i], stack, builder);
+        if (before == builder.length) builder.push("null");
+      }
+    }
+  } else if (IS_NUMBER(val)) {
+ // First entry is a number. Remaining entries are likely to be numbers too.
+    builder.push(NUMBER_IS_FINITE(val) ? %_NumberToString(val) : "null");
+    for (var i = 1; i < len; i++) {
+      builder.push(",");
+      val = value[i];
+      if (IS_NUMBER(val)) {
+        builder.push(NUMBER_IS_FINITE(val)
+                     ? %_NumberToString(val)
+                     : "null");
+      } else {
+        var before = builder.length;
+        BasicJSONSerialize(i, value[i], stack, builder);
+        if (before == builder.length) builder.push("null");
+      }
+    }
+  } else {
     var before = builder.length;
-    BasicJSONSerialize(i, value, stack, builder);
+    BasicJSONSerialize(0, val, stack, builder);
     if (before == builder.length) builder.push("null");
-    builder.push(",");
+    for (var i = 1; i < len; i++) {
+      builder.push(",");
+      before = builder.length;
+      val = value[i];
+      BasicJSONSerialize(i, val, stack, builder);
+      if (before == builder.length) builder.push("null");
+    }
   }
   stack.pop();
-  if (builder.pop() != ",") {
-    builder.push("[]");  // Zero length array. Push "[" back on.
-  } else {
-    builder.push("]");
-  }
-
+  builder.push("]");
 }


@@ -210,7 +246,7 @@
       builder.push(%QuoteJSONString(p));
       builder.push(":");
       var before = builder.length;
-      BasicJSONSerialize(p, value, stack, builder);
+      BasicJSONSerialize(p, value[p], stack, builder);
       if (before == builder.length) {
         builder.pop();
         builder.pop();
@@ -228,8 +264,7 @@
 }


-function BasicJSONSerialize(key, holder, stack, builder) {
-  var value = holder[key];
+function BasicJSONSerialize(key, value, stack, builder) {
   if (IS_SPEC_OBJECT(value)) {
     var toJSON = value.toJSON;
     if (IS_FUNCTION(toJSON)) {
@@ -266,7 +301,7 @@
 function JSONStringify(value, replacer, space) {
   if (%_ArgumentsLength() == 1) {
     var builder = [];
-    BasicJSONSerialize('', {'': value}, [], builder);
+    BasicJSONSerialize('', value, [], builder);
     if (builder.length == 0) return;
     var result = %_FastAsciiArrayJoin(builder, "");
     if (!IS_UNDEFINED(result)) return result;

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to