Title: [293024] trunk/Source
Revision
293024
Author
[email protected]
Date
2022-04-19 10:57:44 -0700 (Tue, 19 Apr 2022)

Log Message

Introduce makeAtomString()
https://bugs.webkit.org/show_bug.cgi?id=239464

Reviewed by Sam Weinig.

Source/WebCore:

Adopt makeAtomString() in a few places where it is useful.

* html/parser/HTMLTreeBuilder.cpp:
(WebCore::HTMLTreeBuilder::insertPhoneNumberLink):
* page/FrameTree.cpp:
(WebCore::FrameTree::generateUniqueName const):
* svg/SVGLengthValue.cpp:
(WebCore::SVGLengthValue::valueAsAtomString const):

Source/WTF:

Introduce makeAtomString() which is an optimized version of makeString() when the caller knows it wants an
AtomString. It may avoid a StringImpl allocation when the string is already in the AtomStringTable.

* wtf/text/StringConcatenate.h:
(WTF::tryMakeAtomStringFromAdapters):
(WTF::tryMakeAtomString):
(WTF::makeAtomString):

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (293023 => 293024)


--- trunk/Source/WTF/ChangeLog	2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WTF/ChangeLog	2022-04-19 17:57:44 UTC (rev 293024)
@@ -1,3 +1,18 @@
+2022-04-19  Chris Dumez  <[email protected]>
+
+        Introduce makeAtomString()
+        https://bugs.webkit.org/show_bug.cgi?id=239464
+
+        Reviewed by Sam Weinig.
+
+        Introduce makeAtomString() which is an optimized version of makeString() when the caller knows it wants an
+        AtomString. It may avoid a StringImpl allocation when the string is already in the AtomStringTable.
+
+        * wtf/text/StringConcatenate.h:
+        (WTF::tryMakeAtomStringFromAdapters):
+        (WTF::tryMakeAtomString):
+        (WTF::makeAtomString):
+
 2022-04-18  Elliott Williams  <[email protected]>
 
         [XCBuild] Use XCBuild for all command-line and project builds

Modified: trunk/Source/WTF/wtf/text/StringConcatenate.h (293023 => 293024)


--- trunk/Source/WTF/wtf/text/StringConcatenate.h	2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WTF/wtf/text/StringConcatenate.h	2022-04-19 17:57:44 UTC (rev 293024)
@@ -431,20 +431,14 @@
 }
 
 template<typename StringTypeAdapter, typename... StringTypeAdapters>
-String tryMakeStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
+RefPtr<StringImpl> tryMakeStringImplFromAdaptersInternal(unsigned length, bool areAllAdapters8Bit, StringTypeAdapter adapter, StringTypeAdapters ...adapters)
 {
-    static_assert(String::MaxLength == std::numeric_limits<int32_t>::max());
-    auto sum = checkedSum<int32_t>(adapter.length(), adapters.length()...);
-    if (sum.hasOverflowed())
-        return String();
-
-    unsigned length = sum;
     ASSERT(length <= String::MaxLength);
-    if (are8Bit(adapter, adapters...)) {
+    if (areAllAdapters8Bit) {
         LChar* buffer;
         RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
         if (!resultImpl)
-            return String();
+            return nullptr;
 
         if (buffer)
             stringTypeAdapterAccumulator(buffer, adapter, adapters...);
@@ -455,7 +449,7 @@
     UChar* buffer;
     RefPtr<StringImpl> resultImpl = StringImpl::tryCreateUninitialized(length, buffer);
     if (!resultImpl)
-        return String();
+        return nullptr;
 
     if (buffer)
         stringTypeAdapterAccumulator(buffer, adapter, adapters...);
@@ -463,6 +457,18 @@
     return resultImpl;
 }
 
+template<typename StringTypeAdapter, typename... StringTypeAdapters>
+String tryMakeStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
+{
+    static_assert(String::MaxLength == std::numeric_limits<int32_t>::max());
+    auto sum = checkedSum<int32_t>(adapter.length(), adapters.length()...);
+    if (sum.hasOverflowed())
+        return String();
+
+    bool areAllAdapters8Bit = are8Bit(adapter, adapters...);
+    return tryMakeStringImplFromAdaptersInternal(sum, areAllAdapters8Bit, adapter, adapters...);
+}
+
 template<typename... StringTypes>
 String tryMakeString(StringTypes ...strings)
 {
@@ -478,6 +484,47 @@
     return result;
 }
 
+template<typename StringTypeAdapter, typename... StringTypeAdapters>
+AtomString tryMakeAtomStringFromAdapters(StringTypeAdapter adapter, StringTypeAdapters ...adapters)
+{
+    static_assert(String::MaxLength == std::numeric_limits<int32_t>::max());
+    auto sum = checkedSum<int32_t>(adapter.length(), adapters.length()...);
+    if (sum.hasOverflowed())
+        return String();
+
+    unsigned length = sum;
+    ASSERT(length <= String::MaxLength);
+
+    bool areAllAdapters8Bit = are8Bit(adapter, adapters...);
+    constexpr size_t maxLengthToUseStackVariable = 64;
+    if (length < maxLengthToUseStackVariable) {
+        if (areAllAdapters8Bit) {
+            LChar buffer[maxLengthToUseStackVariable];
+            stringTypeAdapterAccumulator(buffer, adapter, adapters...);
+            return AtomString { buffer, length };
+        }
+        UChar buffer[maxLengthToUseStackVariable];
+        stringTypeAdapterAccumulator(buffer, adapter, adapters...);
+        return AtomString { buffer, length };
+    }
+    return tryMakeStringImplFromAdaptersInternal(length, areAllAdapters8Bit, adapter, adapters...).get();
+}
+
+template<typename... StringTypes>
+AtomString tryMakeAtomString(StringTypes ...strings)
+{
+    return tryMakeAtomStringFromAdapters(StringTypeAdapter<StringTypes>(strings)...);
+}
+
+template<typename... StringTypes>
+AtomString makeAtomString(StringTypes... strings)
+{
+    AtomString result = tryMakeAtomString(strings...);
+    if (result.isNull())
+        CRASH();
+    return result;
+}
+
 inline String makeStringByInserting(StringView originalString, StringView stringToInsert, unsigned position)
 {
     return makeString(originalString.left(position), stringToInsert, originalString.substring(position));
@@ -487,11 +534,13 @@
 
 using WTF::Indentation;
 using WTF::IndentationScope;
+using WTF::makeAtomString;
 using WTF::makeString;
 using WTF::makeStringByInserting;
 using WTF::pad;
 using WTF::lowercase;
 using WTF::tryMakeString;
+using WTF::tryMakeAtomString;
 using WTF::uppercase;
 
 #include <wtf/text/StringOperators.h>

Modified: trunk/Source/WebCore/ChangeLog (293023 => 293024)


--- trunk/Source/WebCore/ChangeLog	2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/ChangeLog	2022-04-19 17:57:44 UTC (rev 293024)
@@ -1,3 +1,19 @@
+2022-04-19  Chris Dumez  <[email protected]>
+
+        Introduce makeAtomString()
+        https://bugs.webkit.org/show_bug.cgi?id=239464
+
+        Reviewed by Sam Weinig.
+
+        Adopt makeAtomString() in a few places where it is useful.
+
+        * html/parser/HTMLTreeBuilder.cpp:
+        (WebCore::HTMLTreeBuilder::insertPhoneNumberLink):
+        * page/FrameTree.cpp:
+        (WebCore::FrameTree::generateUniqueName const):
+        * svg/SVGLengthValue.cpp:
+        (WebCore::SVGLengthValue::valueAsAtomString const):
+
 2022-04-19  Joseph Griego  <[email protected]>
 
         Fix runtime expose scope check for shadow realms

Modified: trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp (293023 => 293024)


--- trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp	2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp	2022-04-19 17:57:44 UTC (rev 293024)
@@ -2200,7 +2200,7 @@
 // From the string 4089961010, creates a link of the form <a href="" and inserts it.
 void HTMLTreeBuilder::insertPhoneNumberLink(const String& string)
 {
-    Attribute attribute(HTMLNames::hrefAttr, makeString("tel:"_s, string));
+    Attribute attribute(HTMLNames::hrefAttr, makeAtomString("tel:"_s, string));
 
     const AtomString& aTagLocalName = aTag->localName();
     AtomHTMLToken aStartToken(HTMLToken::StartTag, aTagLocalName, { WTFMove(attribute) });

Modified: trunk/Source/WebCore/page/FrameTree.cpp (293023 => 293024)


--- trunk/Source/WebCore/page/FrameTree.cpp	2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/page/FrameTree.cpp	2022-04-19 17:57:44 UTC (rev 293024)
@@ -117,7 +117,7 @@
     if (&top.tree() != this)
         return top.tree().generateUniqueName();
 
-    return makeString("<!--frame", ++m_frameIDGenerator, "-->");
+    return makeAtomString("<!--frame", ++m_frameIDGenerator, "-->");
 }
 
 static bool inScope(Frame& frame, TreeScope& scope)

Modified: trunk/Source/WebCore/svg/SVGLengthValue.cpp (293023 => 293024)


--- trunk/Source/WebCore/svg/SVGLengthValue.cpp	2022-04-19 17:35:20 UTC (rev 293023)
+++ trunk/Source/WebCore/svg/SVGLengthValue.cpp	2022-04-19 17:57:44 UTC (rev 293024)
@@ -271,9 +271,7 @@
 
 AtomString SVGLengthValue::valueAsAtomString() const
 {
-    StringBuilder builder;
-    builder.append(m_valueInSpecifiedUnits, lengthTypeToString(m_lengthType));
-    return builder.toAtomString();
+    return makeAtomString(m_valueInSpecifiedUnits, lengthTypeToString(m_lengthType));
 }
 
 ExceptionOr<float> SVGLengthValue::valueForBindings(const SVGLengthContext& context) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to