Changeset 60697 in webkit


Ignore:
Timestamp:
Jun 4, 2010 12:30:09 PM (14 years ago)
Author:
abarth@webkit.org
Message:

2010-06-04 Adam Barth <abarth@webkit.org>

Reviewed by Eric Seidel.

Make HTML5Lexer go fast
https://bugs.webkit.org/show_bug.cgi?id=40048

More small steps. This patch deals with emitting tokens.

  • html/HTML5Lexer.cpp: (WebCore::HTML5Lexer::nextToken):
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r60696 r60697  
     12010-06-04  Adam Barth  <abarth@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Make HTML5Lexer go fast
     6        https://bugs.webkit.org/show_bug.cgi?id=40048
     7
     8        More small steps.  This patch deals with emitting tokens.
     9
     10        * html/HTML5Lexer.cpp:
     11        (WebCore::HTML5Lexer::nextToken):
     12
    1132010-06-04  Adam Barth  <abarth@webkit.org>
    214
  • trunk/WebCore/html/HTML5Lexer.cpp

    r60696 r60697  
    322322#define END_STATE() ASSERT_NOT_REACHED(); break;
    323323
     324#define EMIT_AND_RESUME_IN(stateName)                                       \
     325    do {                                                                    \
     326        emitCurrentToken();                                                 \
     327        m_state = DataState;                                                \
     328    } while (false)
     329
    324330// We'd like to use the standard do { } while (false) pattern here, but it
    325331// doesn't play nicely with continue.
     
    476482                m_state = SelfClosingStartTagState;
    477483            else if (cc == '>') {
    478                 emitCurrentToken();
    479                 m_state = DataState;
     484                EMIT_AND_RESUME_IN(DataState);
    480485            } else if (cc >= 'A' && cc <= 'Z')
    481486                m_token->appendToName(toLowerCase(cc));
     
    948953                m_state = SelfClosingStartTagState;
    949954            else if (cc == '>') {
    950                 emitCurrentToken();
    951                 m_state = DataState;
     955                EMIT_AND_RESUME_IN(DataState);
    952956            } else if (cc >= 'A' && cc <= 'Z') {
    953957                m_token->addNewAttribute();
     
    974978                m_state = BeforeAttributeValueState;
    975979            else if (cc == '>') {
    976                 emitCurrentToken();
    977                 m_state = DataState;
     980                EMIT_AND_RESUME_IN(DataState);
    978981            } else if (cc >= 'A' && cc <= 'Z')
    979982                m_token->appendToAttributeName(toLowerCase(cc));
     
    9971000                m_state = BeforeAttributeValueState;
    9981001            else if (cc == '=') {
    999                 emitCurrentToken();
    1000                 m_state = DataState;
     1002                EMIT_AND_RESUME_IN(DataState);
    10011003            } else if (cc >= 'A' && cc <= 'Z') {
    10021004                m_token->addNewAttribute();
     
    10261028            else if (cc == '>') {
    10271029                emitParseError();
    1028                 emitCurrentToken();
    1029                 m_state = DataState;
     1030                EMIT_AND_RESUME_IN(DataState);
    10301031            } else {
    10311032                if (cc == '<' || cc == '=' || cc == '`')
     
    10711072                m_additionalAllowedCharacter = '>';
    10721073            } else if (cc == '>') {
    1073                 emitCurrentToken();
    1074                 m_state = DataState;
     1074                EMIT_AND_RESUME_IN(DataState);
    10751075            } else {
    10761076                if (cc == '"' || cc == '\'' || cc == '<' || cc == '=' || cc == '`')
     
    11181118                m_state = SelfClosingStartTagState;
    11191119            else if (cc == '>') {
    1120                 emitCurrentToken();
    1121                 m_state = DataState;
     1120                EMIT_AND_RESUME_IN(DataState);
    11221121            } else {
    11231122                emitParseError();
     
    11321131            if (cc == '>') {
    11331132                notImplemented();
    1134                 emitCurrentToken();
    1135                 m_state = DataState;
     1133                EMIT_AND_RESUME_IN(DataState);
    11361134            } else {
    11371135                emitParseError();
     
    11521150                source.advance(m_lineNumber);
    11531151            }
    1154             emitCurrentToken();
    1155             m_state = DataState;
     1152            EMIT_AND_RESUME_IN(DataState);
    11561153            if (source.isEmpty())
    11571154                return true;
     
    11941191            else if (cc == '>') {
    11951192                emitParseError();
    1196                 emitCurrentToken();
    1197                 m_state = DataState;
     1193                EMIT_AND_RESUME_IN(DataState);
    11981194            } else {
    11991195                m_token->appendToComment(cc);
     
    12101206            else if (cc == '>') {
    12111207                emitParseError();
    1212                 emitCurrentToken();
    1213                 m_state = DataState;
     1208                EMIT_AND_RESUME_IN(DataState);
    12141209            } else {
    12151210                m_token->appendToComment('-');
     
    12471242        BEGIN_STATE(CommentEndState) {
    12481243            if (cc == '>') {
    1249                 emitCurrentToken();
    1250                 m_state = DataState;
     1244                EMIT_AND_RESUME_IN(DataState);
    12511245            } else if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ') {
    12521246                emitParseError();
     
    12811275                m_state = CommentEndDashState;
    12821276            } else if (cc == '>') {
    1283                 emitCurrentToken();
    1284                 m_state = DataState;
     1277                EMIT_AND_RESUME_IN(DataState);
    12851278            } else {
    12861279                m_token->appendToComment('-');
     
    13011294                m_state = CommentEndDashState;
    13021295            else if (cc == '>') {
    1303                 emitCurrentToken();
    1304                 m_state = DataState;
     1296                EMIT_AND_RESUME_IN(DataState);
    13051297            } else {
    13061298                m_token->appendToComment(cc);
     
    13341326                m_token->beginDOCTYPE();
    13351327                notImplemented();
    1336                 emitCurrentToken();
    1337                 m_state = DataState;
     1328                EMIT_AND_RESUME_IN(DataState);
    13381329            } else {
    13391330                m_token->beginDOCTYPE(cc);
     
    13491340                m_state = AfterDOCTYPENameState;
    13501341            else if (cc == '>') {
    1351                 emitCurrentToken();
    1352                 m_state = DataState;
     1342                EMIT_AND_RESUME_IN(DataState);
    13531343            } else if (cc >= 'A' && cc <= 'Z')
    13541344                m_token->appendToName(toLowerCase(cc));
     
    13641354                break;
    13651355            if (cc == '>') {
    1366                 emitCurrentToken();
    1367                 m_state = DataState;
     1356                EMIT_AND_RESUME_IN(DataState);
    13681357            } else {
    13691358                DEFINE_STATIC_LOCAL(String, publicString, ("public"));
     
    14071396                emitParseError();
    14081397                notImplemented();
    1409                 emitCurrentToken();
    1410                 m_state = DataState;
     1398                EMIT_AND_RESUME_IN(DataState);
    14111399            } else {
    14121400                emitParseError();
     
    14311419                emitParseError();
    14321420                notImplemented();
    1433                 emitCurrentToken();
    1434                 m_state = DataState;
     1421                EMIT_AND_RESUME_IN(DataState);
    14351422            } else {
    14361423                emitParseError();
     
    14491436                emitParseError();
    14501437                notImplemented();
    1451                 emitCurrentToken();
    1452                 m_state = DataState;
     1438                EMIT_AND_RESUME_IN(DataState);
    14531439            } else
    14541440                m_token->appendToPublicIdentifier(cc);
     
    14641450                emitParseError();
    14651451                notImplemented();
    1466                 emitCurrentToken();
    1467                 m_state = DataState;
     1452                EMIT_AND_RESUME_IN(DataState);
    14681453            } else
    14691454                m_token->appendToPublicIdentifier(cc);
     
    14771462                m_state = BetweenDOCTYPEPublicAndSystemIdentifiersState;
    14781463            else if (cc == '>') {
    1479                 emitCurrentToken();
    1480                 m_state = DataState;
     1464                EMIT_AND_RESUME_IN(DataState);
    14811465            } else if (cc == '"') {
    14821466                emitParseError();
     
    15011485                m_state = BetweenDOCTYPEPublicAndSystemIdentifiersState;
    15021486            else if (cc == '>') {
    1503                 emitCurrentToken();
    1504                 m_state = DataState;
     1487                EMIT_AND_RESUME_IN(DataState);
    15051488            } else if (cc == '"') {
    15061489                m_token->setSystemIdentifierToEmptyString();
     
    15331516                emitParseError();
    15341517                notImplemented();
    1535                 emitCurrentToken();
    1536                 m_state = DataState;
     1518                EMIT_AND_RESUME_IN(DataState);
    15371519            } else {
    15381520                emitParseError();
     
    15571539                emitParseError();
    15581540                notImplemented();
    1559                 emitCurrentToken();
    1560                 m_state = DataState;
     1541                EMIT_AND_RESUME_IN(DataState);
    15611542            } else {
    15621543                emitParseError();
     
    15751556                emitParseError();
    15761557                notImplemented();
    1577                 emitCurrentToken();
    1578                 m_state = DataState;
     1558                EMIT_AND_RESUME_IN(DataState);
    15791559            } else
    15801560                m_token->appendToSystemIdentifier(cc);
     
    15901570                emitParseError();
    15911571                notImplemented();
    1592                 emitCurrentToken();
    1593                 m_state = DataState;
     1572                EMIT_AND_RESUME_IN(DataState);
    15941573            } else
    15951574                m_token->appendToSystemIdentifier(cc);
     
    16031582                break;
    16041583            else if (cc == '>') {
    1605                 emitCurrentToken();
    1606                 m_state = DataState;
     1584                EMIT_AND_RESUME_IN(DataState);
    16071585            } else {
    16081586                emitParseError();
     
    16161594        BEGIN_STATE(BogusDOCTYPEState) {
    16171595            if (cc == '>') {
    1618                 emitCurrentToken();
    1619                 m_state = DataState;
     1596                EMIT_AND_RESUME_IN(DataState);
    16201597            }
    16211598            // FIXME: Handle EOF properly.
Note: See TracChangeset for help on using the changeset viewer.