Index: src/runtime/runtime-numbers.cc |
diff --git a/src/runtime/runtime-numbers.cc b/src/runtime/runtime-numbers.cc |
index 49734ba8ddeac904827be4299b216fc1e74e712f..d99d5fc548bbec0d95f8b5f560e29964d3a2f436 100644 |
--- a/src/runtime/runtime-numbers.cc |
+++ b/src/runtime/runtime-numbers.cc |
@@ -112,81 +112,11 @@ RUNTIME_FUNCTION(Runtime_IsValidSmi) { |
} |
-static bool AreDigits(const uint8_t* s, int from, int to) { |
- for (int i = from; i < to; i++) { |
- if (s[i] < '0' || s[i] > '9') return false; |
- } |
- |
- return true; |
-} |
- |
- |
-static int ParseDecimalInteger(const uint8_t* s, int from, int to) { |
- DCHECK(to - from < 10); // Overflow is not possible. |
- DCHECK(from < to); |
- int d = s[from] - '0'; |
- |
- for (int i = from + 1; i < to; i++) { |
- d = 10 * d + (s[i] - '0'); |
- } |
- |
- return d; |
-} |
- |
- |
RUNTIME_FUNCTION(Runtime_StringToNumber) { |
HandleScope handle_scope(isolate); |
- DCHECK(args.length() == 1); |
+ DCHECK_EQ(1, args.length()); |
CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
- subject = String::Flatten(subject); |
- |
- // Fast case: short integer or some sorts of junk values. |
- if (subject->IsSeqOneByteString()) { |
- int len = subject->length(); |
- if (len == 0) return Smi::FromInt(0); |
- |
- DisallowHeapAllocation no_gc; |
- uint8_t const* data = Handle<SeqOneByteString>::cast(subject)->GetChars(); |
- bool minus = (data[0] == '-'); |
- int start_pos = (minus ? 1 : 0); |
- |
- if (start_pos == len) { |
- return isolate->heap()->nan_value(); |
- } else if (data[start_pos] > '9') { |
- // Fast check for a junk value. A valid string may start from a |
- // whitespace, a sign ('+' or '-'), the decimal point, a decimal digit |
- // or the 'I' character ('Infinity'). All of that have codes not greater |
- // than '9' except 'I' and . |
- if (data[start_pos] != 'I' && data[start_pos] != 0xa0) { |
- return isolate->heap()->nan_value(); |
- } |
- } else if (len - start_pos < 10 && AreDigits(data, start_pos, len)) { |
- // The maximal/minimal smi has 10 digits. If the string has less digits |
- // we know it will fit into the smi-data type. |
- int d = ParseDecimalInteger(data, start_pos, len); |
- if (minus) { |
- if (d == 0) return isolate->heap()->minus_zero_value(); |
- d = -d; |
- } else if (!subject->HasHashCode() && len <= String::kMaxArrayIndexSize && |
- (len == 1 || data[0] != '0')) { |
- // String hash is not calculated yet but all the data are present. |
- // Update the hash field to speed up sequential convertions. |
- uint32_t hash = StringHasher::MakeArrayIndexHash(d, len); |
-#ifdef DEBUG |
- subject->Hash(); // Force hash calculation. |
- DCHECK_EQ(static_cast<int>(subject->hash_field()), |
- static_cast<int>(hash)); |
-#endif |
- subject->set_hash_field(hash); |
- } |
- return Smi::FromInt(d); |
- } |
- } |
- |
- // Slower case. |
- int flags = ALLOW_HEX | ALLOW_OCTAL | ALLOW_BINARY; |
- return *isolate->factory()->NewNumber( |
- StringToDouble(isolate->unicode_cache(), subject, flags)); |
+ return *String::ToNumber(subject); |
} |