Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp

Issue 1920583002: NOT FOR LANDING: Hack up CSSParser for speed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: missing consts. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 == '-')

Powered by Google App Engine
This is Rietveld 408576698