| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 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 1792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1803 if (result->IsFailure()) return result; | 1803 if (result->IsFailure()) return result; |
| 1804 // Copy the characters into the new object. | 1804 // Copy the characters into the new object. |
| 1805 uc16* dest = SeqTwoByteString::cast(result)->GetChars(); | 1805 uc16* dest = SeqTwoByteString::cast(result)->GetChars(); |
| 1806 String::WriteToFlat(first, dest, 0, first_length); | 1806 String::WriteToFlat(first, dest, 0, first_length); |
| 1807 String::WriteToFlat(second, dest + first_length, 0, second_length); | 1807 String::WriteToFlat(second, dest + first_length, 0, second_length); |
| 1808 return result; | 1808 return result; |
| 1809 } | 1809 } |
| 1810 } | 1810 } |
| 1811 | 1811 |
| 1812 Map* map; | 1812 Map* map; |
| 1813 if (length <= String::kMaxShortStringSize) { | 1813 if (length <= String::kMaxShortSize) { |
| 1814 map = is_ascii ? short_cons_ascii_string_map() | 1814 map = is_ascii ? short_cons_ascii_string_map() |
| 1815 : short_cons_string_map(); | 1815 : short_cons_string_map(); |
| 1816 } else if (length <= String::kMaxMediumStringSize) { | 1816 } else if (length <= String::kMaxMediumSize) { |
| 1817 map = is_ascii ? medium_cons_ascii_string_map() | 1817 map = is_ascii ? medium_cons_ascii_string_map() |
| 1818 : medium_cons_string_map(); | 1818 : medium_cons_string_map(); |
| 1819 } else { | 1819 } else { |
| 1820 map = is_ascii ? long_cons_ascii_string_map() | 1820 map = is_ascii ? long_cons_ascii_string_map() |
| 1821 : long_cons_string_map(); | 1821 : long_cons_string_map(); |
| 1822 } | 1822 } |
| 1823 | 1823 |
| 1824 Object* result = Allocate(map, NEW_SPACE); | 1824 Object* result = Allocate(map, NEW_SPACE); |
| 1825 if (result->IsFailure()) return result; | 1825 if (result->IsFailure()) return result; |
| 1826 ASSERT(InNewSpace(result)); | 1826 ASSERT(InNewSpace(result)); |
| 1827 ConsString* cons_string = ConsString::cast(result); | 1827 ConsString* cons_string = ConsString::cast(result); |
| 1828 cons_string->set_first(first, SKIP_WRITE_BARRIER); | 1828 cons_string->set_first(first, SKIP_WRITE_BARRIER); |
| 1829 cons_string->set_second(second, SKIP_WRITE_BARRIER); | 1829 cons_string->set_second(second, SKIP_WRITE_BARRIER); |
| 1830 cons_string->set_length(length); | 1830 cons_string->set_length(length); |
| 1831 return result; | 1831 return result; |
| 1832 } | 1832 } |
| 1833 | 1833 |
| 1834 | 1834 |
| 1835 Object* Heap::AllocateSlicedString(String* buffer, | 1835 Object* Heap::AllocateSlicedString(String* buffer, |
| 1836 int start, | 1836 int start, |
| 1837 int end) { | 1837 int end) { |
| 1838 int length = end - start; | 1838 int length = end - start; |
| 1839 | 1839 |
| 1840 // If the resulting string is small make a sub string. | 1840 // If the resulting string is small make a sub string. |
| 1841 if (length <= String::kMinNonFlatLength) { | 1841 if (length <= String::kMinNonFlatLength) { |
| 1842 return Heap::AllocateSubString(buffer, start, end); | 1842 return Heap::AllocateSubString(buffer, start, end); |
| 1843 } | 1843 } |
| 1844 | 1844 |
| 1845 Map* map; | 1845 Map* map; |
| 1846 if (length <= String::kMaxShortStringSize) { | 1846 if (length <= String::kMaxShortSize) { |
| 1847 map = buffer->IsAsciiRepresentation() ? | 1847 map = buffer->IsAsciiRepresentation() ? |
| 1848 short_sliced_ascii_string_map() : | 1848 short_sliced_ascii_string_map() : |
| 1849 short_sliced_string_map(); | 1849 short_sliced_string_map(); |
| 1850 } else if (length <= String::kMaxMediumStringSize) { | 1850 } else if (length <= String::kMaxMediumSize) { |
| 1851 map = buffer->IsAsciiRepresentation() ? | 1851 map = buffer->IsAsciiRepresentation() ? |
| 1852 medium_sliced_ascii_string_map() : | 1852 medium_sliced_ascii_string_map() : |
| 1853 medium_sliced_string_map(); | 1853 medium_sliced_string_map(); |
| 1854 } else { | 1854 } else { |
| 1855 map = buffer->IsAsciiRepresentation() ? | 1855 map = buffer->IsAsciiRepresentation() ? |
| 1856 long_sliced_ascii_string_map() : | 1856 long_sliced_ascii_string_map() : |
| 1857 long_sliced_string_map(); | 1857 long_sliced_string_map(); |
| 1858 } | 1858 } |
| 1859 | 1859 |
| 1860 Object* result = Allocate(map, NEW_SPACE); | 1860 Object* result = Allocate(map, NEW_SPACE); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1905 } | 1905 } |
| 1906 string_result->set_length_field(hasher.GetHashField()); | 1906 string_result->set_length_field(hasher.GetHashField()); |
| 1907 return result; | 1907 return result; |
| 1908 } | 1908 } |
| 1909 | 1909 |
| 1910 | 1910 |
| 1911 Object* Heap::AllocateExternalStringFromAscii( | 1911 Object* Heap::AllocateExternalStringFromAscii( |
| 1912 ExternalAsciiString::Resource* resource) { | 1912 ExternalAsciiString::Resource* resource) { |
| 1913 Map* map; | 1913 Map* map; |
| 1914 int length = resource->length(); | 1914 int length = resource->length(); |
| 1915 if (length <= String::kMaxShortStringSize) { | 1915 if (length <= String::kMaxShortSize) { |
| 1916 map = short_external_ascii_string_map(); | 1916 map = short_external_ascii_string_map(); |
| 1917 } else if (length <= String::kMaxMediumStringSize) { | 1917 } else if (length <= String::kMaxMediumSize) { |
| 1918 map = medium_external_ascii_string_map(); | 1918 map = medium_external_ascii_string_map(); |
| 1919 } else { | 1919 } else { |
| 1920 map = long_external_ascii_string_map(); | 1920 map = long_external_ascii_string_map(); |
| 1921 } | 1921 } |
| 1922 | 1922 |
| 1923 Object* result = Allocate(map, NEW_SPACE); | 1923 Object* result = Allocate(map, NEW_SPACE); |
| 1924 if (result->IsFailure()) return result; | 1924 if (result->IsFailure()) return result; |
| 1925 | 1925 |
| 1926 ExternalAsciiString* external_string = ExternalAsciiString::cast(result); | 1926 ExternalAsciiString* external_string = ExternalAsciiString::cast(result); |
| 1927 external_string->set_length(length); | 1927 external_string->set_length(length); |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2652 while (buffer->has_more() && is_ascii) { | 2652 while (buffer->has_more() && is_ascii) { |
| 2653 if (buffer->GetNext() > unibrow::Utf8::kMaxOneByteChar) is_ascii = false; | 2653 if (buffer->GetNext() > unibrow::Utf8::kMaxOneByteChar) is_ascii = false; |
| 2654 } | 2654 } |
| 2655 buffer->Rewind(); | 2655 buffer->Rewind(); |
| 2656 | 2656 |
| 2657 // Compute map and object size. | 2657 // Compute map and object size. |
| 2658 int size; | 2658 int size; |
| 2659 Map* map; | 2659 Map* map; |
| 2660 | 2660 |
| 2661 if (is_ascii) { | 2661 if (is_ascii) { |
| 2662 if (chars <= String::kMaxShortStringSize) { | 2662 if (chars <= String::kMaxShortSize) { |
| 2663 map = short_ascii_symbol_map(); | 2663 map = short_ascii_symbol_map(); |
| 2664 } else if (chars <= String::kMaxMediumStringSize) { | 2664 } else if (chars <= String::kMaxMediumSize) { |
| 2665 map = medium_ascii_symbol_map(); | 2665 map = medium_ascii_symbol_map(); |
| 2666 } else { | 2666 } else { |
| 2667 map = long_ascii_symbol_map(); | 2667 map = long_ascii_symbol_map(); |
| 2668 } | 2668 } |
| 2669 size = SeqAsciiString::SizeFor(chars); | 2669 size = SeqAsciiString::SizeFor(chars); |
| 2670 } else { | 2670 } else { |
| 2671 if (chars <= String::kMaxShortStringSize) { | 2671 if (chars <= String::kMaxShortSize) { |
| 2672 map = short_symbol_map(); | 2672 map = short_symbol_map(); |
| 2673 } else if (chars <= String::kMaxMediumStringSize) { | 2673 } else if (chars <= String::kMaxMediumSize) { |
| 2674 map = medium_symbol_map(); | 2674 map = medium_symbol_map(); |
| 2675 } else { | 2675 } else { |
| 2676 map = long_symbol_map(); | 2676 map = long_symbol_map(); |
| 2677 } | 2677 } |
| 2678 size = SeqTwoByteString::SizeFor(chars); | 2678 size = SeqTwoByteString::SizeFor(chars); |
| 2679 } | 2679 } |
| 2680 | 2680 |
| 2681 // Allocate string. | 2681 // Allocate string. |
| 2682 AllocationSpace space = | 2682 AllocationSpace space = |
| 2683 (size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : OLD_DATA_SPACE; | 2683 (size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : OLD_DATA_SPACE; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2713 ? new_space_.AllocateRaw(size) | 2713 ? new_space_.AllocateRaw(size) |
| 2714 : lo_space_->AllocateRaw(size); | 2714 : lo_space_->AllocateRaw(size); |
| 2715 } else { | 2715 } else { |
| 2716 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2716 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
| 2717 result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2717 result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| 2718 } | 2718 } |
| 2719 if (result->IsFailure()) return result; | 2719 if (result->IsFailure()) return result; |
| 2720 | 2720 |
| 2721 // Determine the map based on the string's length. | 2721 // Determine the map based on the string's length. |
| 2722 Map* map; | 2722 Map* map; |
| 2723 if (length <= String::kMaxShortStringSize) { | 2723 if (length <= String::kMaxShortSize) { |
| 2724 map = short_ascii_string_map(); | 2724 map = short_ascii_string_map(); |
| 2725 } else if (length <= String::kMaxMediumStringSize) { | 2725 } else if (length <= String::kMaxMediumSize) { |
| 2726 map = medium_ascii_string_map(); | 2726 map = medium_ascii_string_map(); |
| 2727 } else { | 2727 } else { |
| 2728 map = long_ascii_string_map(); | 2728 map = long_ascii_string_map(); |
| 2729 } | 2729 } |
| 2730 | 2730 |
| 2731 // Partially initialize the object. | 2731 // Partially initialize the object. |
| 2732 HeapObject::cast(result)->set_map(map); | 2732 HeapObject::cast(result)->set_map(map); |
| 2733 String::cast(result)->set_length(length); | 2733 String::cast(result)->set_length(length); |
| 2734 ASSERT_EQ(size, HeapObject::cast(result)->Size()); | 2734 ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
| 2735 return result; | 2735 return result; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2750 ? new_space_.AllocateRaw(size) | 2750 ? new_space_.AllocateRaw(size) |
| 2751 : lo_space_->AllocateRaw(size); | 2751 : lo_space_->AllocateRaw(size); |
| 2752 } else { | 2752 } else { |
| 2753 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2753 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
| 2754 result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2754 result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| 2755 } | 2755 } |
| 2756 if (result->IsFailure()) return result; | 2756 if (result->IsFailure()) return result; |
| 2757 | 2757 |
| 2758 // Determine the map based on the string's length. | 2758 // Determine the map based on the string's length. |
| 2759 Map* map; | 2759 Map* map; |
| 2760 if (length <= String::kMaxShortStringSize) { | 2760 if (length <= String::kMaxShortSize) { |
| 2761 map = short_string_map(); | 2761 map = short_string_map(); |
| 2762 } else if (length <= String::kMaxMediumStringSize) { | 2762 } else if (length <= String::kMaxMediumSize) { |
| 2763 map = medium_string_map(); | 2763 map = medium_string_map(); |
| 2764 } else { | 2764 } else { |
| 2765 map = long_string_map(); | 2765 map = long_string_map(); |
| 2766 } | 2766 } |
| 2767 | 2767 |
| 2768 // Partially initialize the object. | 2768 // Partially initialize the object. |
| 2769 HeapObject::cast(result)->set_map(map); | 2769 HeapObject::cast(result)->set_map(map); |
| 2770 String::cast(result)->set_length(length); | 2770 String::cast(result)->set_length(length); |
| 2771 ASSERT_EQ(size, HeapObject::cast(result)->Size()); | 2771 ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
| 2772 return result; | 2772 return result; |
| (...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4030 for (int i = 0; i < kNumberOfCaches; i++) { | 4030 for (int i = 0; i < kNumberOfCaches; i++) { |
| 4031 if (caches_[i] != NULL) { | 4031 if (caches_[i] != NULL) { |
| 4032 delete caches_[i]; | 4032 delete caches_[i]; |
| 4033 caches_[i] = NULL; | 4033 caches_[i] = NULL; |
| 4034 } | 4034 } |
| 4035 } | 4035 } |
| 4036 } | 4036 } |
| 4037 | 4037 |
| 4038 | 4038 |
| 4039 } } // namespace v8::internal | 4039 } } // namespace v8::internal |
| OLD | NEW |