Chromium Code Reviews| Index: src/objects.cc |
| =================================================================== |
| --- src/objects.cc (revision 550) |
| +++ src/objects.cc (working copy) |
| @@ -3890,7 +3890,7 @@ |
| bool String::ComputeArrayIndex(unibrow::CharacterStream* buffer, |
| uint32_t* index, |
| int length) { |
| - if (length == 0) return false; |
| + if (length == 0 || length > kMaxArrayIndexSize) return false; |
| uc32 ch = buffer->GetNext(); |
| // If the string begins with a '0' character, it must only consist |
| @@ -3918,8 +3918,16 @@ |
| bool String::SlowAsArrayIndex(uint32_t* index) { |
| - StringInputBuffer buffer(this); |
| - return ComputeArrayIndex(&buffer, index, length()); |
| + if (length() <= kMaxCachedArrayIndexLength) { |
| + Hash(); // force computation of hash code |
|
bak
2008/10/22 13:25:14
Capitalize to Force and add period.
|
| + uint32_t field = length_field(); |
| + if ((field & kIsArrayIndexMask) == 0) return false; |
| + *index = (field & ((1 << kShortLengthShift) - 1)) >> kLongLengthShift; |
| + return true; |
| + } else { |
| + StringInputBuffer buffer(this); |
| + return ComputeArrayIndex(&buffer, index, length()); |
| + } |
| } |
| @@ -3956,18 +3964,21 @@ |
| // Very long strings have a trivial hash that doesn't inspect the |
| // string contents. |
| - if (hasher.has_trivial_hash()) |
| + if (hasher.has_trivial_hash()) { |
| return hasher.GetHashField(); |
| + } |
| // Do the iterative array index computation as long as there is a |
| // chance this is an array index. |
| - while (buffer->has_more() && hasher.is_array_index()) |
| + while (buffer->has_more() && hasher.is_array_index()) { |
| hasher.AddCharacter(buffer->GetNext()); |
| + } |
| // Process the remaining characters without updating the array |
| // index. |
| - while (buffer->has_more()) |
| + while (buffer->has_more()) { |
| hasher.AddCharacterNoIndex(buffer->GetNext()); |
| + } |
| return hasher.GetHashField(); |
| } |