Revision: 6235
Author: [email protected]
Date: Mon Jan 10 00:00:48 2011
Log: Make better use of the %_FastAsciiArrayJoin function.
Review URL: http://codereview.chromium.org/6100005
http://code.google.com/p/v8/source/detail?r=6235

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

=======================================
--- /branches/bleeding_edge/src/array.js        Fri Jan  7 05:21:34 2011
+++ /branches/bleeding_edge/src/array.js        Mon Jan 10 00:00:48 2011
@@ -125,34 +125,45 @@
     }

     // Construct an array for the elements.
-    var elements;
+    var elements = new $Array(length);
     var elements_length = 0;

     // We pull the empty separator check outside the loop for speed!
     if (separator.length == 0) {
-      elements = new $Array(length);
       for (var i = 0; i < length; i++) {
         var e = array[i];
-        if (!IS_UNDEFINED(e) || (i in array)) {
+        if (!IS_UNDEFINED(e)) {
           if (!IS_STRING(e)) e = convert(e);
           elements[elements_length++] = e;
         }
       }
-    } else {
-      elements = new $Array(length << 1);
-      for (var i = 0; i < length; i++) {
-        var e = array[i];
-        if (i != 0) elements[elements_length++] = separator;
-        if (!IS_UNDEFINED(e) || (i in array)) {
-          if (!IS_STRING(e)) e = convert(e);
-          elements[elements_length++] = e;
-        }
+      elements.length = elements_length;
+      var result = %_FastAsciiArrayJoin(elements, '');
+      if (!IS_UNDEFINED(result)) return result;
+      return %StringBuilderConcat(elements, elements_length, '');
+    }
+    // Non-empty separator.
+    for (var i = 0; i < length; i++) {
+      var e = array[i];
+      if (!IS_UNDEFINED(e)) {
+        if (!IS_STRING(e)) e = convert(e);
+        elements[i] = e;
+      } else {
+        elements[i] = '';
       }
     }
-    elements.length = elements_length;
-    var result = %_FastAsciiArrayJoin(elements, "");
-    if (!IS_UNDEFINED(result)) return result;
-    return %StringBuilderConcat(elements, elements_length, '');
+    var result = %_FastAsciiArrayJoin(elements, separator);
+    if (!IS_UNDEFINED(result)) return result;
+
+    var length2 = (length << 1) - 1;
+    var j = length2;
+    var i = length;
+    elements[--j] = elements[--i];
+    while (i > 0) {
+      elements[--j] = separator;
+      elements[--j] = elements[--i];
+    }
+    return %StringBuilderConcat(elements, length2, '');
   } finally {
     // Make sure to pop the visited array no matter what happens.
     if (is_array) visited_arrays.pop();

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

Reply via email to