Title: [295167] trunk/Source
Revision
295167
Author
[email protected]
Date
2022-06-02 19:08:02 -0700 (Thu, 02 Jun 2022)

Log Message

Optimize HTMLTokenizer::processEntity()
https://bugs.webkit.org/show_bug.cgi?id=241239

Reviewed by Darin Adler.

Optimize HTMLTokenizer::processEntity() by appending all characters in the
StringBuffer at once, instead of one by one.

* Source/WebCore/html/parser/HTMLToken.h:
(WebCore::HTMLToken::appendToCharacters):
* Source/WebCore/html/parser/HTMLTokenizer.cpp:
(WebCore::HTMLTokenizer::bufferCharacters):
(WebCore::HTMLTokenizer::processEntity):
* Source/WebCore/html/parser/HTMLTokenizer.h:

Canonical link: https://commits.webkit.org/251251@main

Modified Paths

Diff

Modified: trunk/Source/WTF/wtf/text/StringBuilder.h (295166 => 295167)


--- trunk/Source/WTF/wtf/text/StringBuilder.h	2022-06-03 01:31:02 UTC (rev 295166)
+++ trunk/Source/WTF/wtf/text/StringBuilder.h	2022-06-03 02:08:02 UTC (rev 295167)
@@ -93,6 +93,7 @@
     template<typename CharacterType> const CharacterType* characters() const;
     const LChar* characters8() const { return characters<LChar>(); }
     const UChar* characters16() const { return characters<UChar>(); }
+    template<typename CharacterType> Span<const CharacterType> span() const { return Span { characters<CharacterType>(), length() }; }
     
     unsigned capacity() const;
     WTF_EXPORT_PRIVATE void reserveCapacity(unsigned newCapacity);

Modified: trunk/Source/WebCore/html/parser/HTMLToken.h (295166 => 295167)


--- trunk/Source/WebCore/html/parser/HTMLToken.h	2022-06-03 01:31:02 UTC (rev 295166)
+++ trunk/Source/WebCore/html/parser/HTMLToken.h	2022-06-03 02:08:02 UTC (rev 295167)
@@ -122,6 +122,7 @@
     void appendToCharacter(LChar);
     void appendToCharacter(UChar);
     void appendToCharacter(const Vector<LChar, 32>&);
+    template<typename CharacterType> void appendToCharacter(Span<const CharacterType>);
 
     // Comment.
 
@@ -375,6 +376,19 @@
     m_data.appendVector(characters);
 }
 
+template<typename CharacterType>
+inline void HTMLToken::appendToCharacter(Span<const CharacterType> characters)
+{
+    m_type = Character;
+    m_data.append(characters);
+    if constexpr (std::is_same_v<CharacterType, UChar>) {
+        if (!charactersIsAll8BitData())
+            return;
+        for (auto character : characters)
+            m_data8BitCheck |= character;
+    }
+}
+
 inline const HTMLToken::DataVector& HTMLToken::comment() const
 {
     ASSERT(m_type == Comment);

Modified: trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp (295166 => 295167)


--- trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp	2022-06-03 01:31:02 UTC (rev 295166)
+++ trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp	2022-06-03 02:08:02 UTC (rev 295167)
@@ -81,6 +81,16 @@
     m_token.appendToCharacter(character);
 }
 
+template<typename CharacterType>
+inline void HTMLTokenizer::bufferCharacters(Span<const CharacterType> characters)
+{
+#if ASSERT_ENABLED
+    for (auto character : characters)
+        ASSERT(character != kEndOfFileMarker);
+#endif
+    m_token.appendToCharacter(characters);
+}
+
 inline bool HTMLTokenizer::emitAndResumeInDataState(SegmentedString& source)
 {
     saveEndTagNameIfNeeded();
@@ -130,8 +140,10 @@
         ASSERT(decodedEntity.isEmpty());
         bufferASCIICharacter('&');
     } else {
-        for (unsigned i = 0; i < decodedEntity.length(); ++i)
-            bufferCharacter(decodedEntity[i]);
+        if (decodedEntity.is8Bit())
+            bufferCharacters(decodedEntity.span<LChar>());
+        else
+            bufferCharacters(decodedEntity.span<UChar>());
     }
     return true;
 }

Modified: trunk/Source/WebCore/html/parser/HTMLTokenizer.h (295166 => 295167)


--- trunk/Source/WebCore/html/parser/HTMLTokenizer.h	2022-06-03 01:31:02 UTC (rev 295166)
+++ trunk/Source/WebCore/html/parser/HTMLTokenizer.h	2022-06-03 02:08:02 UTC (rev 295167)
@@ -159,6 +159,7 @@
 
     void bufferASCIICharacter(UChar);
     void bufferCharacter(UChar);
+    template<typename CharacterType> void bufferCharacters(Span<const CharacterType>);
 
     bool emitAndResumeInDataState(SegmentedString&);
     bool emitAndReconsumeInDataState();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to