Index: src/conversions-inl.h |
diff --git a/src/conversions-inl.h b/src/conversions-inl.h |
index 77b260f036483962892a88ec04f46624fca30aec..a98680fd80e85ea1ef3a1331974500815c502312 100644 |
--- a/src/conversions-inl.h |
+++ b/src/conversions-inl.h |
@@ -459,16 +459,23 @@ double InternalStringToDouble(UnicodeCache* unicode_cache, |
int insignificant_digits = 0; |
bool nonzero_digit_dropped = false; |
- bool negative = false; |
+ enum Sign { |
+ NONE, |
+ NEGATIVE, |
+ POSITIVE |
+ }; |
+ |
+ Sign sign = NONE; |
if (*current == '+') { |
// Ignore leading sign. |
++current; |
if (current == end) return JunkStringValue(); |
+ sign = POSITIVE; |
} else if (*current == '-') { |
++current; |
if (current == end) return JunkStringValue(); |
- negative = true; |
+ sign = NEGATIVE; |
} |
static const char kInfinitySymbol[] = "Infinity"; |
@@ -483,34 +490,34 @@ double InternalStringToDouble(UnicodeCache* unicode_cache, |
} |
ASSERT(buffer_pos == 0); |
- return negative ? -V8_INFINITY : V8_INFINITY; |
+ return (sign == NEGATIVE) ? -V8_INFINITY : V8_INFINITY; |
} |
bool leading_zero = false; |
if (*current == '0') { |
++current; |
- if (current == end) return SignedZero(negative); |
+ if (current == end) return SignedZero(sign == NEGATIVE); |
leading_zero = true; |
// It could be hexadecimal value. |
if ((flags & ALLOW_HEX) && (*current == 'x' || *current == 'X')) { |
++current; |
- if (current == end || !isDigit(*current, 16)) { |
+ if (current == end || !isDigit(*current, 16) || sign != NONE) { |
return JunkStringValue(); // "0x". |
} |
return InternalStringToIntDouble<4>(unicode_cache, |
current, |
end, |
- negative, |
+ false, |
allow_trailing_junk); |
} |
// Ignore leading zeros in the integer part. |
while (*current == '0') { |
++current; |
- if (current == end) return SignedZero(negative); |
+ if (current == end) return SignedZero(sign == NEGATIVE); |
} |
} |
@@ -555,7 +562,7 @@ double InternalStringToDouble(UnicodeCache* unicode_cache, |
// leading zeros (if any). |
while (*current == '0') { |
++current; |
- if (current == end) return SignedZero(negative); |
+ if (current == end) return SignedZero(sign == NEGATIVE); |
exponent--; // Move this 0 into the exponent. |
} |
} |
@@ -647,7 +654,7 @@ double InternalStringToDouble(UnicodeCache* unicode_cache, |
return InternalStringToIntDouble<3>(unicode_cache, |
buffer, |
buffer + buffer_pos, |
- negative, |
+ sign == NEGATIVE, |
allow_trailing_junk); |
} |
@@ -660,7 +667,7 @@ double InternalStringToDouble(UnicodeCache* unicode_cache, |
buffer[buffer_pos] = '\0'; |
double converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent); |
- return negative ? -converted : converted; |
+ return (sign == NEGATIVE) ? -converted : converted; |
} |
} } // namespace v8::internal |