| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 2ebeb655f28d210a2a6905147457461bf47a51c6..f3fe4cff921b187d3bd588110e28bd190df19fad 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -952,33 +952,32 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) {
|
| #endif // DEBUG
|
| Heap* heap = GetHeap();
|
| int size = this->Size(); // Byte size of the original string.
|
| - if (size < ExternalString::kSize) {
|
| + if (size < ExternalString::kShortSize) {
|
| return false;
|
| }
|
| - ASSERT(size >= ExternalString::kSize);
|
| bool is_ascii = this->IsAsciiRepresentation();
|
| bool is_symbol = this->IsSymbol();
|
| - int length = this->length();
|
| - int hash_field = this->hash_field();
|
|
|
| // Morph the object to an external string by adjusting the map and
|
| // reinitializing the fields.
|
| - this->set_map(is_ascii ?
|
| - heap->external_string_with_ascii_data_map() :
|
| - heap->external_string_map());
|
| + if (size >= ExternalString::kSize) {
|
| + this->set_map(
|
| + is_symbol
|
| + ? (is_ascii ? heap->external_symbol_with_ascii_data_map()
|
| + : heap->external_symbol_map())
|
| + : (is_ascii ? heap->external_string_with_ascii_data_map()
|
| + : heap->external_string_map()));
|
| + } else {
|
| + this->set_map(
|
| + is_symbol
|
| + ? (is_ascii ? heap->short_external_symbol_with_ascii_data_map()
|
| + : heap->short_external_symbol_map())
|
| + : (is_ascii ? heap->short_external_string_with_ascii_data_map()
|
| + : heap->short_external_string_map()));
|
| + }
|
| ExternalTwoByteString* self = ExternalTwoByteString::cast(this);
|
| - self->set_length(length);
|
| - self->set_hash_field(hash_field);
|
| self->set_resource(resource);
|
| - // Additionally make the object into an external symbol if the original string
|
| - // was a symbol to start with.
|
| - if (is_symbol) {
|
| - self->Hash(); // Force regeneration of the hash value.
|
| - // Now morph this external string into a external symbol.
|
| - this->set_map(is_ascii ?
|
| - heap->external_symbol_with_ascii_data_map() :
|
| - heap->external_symbol_map());
|
| - }
|
| + if (is_symbol) self->Hash(); // Force regeneration of the hash value.
|
|
|
| // Fill the remainder of the string with dead wood.
|
| int new_size = this->Size(); // Byte size of the external String object.
|
| @@ -1004,28 +1003,23 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) {
|
| #endif // DEBUG
|
| Heap* heap = GetHeap();
|
| int size = this->Size(); // Byte size of the original string.
|
| - if (size < ExternalString::kSize) {
|
| + if (size < ExternalString::kShortSize) {
|
| return false;
|
| }
|
| - ASSERT(size >= ExternalString::kSize);
|
| bool is_symbol = this->IsSymbol();
|
| - int length = this->length();
|
| - int hash_field = this->hash_field();
|
|
|
| // Morph the object to an external string by adjusting the map and
|
| - // reinitializing the fields.
|
| - this->set_map(heap->external_ascii_string_map());
|
| + // reinitializing the fields. Use short version if space is limited.
|
| + if (size >= ExternalString::kSize) {
|
| + this->set_map(is_symbol ? heap->external_ascii_symbol_map()
|
| + : heap->external_ascii_string_map());
|
| + } else {
|
| + this->set_map(is_symbol ? heap->short_external_ascii_symbol_map()
|
| + : heap->short_external_ascii_string_map());
|
| + }
|
| ExternalAsciiString* self = ExternalAsciiString::cast(this);
|
| - self->set_length(length);
|
| - self->set_hash_field(hash_field);
|
| self->set_resource(resource);
|
| - // Additionally make the object into an external symbol if the original string
|
| - // was a symbol to start with.
|
| - if (is_symbol) {
|
| - self->Hash(); // Force regeneration of the hash value.
|
| - // Now morph this external string into a external symbol.
|
| - this->set_map(heap->external_ascii_symbol_map());
|
| - }
|
| + if (is_symbol) self->Hash(); // Force regeneration of the hash value.
|
|
|
| // Fill the remainder of the string with dead wood.
|
| int new_size = this->Size(); // Byte size of the external String object.
|
| @@ -1033,7 +1027,6 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) {
|
| if (Marking::IsBlack(Marking::MarkBitFrom(this))) {
|
| MemoryChunk::IncrementLiveBytes(this->address(), new_size - size);
|
| }
|
| -
|
| return true;
|
| }
|
|
|
|
|