Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/heap.cc

Issue 347002: Derive string size constants... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698