Index: third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp |
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp |
index 7b9109c7d6017bef8b7692bddb540e6561ed5a38..79583d0f0607ab309e475cc7eb355aa090bc12b2 100644 |
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp |
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserIdioms.cpp |
@@ -161,9 +161,7 @@ static bool parseHTMLIntegerInternal(const CharacterType* position, |
const CharacterType* end, |
int& value) { |
// Step 3 |
- // We do not do this step and do not have a local sign |
- // variable since due to a bug in charactersToIntStrict |
- // we have to add the sign to the digits string. |
+ bool isNegative = false; |
// Step 4 |
while (position < end) { |
@@ -178,9 +176,8 @@ static bool parseHTMLIntegerInternal(const CharacterType* position, |
ASSERT(position < end); |
// Step 6 |
- StringBuilder digits; |
if (*position == '-') { |
- digits.append('-'); |
+ isNegative = true; |
++position; |
} else if (*position == '+') |
++position; |
@@ -193,19 +190,22 @@ static bool parseHTMLIntegerInternal(const CharacterType* position, |
return false; |
// Step 8 |
- while (position < end) { |
- if (!isASCIIDigit(*position)) |
- break; |
- digits.append(*position++); |
- } |
- |
+ static const int intMax = std::numeric_limits<int>::max(); |
+ const int base = 10; |
+ const int maxMultiplier = intMax / base; |
+ |
+ unsigned temp = 0; |
+ do { |
+ int digitValue = *position - '0'; |
+ if (temp > maxMultiplier || |
+ (temp == maxMultiplier && digitValue > (intMax % base) + isNegative)) |
+ return false; |
+ temp = temp * base + digitValue; |
+ ++position; |
+ } while (position < end && isASCIIDigit(*position)); |
// Step 9 |
- bool ok; |
- if (digits.is8Bit()) |
- value = charactersToIntStrict(digits.characters8(), digits.length(), &ok); |
- else |
- value = charactersToIntStrict(digits.characters16(), digits.length(), &ok); |
- return ok; |
+ value = isNegative ? (0 - temp) : temp; |
+ return true; |
} |
// http://www.whatwg.org/specs/web-apps/current-work/#rules-for-parsing-integers |