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 1745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1756 share->set_inferred_name(empty_string()); | 1756 share->set_inferred_name(empty_string()); |
1757 share->set_compiler_hints(0); | 1757 share->set_compiler_hints(0); |
1758 share->set_this_property_assignments_count(0); | 1758 share->set_this_property_assignments_count(0); |
1759 share->set_this_property_assignments(undefined_value()); | 1759 share->set_this_property_assignments(undefined_value()); |
1760 return result; | 1760 return result; |
1761 } | 1761 } |
1762 | 1762 |
1763 | 1763 |
1764 Object* Heap::AllocateConsString(String* first, String* second) { | 1764 Object* Heap::AllocateConsString(String* first, String* second) { |
1765 int first_length = first->length(); | 1765 int first_length = first->length(); |
1766 if (first_length == 0) return second; | 1766 if (first_length == 0) { |
| 1767 return second; |
| 1768 } |
1767 | 1769 |
1768 int second_length = second->length(); | 1770 int second_length = second->length(); |
1769 if (second_length == 0) return first; | 1771 if (second_length == 0) { |
| 1772 return first; |
| 1773 } |
1770 | 1774 |
1771 int length = first_length + second_length; | 1775 int length = first_length + second_length; |
1772 bool is_ascii = first->IsAsciiRepresentation() | 1776 bool is_ascii = first->IsAsciiRepresentation() |
1773 && second->IsAsciiRepresentation(); | 1777 && second->IsAsciiRepresentation(); |
1774 | 1778 |
1775 // Make sure that an out of memory exception is thrown if the length | 1779 // Make sure that an out of memory exception is thrown if the length |
1776 // of the new cons string is too large. | 1780 // of the new cons string is too large. |
1777 if (length > String::kMaxLength || length < 0) { | 1781 if (length > String::kMaxLength || length < 0) { |
1778 Top::context()->mark_out_of_memory(); | 1782 Top::context()->mark_out_of_memory(); |
1779 return Failure::OutOfMemoryException(); | 1783 return Failure::OutOfMemoryException(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1822 if (result->IsFailure()) return result; | 1826 if (result->IsFailure()) return result; |
1823 ASSERT(InNewSpace(result)); | 1827 ASSERT(InNewSpace(result)); |
1824 ConsString* cons_string = ConsString::cast(result); | 1828 ConsString* cons_string = ConsString::cast(result); |
1825 cons_string->set_first(first, SKIP_WRITE_BARRIER); | 1829 cons_string->set_first(first, SKIP_WRITE_BARRIER); |
1826 cons_string->set_second(second, SKIP_WRITE_BARRIER); | 1830 cons_string->set_second(second, SKIP_WRITE_BARRIER); |
1827 cons_string->set_length(length); | 1831 cons_string->set_length(length); |
1828 return result; | 1832 return result; |
1829 } | 1833 } |
1830 | 1834 |
1831 | 1835 |
1832 Object* Heap::AllocateSlicedString(String* buffer, | |
1833 int start, | |
1834 int end) { | |
1835 int length = end - start; | |
1836 | |
1837 // If the resulting string is small make a sub string. | |
1838 if (length <= String::kMinNonFlatLength) { | |
1839 return Heap::AllocateSubString(buffer, start, end); | |
1840 } | |
1841 | |
1842 Map* map; | |
1843 if (length <= String::kMaxShortSize) { | |
1844 map = buffer->IsAsciiRepresentation() ? | |
1845 short_sliced_ascii_string_map() : | |
1846 short_sliced_string_map(); | |
1847 } else if (length <= String::kMaxMediumSize) { | |
1848 map = buffer->IsAsciiRepresentation() ? | |
1849 medium_sliced_ascii_string_map() : | |
1850 medium_sliced_string_map(); | |
1851 } else { | |
1852 map = buffer->IsAsciiRepresentation() ? | |
1853 long_sliced_ascii_string_map() : | |
1854 long_sliced_string_map(); | |
1855 } | |
1856 | |
1857 Object* result = Allocate(map, NEW_SPACE); | |
1858 if (result->IsFailure()) return result; | |
1859 | |
1860 SlicedString* sliced_string = SlicedString::cast(result); | |
1861 sliced_string->set_buffer(buffer); | |
1862 sliced_string->set_start(start); | |
1863 sliced_string->set_length(length); | |
1864 | |
1865 return result; | |
1866 } | |
1867 | |
1868 | |
1869 Object* Heap::AllocateSubString(String* buffer, | 1836 Object* Heap::AllocateSubString(String* buffer, |
1870 int start, | 1837 int start, |
1871 int end) { | 1838 int end) { |
1872 int length = end - start; | 1839 int length = end - start; |
1873 | 1840 |
1874 if (length == 1) { | 1841 if (length == 1) { |
1875 return Heap::LookupSingleCharacterStringFromCode( | 1842 return Heap::LookupSingleCharacterStringFromCode( |
1876 buffer->Get(start)); | 1843 buffer->Get(start)); |
1877 } | 1844 } |
1878 | 1845 |
1879 // Make an attempt to flatten the buffer to reduce access time. | 1846 // Make an attempt to flatten the buffer to reduce access time. |
1880 if (!buffer->IsFlat()) { | 1847 if (!buffer->IsFlat()) { |
1881 buffer->TryFlatten(); | 1848 buffer->TryFlatten(); |
1882 } | 1849 } |
1883 | 1850 |
1884 Object* result = buffer->IsAsciiRepresentation() | 1851 Object* result = buffer->IsAsciiRepresentation() |
1885 ? AllocateRawAsciiString(length) | 1852 ? AllocateRawAsciiString(length) |
1886 : AllocateRawTwoByteString(length); | 1853 : AllocateRawTwoByteString(length); |
1887 if (result->IsFailure()) return result; | 1854 if (result->IsFailure()) return result; |
| 1855 String* string_result = String::cast(result); |
1888 | 1856 |
1889 // Copy the characters into the new object. | 1857 // Copy the characters into the new object. |
1890 String* string_result = String::cast(result); | 1858 if (buffer->IsAsciiRepresentation()) { |
1891 StringHasher hasher(length); | 1859 ASSERT(string_result->IsAsciiRepresentation()); |
1892 int i = 0; | 1860 char* dest = SeqAsciiString::cast(string_result)->GetChars(); |
1893 for (; i < length && hasher.is_array_index(); i++) { | 1861 String::WriteToFlat(buffer, dest, start, end); |
1894 uc32 c = buffer->Get(start + i); | 1862 } else { |
1895 hasher.AddCharacter(c); | 1863 ASSERT(string_result->IsTwoByteRepresentation()); |
1896 string_result->Set(i, c); | 1864 uc16* dest = SeqTwoByteString::cast(string_result)->GetChars(); |
| 1865 String::WriteToFlat(buffer, dest, start, end); |
1897 } | 1866 } |
1898 for (; i < length; i++) { | 1867 |
1899 uc32 c = buffer->Get(start + i); | |
1900 hasher.AddCharacterNoIndex(c); | |
1901 string_result->Set(i, c); | |
1902 } | |
1903 string_result->set_length_field(hasher.GetHashField()); | |
1904 return result; | 1868 return result; |
1905 } | 1869 } |
1906 | 1870 |
1907 | 1871 |
1908 Object* Heap::AllocateExternalStringFromAscii( | 1872 Object* Heap::AllocateExternalStringFromAscii( |
1909 ExternalAsciiString::Resource* resource) { | 1873 ExternalAsciiString::Resource* resource) { |
1910 Map* map; | 1874 Map* map; |
1911 int length = resource->length(); | 1875 int length = resource->length(); |
1912 if (length <= String::kMaxShortSize) { | 1876 if (length <= String::kMaxShortSize) { |
1913 map = short_external_ascii_string_map(); | 1877 map = short_external_ascii_string_map(); |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2593 if (map == short_cons_ascii_string_map()) { | 2557 if (map == short_cons_ascii_string_map()) { |
2594 return short_cons_ascii_symbol_map(); | 2558 return short_cons_ascii_symbol_map(); |
2595 } | 2559 } |
2596 if (map == medium_cons_ascii_string_map()) { | 2560 if (map == medium_cons_ascii_string_map()) { |
2597 return medium_cons_ascii_symbol_map(); | 2561 return medium_cons_ascii_symbol_map(); |
2598 } | 2562 } |
2599 if (map == long_cons_ascii_string_map()) { | 2563 if (map == long_cons_ascii_string_map()) { |
2600 return long_cons_ascii_symbol_map(); | 2564 return long_cons_ascii_symbol_map(); |
2601 } | 2565 } |
2602 | 2566 |
2603 if (map == short_sliced_string_map()) return short_sliced_symbol_map(); | |
2604 if (map == medium_sliced_string_map()) return medium_sliced_symbol_map(); | |
2605 if (map == long_sliced_string_map()) return long_sliced_symbol_map(); | |
2606 | |
2607 if (map == short_sliced_ascii_string_map()) { | |
2608 return short_sliced_ascii_symbol_map(); | |
2609 } | |
2610 if (map == medium_sliced_ascii_string_map()) { | |
2611 return medium_sliced_ascii_symbol_map(); | |
2612 } | |
2613 if (map == long_sliced_ascii_string_map()) { | |
2614 return long_sliced_ascii_symbol_map(); | |
2615 } | |
2616 | |
2617 if (map == short_external_string_map()) { | 2567 if (map == short_external_string_map()) { |
2618 return short_external_symbol_map(); | 2568 return short_external_symbol_map(); |
2619 } | 2569 } |
2620 if (map == medium_external_string_map()) { | 2570 if (map == medium_external_string_map()) { |
2621 return medium_external_symbol_map(); | 2571 return medium_external_symbol_map(); |
2622 } | 2572 } |
2623 if (map == long_external_string_map()) { | 2573 if (map == long_external_string_map()) { |
2624 return long_external_symbol_map(); | 2574 return long_external_symbol_map(); |
2625 } | 2575 } |
2626 | 2576 |
(...skipping 1408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4035 for (int i = 0; i < kNumberOfCaches; i++) { | 3985 for (int i = 0; i < kNumberOfCaches; i++) { |
4036 if (caches_[i] != NULL) { | 3986 if (caches_[i] != NULL) { |
4037 delete caches_[i]; | 3987 delete caches_[i]; |
4038 caches_[i] = NULL; | 3988 caches_[i] = NULL; |
4039 } | 3989 } |
4040 } | 3990 } |
4041 } | 3991 } |
4042 | 3992 |
4043 | 3993 |
4044 } } // namespace v8::internal | 3994 } } // namespace v8::internal |
OLD | NEW |