[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198

paroga at webkit.org paroga at webkit.org
Mon Feb 21 00:33:46 UTC 2011


The following commit has been merged in the webkit-1.3 branch:
commit 289f3707a713f97ca60e3659bc00f259a9c92ffe
Author: paroga at webkit.org <paroga at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Feb 1 22:03:04 2011 +0000

    2011-02-01  Patrick Gansterer  <paroga at webkit.org>
    
            Reviewed by Darin Adler.
    
            Avoid strlen() in AtomicString::fromUTF8
            https://bugs.webkit.org/show_bug.cgi?id=50516
    
            Add an overload to calculateStringHashFromUTF8 to get
            strlen() of the input data with only one call.
    
            This change shows about 3% performance win on the xml-parser benchmark.
    
            * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
            * wtf/text/AtomicString.cpp:
            (WTF::AtomicString::fromUTF8):
            * wtf/unicode/UTF8.cpp:
            (WTF::Unicode::calculateStringHashAndLengthFromUTF8Internal):
            (WTF::Unicode::calculateStringHashFromUTF8):
            (WTF::Unicode::calculateStringHashAndLengthFromUTF8):
            * wtf/unicode/UTF8.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@77297 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 7a2d1cd..05058d2 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,24 @@
+2011-02-01  Patrick Gansterer  <paroga at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Avoid strlen() in AtomicString::fromUTF8
+        https://bugs.webkit.org/show_bug.cgi?id=50516
+
+        Add an overload to calculateStringHashFromUTF8 to get
+        strlen() of the input data with only one call.
+
+        This change shows about 3% performance win on the xml-parser benchmark.
+
+        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+        * wtf/text/AtomicString.cpp:
+        (WTF::AtomicString::fromUTF8):
+        * wtf/unicode/UTF8.cpp:
+        (WTF::Unicode::calculateStringHashAndLengthFromUTF8Internal):
+        (WTF::Unicode::calculateStringHashFromUTF8):
+        (WTF::Unicode::calculateStringHashAndLengthFromUTF8):
+        * wtf/unicode/UTF8.h:
+
 2011-02-01  Sam Weinig  <sam at webkit.org>
 
         Reviewed by Beth Dakin.
diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
index 5508ce1..bec2ba6 100644
--- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
+++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
@@ -64,6 +64,7 @@ EXPORTS
     ?byteSize at SourceProviderCache@JSC@@QBEIXZ
     ?calculateDSTOffset at WTF@@YANNN at Z
     ?calculateStringHashFromUTF8 at Unicode@WTF@@YAIPBD0AAI at Z
+    ?calculateStringHashAndLengthFromUTF8 at Unicode@WTF@@YAIPBDAAI1 at Z
     ?calculateUTCOffset at WTF@@YAHXZ
     ?calculatedFunctionName at DebuggerCallFrame@JSC@@QBE?AVUString at 2@XZ
     ?call at JSC@@YA?AVJSValue at 1@PAVExecState at 1@V21 at W4CallType@1 at ABTCallData@1 at 1ABVArgList@1@@Z
diff --git a/Source/JavaScriptCore/wtf/text/AtomicString.cpp b/Source/JavaScriptCore/wtf/text/AtomicString.cpp
index dd8d66c..b584f67 100644
--- a/Source/JavaScriptCore/wtf/text/AtomicString.cpp
+++ b/Source/JavaScriptCore/wtf/text/AtomicString.cpp
@@ -376,7 +376,17 @@ AtomicString AtomicString::fromUTF8(const char* characters)
 {
     if (!characters)
         return AtomicString();
-    return fromUTF8(characters, strlen(characters));
+
+    HashAndUTF8Characters buffer;
+    buffer.characters = characters;
+    buffer.hash = calculateStringHashAndLengthFromUTF8(characters, buffer.length, buffer.utf16Length);
+
+    if (!buffer.hash)
+        return AtomicString();
+
+    AtomicString atomicString;
+    atomicString.m_string = addToStringTable<HashAndUTF8Characters, HashAndUTF8CharactersTranslator>(buffer);
+    return atomicString;
 }
 
 } // namespace WTF
diff --git a/Source/JavaScriptCore/wtf/unicode/UTF8.cpp b/Source/JavaScriptCore/wtf/unicode/UTF8.cpp
index 37b1836..4c3738b 100644
--- a/Source/JavaScriptCore/wtf/unicode/UTF8.cpp
+++ b/Source/JavaScriptCore/wtf/unicode/UTF8.cpp
@@ -314,25 +314,33 @@ ConversionResult convertUTF8ToUTF16(
     return result;
 }
 
-unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsigned& utf16Length)
+static inline unsigned calculateStringHashAndLengthFromUTF8Internal(const char* data, const char* dataEnd, unsigned& dataLength, unsigned& utf16Length)
 {
     if (!data)
         return 0;
 
     WTF::StringHasher stringHasher;
+    dataLength = 0;
     utf16Length = 0;
 
-    while (data < dataEnd) {
+    while (data < dataEnd || (!dataEnd && *data)) {
         if (isASCII(*data)) {
             stringHasher.addCharacter(*data++);
+            dataLength++;
             utf16Length++;
             continue;
         }
 
         int utf8SequenceLength = inlineUTF8SequenceLengthNonASCII(*data);
+        dataLength += utf8SequenceLength;
 
-        if (dataEnd - data < utf8SequenceLength)
-            return false;
+        if (!dataEnd) {
+            for (int i = 1; i < utf8SequenceLength; ++i) {
+                if (!data[i])
+                    return 0;
+            }
+        } else if (dataEnd - data < utf8SequenceLength)
+            return 0;
 
         if (!isLegalUTF8(reinterpret_cast<const unsigned char*>(data), utf8SequenceLength))
             return 0;
@@ -357,6 +365,17 @@ unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsi
     return stringHasher.hash();
 }
 
+unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsigned& utf16Length)
+{
+    unsigned dataLength;
+    return calculateStringHashAndLengthFromUTF8Internal(data, dataEnd, dataLength, utf16Length);
+}
+
+unsigned calculateStringHashAndLengthFromUTF8(const char* data, unsigned& dataLength, unsigned& utf16Length)
+{
+    return calculateStringHashAndLengthFromUTF8Internal(data, 0, dataLength, utf16Length);
+}
+
 bool equalUTF16WithUTF8(const UChar* a, const UChar* aEnd, const char* b, const char* bEnd)
 {
     while (b < bEnd) {
diff --git a/Source/JavaScriptCore/wtf/unicode/UTF8.h b/Source/JavaScriptCore/wtf/unicode/UTF8.h
index 1f4baca..bbfaa84 100644
--- a/Source/JavaScriptCore/wtf/unicode/UTF8.h
+++ b/Source/JavaScriptCore/wtf/unicode/UTF8.h
@@ -71,6 +71,7 @@ namespace Unicode {
                     char** targetStart, char* targetEnd, bool strict = true);
 
     unsigned calculateStringHashFromUTF8(const char* data, const char* dataEnd, unsigned& utf16Length);
+    unsigned calculateStringHashAndLengthFromUTF8(const char* data, unsigned& dataLength, unsigned& utf16Length);
 
     bool equalUTF16WithUTF8(const UChar* a, const UChar* aEnd, const char* b, const char* bEnd);
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list