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

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

Issue 662343002: CSS Tokenizer: Fix edge cases in number parsing (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 2 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: Source/core/css/parser/CSSTokenizer.cpp
diff --git a/Source/core/css/parser/CSSTokenizer.cpp b/Source/core/css/parser/CSSTokenizer.cpp
index 955fb19459dbac83fe298f37a23df689b1eb4627..069150f6ca923cae3c797c76a59694211a93a0e6 100644
--- a/Source/core/css/parser/CSSTokenizer.cpp
+++ b/Source/core/css/parser/CSSTokenizer.cpp
@@ -275,17 +275,13 @@ static unsigned long long getInteger(CSSTokenizerInputStream& input, unsigned& o
return input.getUInt(intStartPos, intEndPos);
}
-static double getFraction(CSSTokenizerInputStream& input, unsigned& offset, unsigned& digitsNumber)
+static double getFraction(CSSTokenizerInputStream& input, unsigned& offset)
{
- unsigned fractionStartPos = 0;
- unsigned fractionEndPos = 0;
- if (input.peek(offset) == '.' && isASCIIDigit(input.peek(++offset))) {
- fractionStartPos = offset - 1;
- offset = input.skipWhilePredicate<isASCIIDigit>(offset);
- fractionEndPos = offset;
- }
- digitsNumber = fractionEndPos- fractionStartPos;
- return input.getDouble(fractionStartPos, fractionEndPos);
+ if (input.peek(offset) != '.' || !isASCIIDigit(input.peek(offset + 1)))
+ return 0;
+ unsigned startOffset = offset;
+ offset = input.skipWhilePredicate<isASCIIDigit>(offset + 1);
+ return input.getDouble(startOffset, offset);
}
Yoav Weiss 2014/10/20 07:06:45 So beyond the refactoring (which I like), and the
Timothy Loh 2014/10/20 07:18:24 There's a change here which is to only consume the
Yoav Weiss 2014/10/20 07:26:14 Oh, right. So the move from 'isASCIIDigit(input.pe
static unsigned long long getExponent(CSSTokenizerInputStream& input, unsigned& offset, int& sign)
@@ -320,16 +316,17 @@ CSSParserToken CSSTokenizer::consumeNumber()
double value = 0;
unsigned offset = 0;
int exponentSign = 1;
- unsigned fractionDigits;
int sign = getSign(m_input, offset);
unsigned long long integerPart = getInteger(m_input, offset);
- double fractionPart = getFraction(m_input, offset, fractionDigits);
+ unsigned integerPartEndOffset = offset;
+
+ double fractionPart = getFraction(m_input, offset);
unsigned long long exponentPart = getExponent(m_input, offset, exponentSign);
double exponent = pow(10, (float)exponentSign * (double)exponentPart);
value = (double)sign * ((double)integerPart + fractionPart) * exponent;
m_input.advance(offset);
- if (fractionDigits > 0)
+ if (offset != integerPartEndOffset)
Yoav Weiss 2014/10/20 07:06:45 This is where the magic happens, and exponents are
Timothy Loh 2014/10/20 07:18:24 Yep
type = NumberValueType;
return CSSParserToken(NumberToken, value, type);
« no previous file with comments | « no previous file | Source/core/css/parser/CSSTokenizerTest.cpp » ('j') | Source/core/css/parser/CSSTokenizerTest.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698