OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
671 cs->set_second(Heap::empty_string()); | 671 cs->set_second(Heap::empty_string()); |
672 return result; | 672 return result; |
673 } | 673 } |
674 default: | 674 default: |
675 return this; | 675 return this; |
676 } | 676 } |
677 } | 677 } |
678 | 678 |
679 | 679 |
680 bool String::MakeExternal(v8::String::ExternalStringResource* resource) { | 680 bool String::MakeExternal(v8::String::ExternalStringResource* resource) { |
| 681 // Externalizing twice leaks the external resouce, so it's |
| 682 // prohibited by the API. |
| 683 ASSERT(!this->IsExternalString()); |
681 #ifdef DEBUG | 684 #ifdef DEBUG |
682 if (FLAG_enable_slow_asserts) { | 685 if (FLAG_enable_slow_asserts) { |
683 // Assert that the resource and the string are equivalent. | 686 // Assert that the resource and the string are equivalent. |
684 ASSERT(static_cast<size_t>(this->length()) == resource->length()); | 687 ASSERT(static_cast<size_t>(this->length()) == resource->length()); |
685 ScopedVector<uc16> smart_chars(this->length()); | 688 ScopedVector<uc16> smart_chars(this->length()); |
686 String::WriteToFlat(this, smart_chars.start(), 0, this->length()); | 689 String::WriteToFlat(this, smart_chars.start(), 0, this->length()); |
687 ASSERT(memcmp(smart_chars.start(), | 690 ASSERT(memcmp(smart_chars.start(), |
688 resource->data(), | 691 resource->data(), |
689 resource->length() * sizeof(smart_chars[0])) == 0); | 692 resource->length() * sizeof(smart_chars[0])) == 0); |
690 } | 693 } |
691 #endif // DEBUG | 694 #endif // DEBUG |
692 | 695 |
693 int size = this->Size(); // Byte size of the original string. | 696 int size = this->Size(); // Byte size of the original string. |
694 if (size < ExternalString::kSize) { | 697 if (size < ExternalString::kSize) { |
695 // The string is too small to fit an external String in its place. This can | 698 // The string is too small to fit an external String in its place. This can |
696 // only happen for zero length strings. | 699 // only happen for zero length strings. |
697 return false; | 700 return false; |
698 } | 701 } |
699 ASSERT(size >= ExternalString::kSize); | 702 ASSERT(size >= ExternalString::kSize); |
| 703 bool is_ascii = this->IsAsciiRepresentation(); |
700 bool is_symbol = this->IsSymbol(); | 704 bool is_symbol = this->IsSymbol(); |
701 int length = this->length(); | 705 int length = this->length(); |
702 int hash_field = this->hash_field(); | 706 int hash_field = this->hash_field(); |
703 | 707 |
704 // Morph the object to an external string by adjusting the map and | 708 // Morph the object to an external string by adjusting the map and |
705 // reinitializing the fields. | 709 // reinitializing the fields. |
706 this->set_map(Heap::external_string_map()); | 710 this->set_map(is_ascii ? |
| 711 Heap::external_string_with_ascii_data_map() : |
| 712 Heap::external_string_map()); |
707 ExternalTwoByteString* self = ExternalTwoByteString::cast(this); | 713 ExternalTwoByteString* self = ExternalTwoByteString::cast(this); |
708 self->set_length(length); | 714 self->set_length(length); |
709 self->set_hash_field(hash_field); | 715 self->set_hash_field(hash_field); |
710 self->set_resource(resource); | 716 self->set_resource(resource); |
711 // Additionally make the object into an external symbol if the original string | 717 // Additionally make the object into an external symbol if the original string |
712 // was a symbol to start with. | 718 // was a symbol to start with. |
713 if (is_symbol) { | 719 if (is_symbol) { |
714 self->Hash(); // Force regeneration of the hash value. | 720 self->Hash(); // Force regeneration of the hash value. |
715 // Now morph this external string into a external symbol. | 721 // Now morph this external string into a external symbol. |
716 this->set_map(Heap::external_symbol_map()); | 722 this->set_map(is_ascii ? |
| 723 Heap::external_symbol_with_ascii_data_map() : |
| 724 Heap::external_symbol_map()); |
717 } | 725 } |
718 | 726 |
719 // Fill the remainder of the string with dead wood. | 727 // Fill the remainder of the string with dead wood. |
720 int new_size = this->Size(); // Byte size of the external String object. | 728 int new_size = this->Size(); // Byte size of the external String object. |
721 Heap::CreateFillerObjectAt(this->address() + new_size, size - new_size); | 729 Heap::CreateFillerObjectAt(this->address() + new_size, size - new_size); |
722 return true; | 730 return true; |
723 } | 731 } |
724 | 732 |
725 | 733 |
726 bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) { | 734 bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) { |
(...skipping 7995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8722 if (break_point_objects()->IsUndefined()) return 0; | 8730 if (break_point_objects()->IsUndefined()) return 0; |
8723 // Single beak point. | 8731 // Single beak point. |
8724 if (!break_point_objects()->IsFixedArray()) return 1; | 8732 if (!break_point_objects()->IsFixedArray()) return 1; |
8725 // Multiple break points. | 8733 // Multiple break points. |
8726 return FixedArray::cast(break_point_objects())->length(); | 8734 return FixedArray::cast(break_point_objects())->length(); |
8727 } | 8735 } |
8728 #endif | 8736 #endif |
8729 | 8737 |
8730 | 8738 |
8731 } } // namespace v8::internal | 8739 } } // namespace v8::internal |
OLD | NEW |