Changeset 60696 in webkit


Ignore:
Timestamp:
Jun 4, 2010 12:19:39 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

The next step: using macros to delimit each state. Evetually, we're
going to change what these macros expand to.

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

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r60694 r60696  
     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        The next step: using macros to delimit each state.  Evetually, we're
     9        going to change what these macros expand to.
     10
     11        * html/HTML5Lexer.cpp:
     12        (WebCore::HTML5Lexer::nextToken):
     13
    1142010-06-04  Adam Barth  <abarth@webkit.org>
    215
  • trunk/WebCore/html/HTML5Lexer.cpp

    r60694 r60696  
    319319}
    320320
     321#define BEGIN_STATE(stateName) case stateName:
     322#define END_STATE() ASSERT_NOT_REACHED(); break;
     323
    321324// We'd like to use the standard do { } while (false) pattern here, but it
    322325// doesn't play nicely with continue.
     
    355358        UChar cc = *source;
    356359        switch (m_state) {
    357         case DataState: {
     360        BEGIN_STATE(DataState) {
    358361            if (cc == '&')
    359362                m_state = CharacterReferenceInDataState;
     
    369372            break;
    370373        }
    371         case CharacterReferenceInDataState: {
     374        END_STATE()
     375
     376        BEGIN_STATE(CharacterReferenceInDataState) {
    372377            if (!processEntity(source))
    373378                return shouldEmitBufferedCharacterToken(source);
    374379            RECONSUME_IN(DataState);
    375380        }
    376         case RCDATAState: {
     381        END_STATE()
     382
     383        BEGIN_STATE(RCDATAState) {
    377384            if (cc == '&')
    378385                m_state = CharacterReferenceInRCDATAState;
     
    383390            break;
    384391        }
    385         case CharacterReferenceInRCDATAState: {
     392        END_STATE()
     393
     394        BEGIN_STATE(CharacterReferenceInRCDATAState) {
    386395            if (!processEntity(source))
    387396                return shouldEmitBufferedCharacterToken(source);
    388397            RECONSUME_IN(RCDATAState);
    389398        }
    390         case RAWTEXTState: {
     399        END_STATE()
     400
     401        BEGIN_STATE(RAWTEXTState) {
    391402            if (cc == '<')
    392403                m_state = RAWTEXTLessThanSignState;
     
    395406            break;
    396407        }
    397         case ScriptDataState: {
     408        END_STATE()
     409
     410        BEGIN_STATE(ScriptDataState) {
    398411            if (cc == '<')
    399412                m_state = ScriptDataLessThanSignState;
     
    402415            break;
    403416        }
    404         case PLAINTEXTState: {
     417        END_STATE()
     418
     419        BEGIN_STATE(PLAINTEXTState) {
    405420            emitCharacter(cc);
    406421            break;
    407422        }
    408         case TagOpenState: {
     423        END_STATE()
     424
     425        BEGIN_STATE(TagOpenState) {
    409426            if (cc == '!')
    410427                m_state = MarkupDeclarationOpenState;
     
    432449            break;
    433450        }
    434         case EndTagOpenState: {
     451        END_STATE()
     452
     453        BEGIN_STATE(EndTagOpenState) {
    435454            if (cc >= 'A' && cc <= 'Z') {
    436455                m_token->beginEndTag(toLowerCase(cc));
     
    449468            break;
    450469        }
    451         case TagNameState: {
     470        END_STATE()
     471
     472        BEGIN_STATE(TagNameState) {
    452473            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    453474                m_state = BeforeAttributeNameState;
     
    464485            break;
    465486        }
    466         case RCDATALessThanSignState: {
     487        END_STATE()
     488
     489        BEGIN_STATE(RCDATALessThanSignState) {
    467490            if (cc == '/') {
    468491                m_temporaryBuffer.clear();
     
    475498            break;
    476499        }
    477         case RCDATAEndTagOpenState: {
     500        END_STATE()
     501
     502        BEGIN_STATE(RCDATAEndTagOpenState) {
    478503            if (cc >= 'A' && cc <= 'Z') {
    479504                m_temporaryBuffer.append(cc);
     
    491516            break;
    492517        }
    493         case RCDATAEndTagNameState: {
     518        END_STATE()
     519
     520        BEGIN_STATE(RCDATAEndTagNameState) {
    494521            if (cc >= 'A' && cc <= 'Z') {
    495522                m_temporaryBuffer.append(cc);
     
    526553            break;
    527554        }
    528         case RAWTEXTLessThanSignState: {
     555        END_STATE()
     556
     557        BEGIN_STATE(RAWTEXTLessThanSignState) {
    529558            if (cc == '/') {
    530559                m_temporaryBuffer.clear();
     
    537566            break;
    538567        }
    539         case RAWTEXTEndTagOpenState: {
     568        END_STATE()
     569
     570        BEGIN_STATE(RAWTEXTEndTagOpenState) {
    540571            if (cc >= 'A' && cc <= 'Z') {
    541572                m_temporaryBuffer.append(cc);
     
    553584            break;
    554585        }
    555         case RAWTEXTEndTagNameState: {
     586        END_STATE()
     587
     588        BEGIN_STATE(RAWTEXTEndTagNameState) {
    556589            if (cc >= 'A' && cc <= 'Z') {
    557590                m_temporaryBuffer.append(cc);
     
    588621            break;
    589622        }
    590         case ScriptDataLessThanSignState: {
     623        END_STATE()
     624
     625        BEGIN_STATE(ScriptDataLessThanSignState) {
    591626            if (cc == '/') {
    592627                m_temporaryBuffer.clear();
     
    603638            break;
    604639        }
    605         case ScriptDataEndTagOpenState: {
     640        END_STATE()
     641
     642        BEGIN_STATE(ScriptDataEndTagOpenState) {
    606643            if (cc >= 'A' && cc <= 'Z') {
    607644                m_temporaryBuffer.append(cc);
     
    619656            break;
    620657        }
    621         case ScriptDataEndTagNameState: {
     658        END_STATE()
     659
     660        BEGIN_STATE(ScriptDataEndTagNameState) {
    622661            if (cc >= 'A' && cc <= 'Z') {
    623662                m_temporaryBuffer.append(cc);
     
    654693            break;
    655694        }
    656         case ScriptDataEscapeStartState: {
     695        END_STATE()
     696
     697        BEGIN_STATE(ScriptDataEscapeStartState) {
    657698            if (cc == '-') {
    658699                emitCharacter(cc);
     
    663704            break;
    664705        }
    665         case ScriptDataEscapeStartDashState: {
     706        END_STATE()
     707
     708        BEGIN_STATE(ScriptDataEscapeStartDashState) {
    666709            if (cc == '-') {
    667710                emitCharacter(cc);
     
    672715            break;
    673716        }
    674         case ScriptDataEscapedState: {
     717        END_STATE()
     718
     719        BEGIN_STATE(ScriptDataEscapedState) {
    675720            if (cc == '-') {
    676721                emitCharacter(cc);
     
    683728            break;
    684729        }
    685         case ScriptDataEscapedDashState: {
     730        END_STATE()
     731
     732        BEGIN_STATE(ScriptDataEscapedDashState) {
    686733            if (cc == '-') {
    687734                emitCharacter(cc);
     
    696743            break;
    697744        }
    698         case ScriptDataEscapedDashDashState: {
     745        END_STATE()
     746
     747        BEGIN_STATE(ScriptDataEscapedDashDashState) {
    699748            if (cc == '-')
    700749                emitCharacter(cc);
     
    711760            break;
    712761        }
    713         case ScriptDataEscapedLessThanSignState: {
     762        END_STATE()
     763
     764        BEGIN_STATE(ScriptDataEscapedLessThanSignState) {
    714765            if (cc == '/') {
    715766                m_temporaryBuffer.clear();
     
    734785            break;
    735786        }
    736         case ScriptDataEscapedEndTagOpenState: {
     787        END_STATE()
     788
     789        BEGIN_STATE(ScriptDataEscapedEndTagOpenState) {
    737790            if (cc >= 'A' && cc <= 'Z') {
    738791                m_temporaryBuffer.append(cc);
     
    750803            break;
    751804        }
    752         case ScriptDataEscapedEndTagNameState: {
     805        END_STATE()
     806
     807        BEGIN_STATE(ScriptDataEscapedEndTagNameState) {
    753808            if (cc >= 'A' && cc <= 'Z') {
    754809                m_temporaryBuffer.append(cc);
     
    785840            break;
    786841        }
    787         case ScriptDataDoubleEscapeStartState: {
     842        END_STATE()
     843
     844        BEGIN_STATE(ScriptDataDoubleEscapeStartState) {
    788845            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ' || cc == '/' || cc == '>') {
    789846                emitCharacter(cc);
     
    803860            break;
    804861        }
    805         case ScriptDataDoubleEscapedState: {
     862        END_STATE()
     863
     864        BEGIN_STATE(ScriptDataDoubleEscapedState) {
    806865            if (cc == '-') {
    807866                emitCharacter(cc);
     
    815874            break;
    816875        }
    817         case ScriptDataDoubleEscapedDashState: {
     876        END_STATE()
     877
     878        BEGIN_STATE(ScriptDataDoubleEscapedDashState) {
    818879            if (cc == '-') {
    819880                emitCharacter(cc);
     
    829890            break;
    830891        }
    831         case ScriptDataDoubleEscapedDashDashState: {
     892        END_STATE()
     893
     894        BEGIN_STATE(ScriptDataDoubleEscapedDashDashState) {
    832895            if (cc == '-')
    833896                emitCharacter(cc);
     
    845908            break;
    846909        }
    847         case ScriptDataDoubleEscapedLessThanSignState: {
     910        END_STATE()
     911
     912        BEGIN_STATE(ScriptDataDoubleEscapedLessThanSignState) {
    848913            if (cc == '/') {
    849914                emitCharacter(cc);
     
    855920            break;
    856921        }
    857         case ScriptDataDoubleEscapeEndState: {
     922        END_STATE()
     923
     924        BEGIN_STATE(ScriptDataDoubleEscapeEndState) {
    858925            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ' || cc == '/' || cc == '>') {
    859926                emitCharacter(cc);
     
    873940            break;
    874941        }
    875         case BeforeAttributeNameState: {
     942        END_STATE()
     943
     944        BEGIN_STATE(BeforeAttributeNameState) {
    876945            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    877946                break;
     
    895964            break;
    896965        }
    897         case AttributeNameState: {
     966        END_STATE()
     967
     968        BEGIN_STATE(AttributeNameState) {
    898969            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    899970                m_state = AfterAttributeNameState;
     
    916987            break;
    917988        }
    918         case AfterAttributeNameState: {
     989        END_STATE()
     990
     991        BEGIN_STATE(AfterAttributeNameState) {
    919992            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    920993                break;
     
    9401013            break;
    9411014        }
    942         case BeforeAttributeValueState: {
     1015        END_STATE()
     1016
     1017        BEGIN_STATE(BeforeAttributeValueState) {
    9431018            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    9441019                break;
     
    9611036            break;
    9621037        }
    963         case AttributeValueDoubleQuotedState: {
     1038        END_STATE()
     1039
     1040        BEGIN_STATE(AttributeValueDoubleQuotedState) {
    9641041            if (cc == '"')
    9651042                m_state = AfterAttributeValueQuotedState;
     
    9721049            break;
    9731050        }
    974         case AttributeValueSingleQuotedState: {
     1051        END_STATE()
     1052
     1053        BEGIN_STATE(AttributeValueSingleQuotedState) {
    9751054            if (cc == '\'')
    9761055                m_state = AfterAttributeValueQuotedState;
     
    9831062            break;
    9841063        }
    985         case AttributeValueUnquotedState: {
     1064        END_STATE()
     1065
     1066        BEGIN_STATE(AttributeValueUnquotedState) {
    9861067            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    9871068                m_state = BeforeAttributeNameState;
     
    10001081            break;
    10011082        }
    1002         case CharacterReferenceInAttributeValueState: {
     1083        END_STATE()
     1084
     1085        BEGIN_STATE(CharacterReferenceInAttributeValueState) {
    10031086            bool notEnoughCharacters = false;
    10041087            unsigned value = consumeEntity(source, notEnoughCharacters);
     
    10271110            continue;
    10281111        }
    1029         case AfterAttributeValueQuotedState: {
     1112        END_STATE()
     1113
     1114        BEGIN_STATE(AfterAttributeValueQuotedState) {
    10301115            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    10311116                m_state = BeforeAttributeNameState;
     
    10421127            break;
    10431128        }
    1044         case SelfClosingStartTagState: {
     1129        END_STATE()
     1130
     1131        BEGIN_STATE(SelfClosingStartTagState) {
    10451132            if (cc == '>') {
    10461133                notImplemented();
     
    10541141            break;
    10551142        }
    1056         case BogusCommentState: {
     1143        END_STATE()
     1144
     1145        BEGIN_STATE(BogusCommentState) {
    10571146            m_token->beginComment();
    10581147            while (!source.isEmpty()) {
     
    10701159            break;
    10711160        }
    1072         case MarkupDeclarationOpenState: {
     1161        END_STATE()
     1162
     1163        BEGIN_STATE(MarkupDeclarationOpenState) {
    10731164            DEFINE_STATIC_LOCAL(String, dashDashString, ("--"));
    10741165            DEFINE_STATIC_LOCAL(String, doctypeString, ("doctype"));
     
    10961187            RECONSUME_IN(BogusCommentState);
    10971188        }
    1098         case CommentStartState: {
     1189        END_STATE()
     1190
     1191        BEGIN_STATE(CommentStartState) {
    10991192            if (cc == '-')
    11001193                m_state = CommentStartDashState;
     
    11101203            break;
    11111204        }
    1112         case CommentStartDashState: {
     1205        END_STATE()
     1206
     1207        BEGIN_STATE(CommentStartDashState) {
    11131208            if (cc == '-')
    11141209                m_state = CommentEndState;
     
    11251220            break;
    11261221        }
    1127         case CommentState: {
     1222        END_STATE()
     1223
     1224        BEGIN_STATE(CommentState) {
    11281225            if (cc == '-')
    11291226                m_state = CommentEndDashState;
     
    11331230            break;
    11341231        }
    1135         case CommentEndDashState: {
     1232        END_STATE()
     1233
     1234        BEGIN_STATE(CommentEndDashState) {
    11361235            if (cc == '-')
    11371236                m_state = CommentEndState;
     
    11441243            break;
    11451244        }
    1146         case CommentEndState: {
     1245        END_STATE()
     1246
     1247        BEGIN_STATE(CommentEndState) {
    11471248            if (cc == '>') {
    11481249                emitCurrentToken();
     
    11711272            break;
    11721273        }
    1173         case CommentEndBangState: {
     1274        END_STATE()
     1275
     1276        BEGIN_STATE(CommentEndBangState) {
    11741277            if (cc == '-') {
    11751278                m_token->appendToComment('-');
     
    11901293            break;
    11911294        }
    1192         case CommentEndSpaceState: {
     1295        END_STATE()
     1296
     1297        BEGIN_STATE(CommentEndSpaceState) {
    11931298            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    11941299                m_token->appendToComment(cc);
     
    12051310            break;
    12061311        }
    1207         case DOCTYPEState: {
     1312        END_STATE()
     1313
     1314        BEGIN_STATE(DOCTYPEState) {
    12081315            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    12091316                m_state = BeforeDOCTYPENameState;
     
    12151322            break;
    12161323        }
    1217         case BeforeDOCTYPENameState: {
     1324        END_STATE()
     1325
     1326        BEGIN_STATE(BeforeDOCTYPENameState) {
    12181327            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    12191328                break;
     
    12341343            break;
    12351344        }
    1236         case DOCTYPENameState: {
     1345        END_STATE()
     1346
     1347        BEGIN_STATE(DOCTYPENameState) {
    12371348            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    12381349                m_state = AfterDOCTYPENameState;
     
    12471358            break;
    12481359        }
    1249         case AfterDOCTYPENameState: {
     1360        END_STATE()
     1361
     1362        BEGIN_STATE(AfterDOCTYPENameState) {
    12501363            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    12511364                break;
     
    12781391            break;
    12791392        }
    1280         case AfterDOCTYPEPublicKeywordState: {
     1393        END_STATE()
     1394
     1395        BEGIN_STATE(AfterDOCTYPEPublicKeywordState) {
    12811396            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    12821397                m_state = BeforeDOCTYPEPublicIdentifierState;
     
    13021417            break;
    13031418        }
    1304         case BeforeDOCTYPEPublicIdentifierState: {
     1419        END_STATE()
     1420
     1421        BEGIN_STATE(BeforeDOCTYPEPublicIdentifierState) {
    13051422            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    13061423                break;
     
    13241441            break;
    13251442        }
    1326         case DOCTYPEPublicIdentifierDoubleQuotedState: {
     1443        END_STATE()
     1444
     1445        BEGIN_STATE(DOCTYPEPublicIdentifierDoubleQuotedState) {
    13271446            if (cc == '"')
    13281447                m_state = AfterDOCTYPEPublicIdentifierState;
     
    13371456            break;
    13381457        }
    1339         case DOCTYPEPublicIdentifierSingleQuotedState: {
     1458        END_STATE()
     1459
     1460        BEGIN_STATE(DOCTYPEPublicIdentifierSingleQuotedState) {
    13401461            if (cc == '\'')
    13411462                m_state = AfterDOCTYPEPublicIdentifierState;
     
    13501471            break;
    13511472        }
    1352         case AfterDOCTYPEPublicIdentifierState: {
     1473        END_STATE()
     1474
     1475        BEGIN_STATE(AfterDOCTYPEPublicIdentifierState) {
    13531476            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    13541477                m_state = BetweenDOCTYPEPublicAndSystemIdentifiersState;
     
    13721495            break;
    13731496        }
    1374         case BetweenDOCTYPEPublicAndSystemIdentifiersState: {
     1497        END_STATE()
     1498
     1499        BEGIN_STATE(BetweenDOCTYPEPublicAndSystemIdentifiersState) {
    13751500            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    13761501                m_state = BetweenDOCTYPEPublicAndSystemIdentifiersState;
     
    13921517            break;
    13931518        }
    1394         case AfterDOCTYPESystemKeywordState: {
     1519        END_STATE()
     1520
     1521        BEGIN_STATE(AfterDOCTYPESystemKeywordState) {
    13951522            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    13961523                m_state = BeforeDOCTYPESystemIdentifierState;
     
    14161543            break;
    14171544        }
    1418         case BeforeDOCTYPESystemIdentifierState: {
     1545        END_STATE()
     1546
     1547        BEGIN_STATE(BeforeDOCTYPESystemIdentifierState) {
    14191548            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    14201549                break;
     
    14381567            break;
    14391568        }
    1440         case DOCTYPESystemIdentifierDoubleQuotedState: {
     1569        END_STATE()
     1570
     1571        BEGIN_STATE(DOCTYPESystemIdentifierDoubleQuotedState) {
    14411572            if (cc == '"')
    14421573                m_state = AfterDOCTYPESystemIdentifierState;
     
    14511582            break;
    14521583        }
    1453         case DOCTYPESystemIdentifierSingleQuotedState: {
     1584        END_STATE()
     1585
     1586        BEGIN_STATE(DOCTYPESystemIdentifierSingleQuotedState) {
    14541587            if (cc == '\'')
    14551588                m_state = AfterDOCTYPESystemIdentifierState;
     
    14641597            break;
    14651598        }
    1466         case AfterDOCTYPESystemIdentifierState: {
     1599        END_STATE()
     1600
     1601        BEGIN_STATE(AfterDOCTYPESystemIdentifierState) {
    14671602            if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    14681603                break;
     
    14771612            break;
    14781613        }
    1479         case BogusDOCTYPEState: {
     1614        END_STATE()
     1615
     1616        BEGIN_STATE(BogusDOCTYPEState) {
    14801617            if (cc == '>') {
    14811618                emitCurrentToken();
     
    14851622            break;
    14861623        }
    1487         case CDATASectionState: {
     1624        END_STATE()
     1625
     1626        BEGIN_STATE(CDATASectionState) {
    14881627            notImplemented();
    14891628            break;
    14901629        }
     1630        END_STATE()
     1631
    14911632        }
    14921633        source.advance(m_lineNumber);
Note: See TracChangeset for help on using the changeset viewer.