| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 3257)
|
| +++ src/heap.cc (working copy)
|
| @@ -1763,10 +1763,14 @@
|
|
|
| Object* Heap::AllocateConsString(String* first, String* second) {
|
| int first_length = first->length();
|
| - if (first_length == 0) return second;
|
| + if (first_length == 0) {
|
| + return second;
|
| + }
|
|
|
| int second_length = second->length();
|
| - if (second_length == 0) return first;
|
| + if (second_length == 0) {
|
| + return first;
|
| + }
|
|
|
| int length = first_length + second_length;
|
| bool is_ascii = first->IsAsciiRepresentation()
|
| @@ -1829,43 +1833,6 @@
|
| }
|
|
|
|
|
| -Object* Heap::AllocateSlicedString(String* buffer,
|
| - int start,
|
| - int end) {
|
| - int length = end - start;
|
| -
|
| - // If the resulting string is small make a sub string.
|
| - if (length <= String::kMinNonFlatLength) {
|
| - return Heap::AllocateSubString(buffer, start, end);
|
| - }
|
| -
|
| - Map* map;
|
| - if (length <= String::kMaxShortSize) {
|
| - map = buffer->IsAsciiRepresentation() ?
|
| - short_sliced_ascii_string_map() :
|
| - short_sliced_string_map();
|
| - } else if (length <= String::kMaxMediumSize) {
|
| - map = buffer->IsAsciiRepresentation() ?
|
| - medium_sliced_ascii_string_map() :
|
| - medium_sliced_string_map();
|
| - } else {
|
| - map = buffer->IsAsciiRepresentation() ?
|
| - long_sliced_ascii_string_map() :
|
| - long_sliced_string_map();
|
| - }
|
| -
|
| - Object* result = Allocate(map, NEW_SPACE);
|
| - if (result->IsFailure()) return result;
|
| -
|
| - SlicedString* sliced_string = SlicedString::cast(result);
|
| - sliced_string->set_buffer(buffer);
|
| - sliced_string->set_start(start);
|
| - sliced_string->set_length(length);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -
|
| Object* Heap::AllocateSubString(String* buffer,
|
| int start,
|
| int end) {
|
| @@ -1885,22 +1852,19 @@
|
| ? AllocateRawAsciiString(length)
|
| : AllocateRawTwoByteString(length);
|
| if (result->IsFailure()) return result;
|
| + String* string_result = String::cast(result);
|
|
|
| // Copy the characters into the new object.
|
| - String* string_result = String::cast(result);
|
| - StringHasher hasher(length);
|
| - int i = 0;
|
| - for (; i < length && hasher.is_array_index(); i++) {
|
| - uc32 c = buffer->Get(start + i);
|
| - hasher.AddCharacter(c);
|
| - string_result->Set(i, c);
|
| + if (buffer->IsAsciiRepresentation()) {
|
| + ASSERT(string_result->IsAsciiRepresentation());
|
| + char* dest = SeqAsciiString::cast(string_result)->GetChars();
|
| + String::WriteToFlat(buffer, dest, start, end);
|
| + } else {
|
| + ASSERT(string_result->IsTwoByteRepresentation());
|
| + uc16* dest = SeqTwoByteString::cast(string_result)->GetChars();
|
| + String::WriteToFlat(buffer, dest, start, end);
|
| }
|
| - for (; i < length; i++) {
|
| - uc32 c = buffer->Get(start + i);
|
| - hasher.AddCharacterNoIndex(c);
|
| - string_result->Set(i, c);
|
| - }
|
| - string_result->set_length_field(hasher.GetHashField());
|
| +
|
| return result;
|
| }
|
|
|
| @@ -2600,20 +2564,6 @@
|
| return long_cons_ascii_symbol_map();
|
| }
|
|
|
| - if (map == short_sliced_string_map()) return short_sliced_symbol_map();
|
| - if (map == medium_sliced_string_map()) return medium_sliced_symbol_map();
|
| - if (map == long_sliced_string_map()) return long_sliced_symbol_map();
|
| -
|
| - if (map == short_sliced_ascii_string_map()) {
|
| - return short_sliced_ascii_symbol_map();
|
| - }
|
| - if (map == medium_sliced_ascii_string_map()) {
|
| - return medium_sliced_ascii_symbol_map();
|
| - }
|
| - if (map == long_sliced_ascii_string_map()) {
|
| - return long_sliced_ascii_symbol_map();
|
| - }
|
| -
|
| if (map == short_external_string_map()) {
|
| return short_external_symbol_map();
|
| }
|
|
|