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