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

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

Issue 2217853002: Merge all of the consumeNumber() logic and make a single call to getDouble. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add back CSSParserFastPath. Created 4 years, 4 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/css/parser/CSSTokenizerInputStream.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ac95dbbf755fbd0f0f021f67c5a575154dbbad4f..282bc3a549d9c0d555051d870bdcb76200bae74e 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSTokenizer.cpp
@@ -364,86 +364,47 @@ CSSParserToken CSSTokenizer::nextToken()
return CSSParserToken(DelimiterToken, cc);
}
-static NumericSign getSign(CSSTokenizerInputStream& input, unsigned& offset)
-{
- UChar next = input.peekWithoutReplacement(0);
- if (next == '+') {
- ++offset;
- return PlusSign;
- }
- if (next == '-') {
- ++offset;
- return MinusSign;
- }
- return NoSign;
-}
-
-static double getInteger(CSSTokenizerInputStream& input, unsigned& offset)
-{
- unsigned intStartPos = offset;
- offset = input.skipWhilePredicate<isASCIIDigit>(offset);
- unsigned intEndPos = offset;
- return input.getDouble(intStartPos, intEndPos);
-}
-
-static double getFraction(CSSTokenizerInputStream& input, unsigned& offset)
-{
- if (input.peekWithoutReplacement(offset) != '.'
- || !isASCIIDigit(input.peekWithoutReplacement(offset + 1)))
- return 0;
- unsigned startOffset = offset;
- offset = input.skipWhilePredicate<isASCIIDigit>(offset + 1);
- return input.getDouble(startOffset, offset);
-}
-
-static double getExponent(CSSTokenizerInputStream& input, unsigned& offset, int& sign)
-{
- unsigned exponentStartPos = 0;
- unsigned exponentEndPos = 0;
- UChar next = input.peekWithoutReplacement(offset);
- if (next != 'E' && next != 'e')
- return 0;
- int offsetBeforeExponent = offset;
- ++offset;
- next = input.peekWithoutReplacement(offset);
- if (next == '+') {
- ++offset;
- } else if (next =='-') {
- sign = -1;
- ++offset;
- }
- exponentStartPos = offset;
- offset = input.skipWhilePredicate<isASCIIDigit>(offset);
- exponentEndPos = offset;
- if (exponentEndPos == exponentStartPos)
- offset = offsetBeforeExponent;
- return input.getDouble(exponentStartPos, exponentEndPos);
-}
-
// This method merges the following spec sections for efficiency
// http://www.w3.org/TR/css3-syntax/#consume-a-number
// http://www.w3.org/TR/css3-syntax/#convert-a-string-to-a-number
CSSParserToken CSSTokenizer::consumeNumber()
{
ASSERT(nextCharsAreNumber());
+
NumericValueType type = IntegerValueType;
- double value = 0;
- unsigned offset = 0;
- int exponentSign = 1;
- NumericSign sign = getSign(m_input, offset);
- double integerPart = getInteger(m_input, offset);
- unsigned integerPartEndOffset = offset;
-
- double fractionPart = getFraction(m_input, offset);
- double exponentPart = getExponent(m_input, offset, exponentSign);
- double exponent = pow(10, (float)exponentSign * (double)exponentPart);
- value = ((double)integerPart + fractionPart) * exponent;
- if (sign == MinusSign)
- value = -value;
-
- m_input.advance(offset);
- if (offset != integerPartEndOffset)
+ NumericSign sign = NoSign;
+ unsigned numberLength = 0;
+
+ UChar next = m_input.peekWithoutReplacement(0);
+ if (next == '+') {
+ ++numberLength;
+ sign = PlusSign;
+ } else if (next == '-') {
+ ++numberLength;
+ sign = MinusSign;
+ }
+
+ numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength);
+ next = m_input.peekWithoutReplacement(numberLength);
+ if (next == '.' && isASCIIDigit(m_input.peekWithoutReplacement(numberLength + 1))) {
type = NumberValueType;
+ numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength + 2);
+ next = m_input.peekWithoutReplacement(numberLength);
+ }
+
+ if (next == 'E' || next == 'e') {
+ next = m_input.peekWithoutReplacement(numberLength + 1);
+ if (isASCIIDigit(next)) {
+ type = NumberValueType;
+ numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength + 1);
+ } else if ((next == '+' || next == '-') && isASCIIDigit(m_input.peekWithoutReplacement(numberLength + 2))) {
+ type = NumberValueType;
+ numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength + 3);
+ }
+ }
+
+ double value = m_input.getDouble(0, numberLength);
Timothy Loh 2016/08/09 02:31:44 getDouble doesn't really need the start argument a
esprehn 2016/08/09 04:03:32 Yeah, I'll do that next.
+ m_input.advance(numberLength);
return CSSParserToken(NumberToken, value, type, sign);
}
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/css/parser/CSSTokenizerInputStream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698