⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 295167 in webkit


Ignore:
Timestamp:
Jun 2, 2022, 7:08:02 PM (4 years ago)
Author:
Chris Dumez
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

Location:
trunk/Source
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/wtf/text/StringBuilder.h

    r294852 r295167  
    9494    const LChar* characters8() const { return characters<LChar>(); }
    9595    const UChar* characters16() const { return characters<UChar>(); }
     96    template<typename CharacterType> Span<const CharacterType> span() const { return Span { characters<CharacterType>(), length() }; }
    9697   
    9798    unsigned capacity() const;
  • trunk/Source/WebCore/html/parser/HTMLToken.h

    r295009 r295167  
    123123    void appendToCharacter(UChar);
    124124    void appendToCharacter(const Vector<LChar, 32>&);
     125    template<typename CharacterType> void appendToCharacter(Span<const CharacterType>);
    125126
    126127    // Comment.
    … …  
    374375    m_type = Character;
    375376    m_data.appendVector(characters);
     377}
     378
     379template<typename CharacterType>
     380inline void HTMLToken::appendToCharacter(Span<const CharacterType> characters)
     381{
     382    m_type = Character;
     383    m_data.append(characters);
     384    if constexpr (std::is_same_v<CharacterType, UChar>) {
     385        if (!charactersIsAll8BitData())
     386            return;
     387        for (auto character : characters)
     388            m_data8BitCheck |= character;
     389    }
    376390}
    377391
  • trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp

    r295143 r295167  
    8282}
    8383
     84template<typename CharacterType>
     85inline void HTMLTokenizer::bufferCharacters(Span<const CharacterType> characters)
     86{
     87#if ASSERT_ENABLED
     88    for (auto character : characters)
     89        ASSERT(character != kEndOfFileMarker);
     90#endif
     91    m_token.appendToCharacter(characters);
     92}
     93
    8494inline bool HTMLTokenizer::emitAndResumeInDataState(SegmentedString& source)
    8595{
    … …  
    131141        bufferASCIICharacter('&');
    132142    } else {
    133         for (unsigned i = 0; i < decodedEntity.length(); ++i)
    134             bufferCharacter(decodedEntity[i]);
     143        if (decodedEntity.is8Bit())
     144            bufferCharacters(decodedEntity.span<LChar>());
     145        else
     146            bufferCharacters(decodedEntity.span<UChar>());
    135147    }
    136148    return true;
  • trunk/Source/WebCore/html/parser/HTMLTokenizer.h

    r295143 r295167  
    160160    void bufferASCIICharacter(UChar);
    161161    void bufferCharacter(UChar);
     162    template<typename CharacterType> void bufferCharacters(Span<const CharacterType>);
    162163
    163164    bool emitAndResumeInDataState(SegmentedString&);
Note: See TracChangeset for help on using the changeset viewer.