From e54ad9ee866309d870a8f947b7d612d62b753069 Mon Sep 17 00:00:00 2001 From: "serya@chromium.org" Date: Tue, 7 Sep 2010 11:32:20 +0000 Subject: [PATCH] Removing a wrong check. A strings which represents an array index with length 8 and 9 digits do not pass this check. However generated hash is valid. Review URL: http://codereview.chromium.org/3295017 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5420 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects.cc | 13 ++++++++----- src/objects.h | 3 ++- src/runtime.cc | 3 +-- test/mjsunit/str-to-num.js | 4 ++++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index 6a46c26..ef51851 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -4988,17 +4988,20 @@ bool String::SlowAsArrayIndex(uint32_t* index) { } -uint32_t StringHasher::MakeCachedArrayIndex(uint32_t value, int length) { - value <<= String::kHashShift; +uint32_t StringHasher::MakeArrayIndexHash(uint32_t value, int length) { // For array indexes mix the length into the hash as an array index could // be zero. ASSERT(length > 0); ASSERT(length <= String::kMaxArrayIndexSize); ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) < (1 << String::kArrayIndexValueBits)); - ASSERT(String::kMaxArrayIndexSize < (1 << String::kArrayIndexValueBits)); - value &= ~String::kIsNotArrayIndexMask; + + value <<= String::kHashShift; value |= length << String::kArrayIndexHashLengthShift; + + ASSERT((value & String::kIsNotArrayIndexMask) == 0); + ASSERT((length > String::kMaxCachedArrayIndexLength) || + (value & String::kContainsCachedArrayIndexMask) == 0); return value; } @@ -5007,7 +5010,7 @@ uint32_t StringHasher::GetHashField() { ASSERT(is_valid()); if (length_ <= String::kMaxHashCalcLength) { if (is_array_index()) { - return MakeCachedArrayIndex(array_index(), length_); + return MakeArrayIndexHash(array_index(), length_); } return (GetHash() << String::kHashShift) | String::kIsNotArrayIndexMask; } else { diff --git a/src/objects.h b/src/objects.h index ca668b4..7f6538c 100644 --- a/src/objects.h +++ b/src/objects.h @@ -4223,7 +4223,7 @@ class StringHasher { // Calculated hash value for a string consisting of 1 to // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). // value is represented decimal value. - static uint32_t MakeCachedArrayIndex(uint32_t value, int length); + static uint32_t MakeArrayIndexHash(uint32_t value, int length); private: @@ -4467,6 +4467,7 @@ class String: public HeapObject { kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields; STATIC_CHECK((kArrayIndexLengthBits > 0)); + STATIC_CHECK(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits)); static const int kArrayIndexHashLengthShift = kArrayIndexValueBits + kNofHashBitFields; diff --git a/src/runtime.cc b/src/runtime.cc index c7ec6bf..43a6734 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -4677,9 +4677,8 @@ static Object* Runtime_StringToNumber(Arguments args) { (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::MakeCachedArrayIndex(d, len); + uint32_t hash = StringHasher::MakeArrayIndexHash(d, len); #ifdef DEBUG - ASSERT((hash & String::kContainsCachedArrayIndexMask) == 0); subject->Hash(); // Force hash calculation. ASSERT_EQ(static_cast(subject->hash_field()), static_cast(hash)); diff --git a/test/mjsunit/str-to-num.js b/test/mjsunit/str-to-num.js index 20e2986..28e98d9 100644 --- a/test/mjsunit/str-to-num.js +++ b/test/mjsunit/str-to-num.js @@ -203,3 +203,7 @@ assertTrue(isNaN(toNumber("Infinity junk")), "Infinity junk"); assertTrue(isNaN(toNumber("1e")), "1e"); assertTrue(isNaN(toNumber("1e ")), "1e_"); assertTrue(isNaN(toNumber("1" + repeat('0', 1000) + 'junk')), "1e1000 junk"); + +for (var i = 1; i < 12; i++) { + assertEquals(toNumber('1' + repeat('0', i)), Math.pow(10.0, i)); +} -- 2.7.4