Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp |
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp b/third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp |
| index a4d30292d96e9e7a8fe991a0ae3a42a828060818..df1548f4d5327359dcf2272ea2e286577acacad1 100644 |
| --- a/third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp |
| +++ b/third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp |
| @@ -18,7 +18,7 @@ namespace blink { |
| namespace blink { |
| CSSTokenizer::Scope::Scope(const String& string) |
| -: m_string(string) |
| + : m_string(string) |
| { |
| // According to the spec, we should perform preprocessing here. |
| // See: http://dev.w3.org/csswg/css-syntax/#input-preprocessing |
| @@ -48,7 +48,7 @@ CSSTokenizer::Scope::Scope(const String& string) |
| } |
| CSSTokenizer::Scope::Scope(const String& string, CSSParserObserverWrapper& wrapper) |
| -: m_string(string) |
| + : m_string(string) |
| { |
| if (string.isEmpty()) |
| return; |
| @@ -76,7 +76,7 @@ CSSTokenizer::Scope::Scope(const String& string, CSSParserObserverWrapper& wrapp |
| CSSParserTokenRange CSSTokenizer::Scope::tokenRange() |
| { |
| - return m_tokens; |
| + return CSSParserTokenRange(m_tokens.begin(), m_tokens.end()); |
| } |
| unsigned CSSTokenizer::Scope::tokenCount() |
| @@ -125,7 +125,7 @@ CSSParserToken CSSTokenizer::whiteSpace(UChar cc) |
| return CSSParserToken(WhitespaceToken); |
| } |
| -static bool popIfBlockMatches(Vector<CSSParserTokenType>& blockStack, CSSParserTokenType type) |
| +static bool popIfBlockMatches(Vector<CSSParserTokenType, 8>& blockStack, CSSParserTokenType type) |
| { |
| if (!blockStack.isEmpty() && blockStack.last() == type) { |
| blockStack.removeLast(); |
| @@ -358,18 +358,184 @@ CSSParserToken CSSTokenizer::nextToken() |
| // incremental tokenization of partial sources. |
| // However, for now we follow the spec exactly. |
| UChar cc = consume(); |
| - CodePoint codePointFunc = 0; |
| - if (isASCII(cc)) { |
| - ASSERT_WITH_SECURITY_IMPLICATION(cc < codePointsNumber); |
| - codePointFunc = codePoints[cc]; |
| - } else { |
| - codePointFunc = &CSSTokenizer::nameStart; |
| + switch (cc) { |
| + case 0: |
| + return endOfFile(cc); |
| + case 1: |
| + case 2: |
| + case 3: |
| + case 4: |
| + case 5: |
| + case 6: |
| + case 7: |
| + case 8: |
| + return CSSParserToken(DelimiterToken, cc); |
|
esprehn
2016/04/22 23:30:58
Skip the virtual call overhead of the lookup table
Timothy Loh
2016/04/27 06:52:05
This is definitely an improvement (I think using c
|
| + case 9: |
| + case 10: |
| + return whiteSpace(cc); |
| + case 11: |
| + return CSSParserToken(DelimiterToken, cc); |
| + case 12: |
| + case 13: |
| + return whiteSpace(cc); |
| + case 14: |
| + case 15: |
| + case 16: |
| + case 17: |
| + case 18: |
| + case 19: |
| + case 20: |
| + case 21: |
| + case 22: |
| + case 23: |
| + case 24: |
| + case 25: |
| + case 26: |
| + case 27: |
| + case 28: |
| + case 29: |
| + case 30: |
| + case 31: |
| + return CSSParserToken(DelimiterToken, cc); |
| + case 32: |
| + return whiteSpace(cc); |
| + case 33: |
| + return CSSParserToken(DelimiterToken, cc); |
| + case 34: |
| + return stringStart(cc); |
| + case 35: |
| + return hash(cc); |
| + case 36: |
| + return dollarSign(cc); |
| + case 37: |
| + case 38: |
| + return CSSParserToken(DelimiterToken, cc); |
| + case 39: |
| + return stringStart(cc); |
| + case 40: |
| + return leftParenthesis(cc); |
| + case 41: |
| + return rightParenthesis(cc); |
| + case 42: |
| + return asterisk(cc); |
| + case 43: |
| + return plusOrFullStop(cc); |
| + case 44: |
| + return comma(cc); |
| + case 45: |
| + return hyphenMinus(cc); |
| + case 46: |
| + return plusOrFullStop(cc); |
| + case 47: |
| + return solidus(cc); |
| + case 48: |
| + case 49: |
| + case 50: |
| + case 51: |
| + case 52: |
| + case 53: |
| + case 54: |
| + case 55: |
| + case 56: |
| + case 57: |
| + return asciiDigit(cc); |
| + case 58: |
| + return colon(cc); |
| + case 59: |
| + return semiColon(cc); |
| + case 60: |
| + return lessThan(cc); |
| + case 61: |
| + case 62: |
| + case 63: |
| + return CSSParserToken(DelimiterToken, cc); |
| + case 64: |
| + return commercialAt(cc); |
| + case 65: |
| + case 66: |
| + case 67: |
| + case 68: |
| + case 69: |
| + case 70: |
| + case 71: |
| + case 72: |
| + case 73: |
| + case 74: |
| + case 75: |
| + case 76: |
| + case 77: |
| + case 78: |
| + case 79: |
| + case 80: |
| + case 81: |
| + case 82: |
| + case 83: |
| + case 84: |
| + return nameStart(cc); |
| + case 85: |
| + return letterU(cc); |
| + case 86: |
| + case 87: |
| + case 88: |
| + case 89: |
| + case 90: |
| + return nameStart(cc); |
| + case 91: |
| + return leftBracket(cc); |
| + case 92: |
| + return reverseSolidus(cc); |
| + case 93: |
| + return rightBracket(cc); |
| + case 94: |
| + return circumflexAccent(cc); |
| + case 95: |
| + return nameStart(cc); |
| + case 96: |
| + return CSSParserToken(DelimiterToken, cc); |
| + case 97: |
| + case 98: |
| + case 99: |
| + case 100: |
| + case 101: |
| + case 102: |
| + case 103: |
| + case 104: |
| + case 105: |
| + case 106: |
| + case 107: |
| + case 108: |
| + case 109: |
| + case 110: |
| + case 111: |
| + case 112: |
| + case 113: |
| + case 114: |
| + case 115: |
| + case 116: |
| + return nameStart(cc); |
| + case 117: |
| + return letterU(cc); |
| + case 118: |
| + case 119: |
| + case 120: |
| + case 121: |
| + case 122: |
| + return nameStart(cc); |
| + case 123: |
| + return leftBrace(cc); |
| + case 124: |
| + return verticalLine(cc); |
| + case 125: |
| + return rightBrace(cc); |
| + case 126: |
| + return tilde(cc); |
| + case 127: |
| + return CSSParserToken(DelimiterToken, cc); |
| } |
| - if (codePointFunc) |
| - return ((this)->*(codePointFunc))(cc); |
| - return CSSParserToken(DelimiterToken, cc); |
| + ASSERT(!isASCII(cc)); |
| + return nameStart(cc); |
| } |
| static NumericSign getSign(CSSTokenizerInputStream& input, unsigned& offset) |
| @@ -619,7 +785,7 @@ void CSSTokenizer::consumeBadUrlRemnants() |
| } |
| } |
| -void CSSTokenizer::consumeUntilNonWhitespace() |
| +ALWAYS_INLINE void CSSTokenizer::consumeUntilNonWhitespace() |
| { |
| // Using HTML space here rather than CSS space since we don't do preprocessing |
| while (isHTMLSpace<UChar>(m_input.nextInputChar())) |
| @@ -749,8 +915,11 @@ bool CSSTokenizer::nextCharsAreNumber() |
| // http://dev.w3.org/csswg/css-syntax/#would-start-an-identifier |
| bool CSSTokenizer::nextCharsAreIdentifier(UChar first) |
| { |
| + if (isNameStartCodePoint(first)) |
| + return true; |
| + |
| UChar second = m_input.nextInputChar(); |
| - if (isNameStartCodePoint(first) || twoCharsAreValidEscape(first, second)) |
| + if (twoCharsAreValidEscape(first, second)) |
| return true; |
| if (first == '-') |