2009-04-30 Maciej Stachowiak <mjs@apple.com>
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 30 Apr 2009 23:36:38 +0000 (23:36 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 30 Apr 2009 23:36:38 +0000 (23:36 +0000)
        Reviewed by Gavin Barraclough.

        - Concatenate final three strings in simple replace case at one go

        ~0.2% SunSpider speedup

        * runtime/StringPrototype.cpp:
        (JSC::stringProtoFuncReplace): Use new replaceRange helper instead of
        taking substrings and concatenating three strings.
        * runtime/UString.cpp:
        (JSC::UString::replaceRange): New helper function.
        * runtime/UString.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@43104 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/runtime/StringPrototype.cpp
JavaScriptCore/runtime/UString.cpp
JavaScriptCore/runtime/UString.h

index b48f2ee53b34e410435b8aeb8f4d36c6ef6a4ffb..04083e02de23e93f405b8d5bc4ef13eb44ccd9ec 100644 (file)
@@ -1,3 +1,18 @@
+2009-04-30  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Gavin Barraclough.
+
+        - Concatenate final three strings in simple replace case at one go
+
+        ~0.2% SunSpider speedup
+
+        * runtime/StringPrototype.cpp:
+        (JSC::stringProtoFuncReplace): Use new replaceRange helper instead of
+        taking substrings and concatenating three strings.
+        * runtime/UString.cpp:
+        (JSC::UString::replaceRange): New helper function.
+        * runtime/UString.h:
+
 2009-04-30  Geoffrey Garen  <ggaren@apple.com>
 
         Rubber Stamped by Gavin Barraclough.
index 38de47adaeb8d4ee633ec88658e566b4082d71fb..a08678ac14fa85d8db102694a143933f03772614 100644 (file)
@@ -351,9 +351,7 @@ JSValuePtr stringProtoFuncReplace(ExecState* exec, JSObject*, JSValuePtr thisVal
     }
 
     int ovector[2] = { matchPos, matchPos + matchLen };
-    return jsString(exec, source.substr(0, matchPos)
-        + substituteBackreferences(replacementString, source, ovector, 0)
-        + source.substr(matchPos + matchLen));
+    return jsString(exec, source.replaceRange(matchPos, matchLen, substituteBackreferences(replacementString, source, ovector, 0)));
 }
 
 JSValuePtr stringProtoFuncToString(ExecState* exec, JSObject*, JSValuePtr thisValue, const ArgList&)
index 6a5ea8b93885067f273c195a734be654de527e5f..866c315923ecf07004bcc7eb8ae332802e34b91b 100644 (file)
@@ -981,6 +981,28 @@ UString UString::spliceSubstringsWithSeparators(const Range* substringRanges, in
     return UString::Rep::create(buffer, totalLength);
 }
 
+UString UString::replaceRange(int rangeStart, int rangeLength, const UString& replacement) const
+{
+    m_rep->checkConsistency();
+
+    int replacementLength = replacement.size();
+    int totalLength = size() - rangeLength + replacementLength;
+    if (totalLength == 0)
+        return "";
+
+    UChar* buffer = allocChars(totalLength);
+    if (!buffer)
+        return null();
+
+    copyChars(buffer, data(), rangeStart);
+    copyChars(buffer + rangeStart, replacement.data(), replacementLength);
+    int rangeEnd = rangeStart + rangeLength;
+    copyChars(buffer + rangeStart + replacementLength, data() + rangeEnd, size() - rangeEnd);
+
+    return UString::Rep::create(buffer, totalLength);
+}
+
+
 UString& UString::append(const UString &t)
 {
     m_rep->checkConsistency();
index 420e0b4a8fa5c1a5cb0153af6fd826eb78b8b979..68a3200ed7c0d0c37830b7af1e234b3001f625b0 100644 (file)
@@ -244,6 +244,8 @@ namespace JSC {
 
         UString spliceSubstringsWithSeparators(const Range* substringRanges, int rangeCount, const UString* separators, int separatorCount) const;
 
+        UString replaceRange(int rangeStart, int RangeEnd, const UString& replacement) const;
+
         UString& append(const UString&);
         UString& append(const char*);
         UString& append(UChar);