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 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1347 return true; | 1347 return true; |
1348 } | 1348 } |
1349 | 1349 |
1350 | 1350 |
1351 Object* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { | 1351 Object* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { |
1352 // Statically ensure that it is safe to allocate heap numbers in paged | 1352 // Statically ensure that it is safe to allocate heap numbers in paged |
1353 // spaces. | 1353 // spaces. |
1354 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); | 1354 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); |
1355 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 1355 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
1356 | 1356 |
1357 // New space can't cope with forced allocation. | |
1358 if (always_allocate()) space = OLD_DATA_SPACE; | |
1359 | |
1360 Object* result = AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); | 1357 Object* result = AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); |
1361 if (result->IsFailure()) return result; | 1358 if (result->IsFailure()) return result; |
1362 | 1359 |
1363 HeapObject::cast(result)->set_map(heap_number_map()); | 1360 HeapObject::cast(result)->set_map(heap_number_map()); |
1364 HeapNumber::cast(result)->set_value(value); | 1361 HeapNumber::cast(result)->set_value(value); |
1365 return result; | 1362 return result; |
1366 } | 1363 } |
1367 | 1364 |
1368 | 1365 |
1369 Object* Heap::AllocateHeapNumber(double value) { | 1366 Object* Heap::AllocateHeapNumber(double value) { |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1755 return SmiOrNumberFromDouble(value, | 1752 return SmiOrNumberFromDouble(value, |
1756 false /* use preallocated NaN, -0.0 */, | 1753 false /* use preallocated NaN, -0.0 */, |
1757 pretenure); | 1754 pretenure); |
1758 } | 1755 } |
1759 | 1756 |
1760 | 1757 |
1761 Object* Heap::AllocateProxy(Address proxy, PretenureFlag pretenure) { | 1758 Object* Heap::AllocateProxy(Address proxy, PretenureFlag pretenure) { |
1762 // Statically ensure that it is safe to allocate proxies in paged spaces. | 1759 // Statically ensure that it is safe to allocate proxies in paged spaces. |
1763 STATIC_ASSERT(Proxy::kSize <= Page::kMaxHeapObjectSize); | 1760 STATIC_ASSERT(Proxy::kSize <= Page::kMaxHeapObjectSize); |
1764 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 1761 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
1765 if (always_allocate()) space = OLD_DATA_SPACE; | |
1766 Object* result = Allocate(proxy_map(), space); | 1762 Object* result = Allocate(proxy_map(), space); |
1767 if (result->IsFailure()) return result; | 1763 if (result->IsFailure()) return result; |
1768 | 1764 |
1769 Proxy::cast(result)->set_proxy(proxy); | 1765 Proxy::cast(result)->set_proxy(proxy); |
1770 return result; | 1766 return result; |
1771 } | 1767 } |
1772 | 1768 |
1773 | 1769 |
1774 Object* Heap::AllocateSharedFunctionInfo(Object* name) { | 1770 Object* Heap::AllocateSharedFunctionInfo(Object* name) { |
1775 Object* result = Allocate(shared_function_info_map(), OLD_POINTER_SPACE); | 1771 Object* result = Allocate(shared_function_info_map(), OLD_POINTER_SPACE); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1895 // Copy the characters into the new object. | 1891 // Copy the characters into the new object. |
1896 uc16* dest = SeqTwoByteString::cast(result)->GetChars(); | 1892 uc16* dest = SeqTwoByteString::cast(result)->GetChars(); |
1897 String::WriteToFlat(first, dest, 0, first_length); | 1893 String::WriteToFlat(first, dest, 0, first_length); |
1898 String::WriteToFlat(second, dest + first_length, 0, second_length); | 1894 String::WriteToFlat(second, dest + first_length, 0, second_length); |
1899 return result; | 1895 return result; |
1900 } | 1896 } |
1901 } | 1897 } |
1902 | 1898 |
1903 Map* map = is_ascii ? cons_ascii_string_map() : cons_string_map(); | 1899 Map* map = is_ascii ? cons_ascii_string_map() : cons_string_map(); |
1904 | 1900 |
1905 Object* result = Allocate(map, | 1901 Object* result = Allocate(map, NEW_SPACE); |
1906 always_allocate() ? OLD_POINTER_SPACE : NEW_SPACE); | |
1907 if (result->IsFailure()) return result; | 1902 if (result->IsFailure()) return result; |
1908 ConsString* cons_string = ConsString::cast(result); | 1903 ConsString* cons_string = ConsString::cast(result); |
1909 WriteBarrierMode mode = cons_string->GetWriteBarrierMode(); | 1904 WriteBarrierMode mode = cons_string->GetWriteBarrierMode(); |
1910 cons_string->set_length(length); | 1905 cons_string->set_length(length); |
1911 cons_string->set_hash_field(String::kEmptyHashField); | 1906 cons_string->set_hash_field(String::kEmptyHashField); |
1912 cons_string->set_first(first, mode); | 1907 cons_string->set_first(first, mode); |
1913 cons_string->set_second(second, mode); | 1908 cons_string->set_second(second, mode); |
1914 return result; | 1909 return result; |
1915 } | 1910 } |
1916 | 1911 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1960 | 1955 |
1961 Object* Heap::AllocateExternalStringFromAscii( | 1956 Object* Heap::AllocateExternalStringFromAscii( |
1962 ExternalAsciiString::Resource* resource) { | 1957 ExternalAsciiString::Resource* resource) { |
1963 size_t length = resource->length(); | 1958 size_t length = resource->length(); |
1964 if (length > static_cast<size_t>(String::kMaxLength)) { | 1959 if (length > static_cast<size_t>(String::kMaxLength)) { |
1965 Top::context()->mark_out_of_memory(); | 1960 Top::context()->mark_out_of_memory(); |
1966 return Failure::OutOfMemoryException(); | 1961 return Failure::OutOfMemoryException(); |
1967 } | 1962 } |
1968 | 1963 |
1969 Map* map = external_ascii_string_map(); | 1964 Map* map = external_ascii_string_map(); |
1970 Object* result = Allocate(map, | 1965 Object* result = Allocate(map, NEW_SPACE); |
1971 always_allocate() ? OLD_DATA_SPACE : NEW_SPACE); | |
1972 if (result->IsFailure()) return result; | 1966 if (result->IsFailure()) return result; |
1973 | 1967 |
1974 ExternalAsciiString* external_string = ExternalAsciiString::cast(result); | 1968 ExternalAsciiString* external_string = ExternalAsciiString::cast(result); |
1975 external_string->set_length(static_cast<int>(length)); | 1969 external_string->set_length(static_cast<int>(length)); |
1976 external_string->set_hash_field(String::kEmptyHashField); | 1970 external_string->set_hash_field(String::kEmptyHashField); |
1977 external_string->set_resource(resource); | 1971 external_string->set_resource(resource); |
1978 | 1972 |
1979 return result; | 1973 return result; |
1980 } | 1974 } |
1981 | 1975 |
1982 | 1976 |
1983 Object* Heap::AllocateExternalStringFromTwoByte( | 1977 Object* Heap::AllocateExternalStringFromTwoByte( |
1984 ExternalTwoByteString::Resource* resource) { | 1978 ExternalTwoByteString::Resource* resource) { |
1985 size_t length = resource->length(); | 1979 size_t length = resource->length(); |
1986 if (length > static_cast<size_t>(String::kMaxLength)) { | 1980 if (length > static_cast<size_t>(String::kMaxLength)) { |
1987 Top::context()->mark_out_of_memory(); | 1981 Top::context()->mark_out_of_memory(); |
1988 return Failure::OutOfMemoryException(); | 1982 return Failure::OutOfMemoryException(); |
1989 } | 1983 } |
1990 | 1984 |
1991 Map* map = Heap::external_string_map(); | 1985 Map* map = Heap::external_string_map(); |
1992 Object* result = Allocate(map, | 1986 Object* result = Allocate(map, NEW_SPACE); |
1993 always_allocate() ? OLD_DATA_SPACE : NEW_SPACE); | |
1994 if (result->IsFailure()) return result; | 1987 if (result->IsFailure()) return result; |
1995 | 1988 |
1996 ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); | 1989 ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); |
1997 external_string->set_length(static_cast<int>(length)); | 1990 external_string->set_length(static_cast<int>(length)); |
1998 external_string->set_hash_field(String::kEmptyHashField); | 1991 external_string->set_hash_field(String::kEmptyHashField); |
1999 external_string->set_resource(resource); | 1992 external_string->set_resource(resource); |
2000 | 1993 |
2001 return result; | 1994 return result; |
2002 } | 1995 } |
2003 | 1996 |
(...skipping 18 matching lines...) Expand all Loading... |
2022 answer->Set(0, code); | 2015 answer->Set(0, code); |
2023 return answer; | 2016 return answer; |
2024 } | 2017 } |
2025 | 2018 |
2026 | 2019 |
2027 Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { | 2020 Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
2028 if (pretenure == NOT_TENURED) { | 2021 if (pretenure == NOT_TENURED) { |
2029 return AllocateByteArray(length); | 2022 return AllocateByteArray(length); |
2030 } | 2023 } |
2031 int size = ByteArray::SizeFor(length); | 2024 int size = ByteArray::SizeFor(length); |
2032 AllocationSpace space = | 2025 Object* result = (size <= MaxObjectSizeInPagedSpace()) |
2033 size > MaxObjectSizeInPagedSpace() ? LO_SPACE : OLD_DATA_SPACE; | 2026 ? old_data_space_->AllocateRaw(size) |
2034 | 2027 : lo_space_->AllocateRaw(size); |
2035 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); | |
2036 | |
2037 if (result->IsFailure()) return result; | 2028 if (result->IsFailure()) return result; |
2038 | 2029 |
2039 reinterpret_cast<Array*>(result)->set_map(byte_array_map()); | 2030 reinterpret_cast<Array*>(result)->set_map(byte_array_map()); |
2040 reinterpret_cast<Array*>(result)->set_length(length); | 2031 reinterpret_cast<Array*>(result)->set_length(length); |
2041 return result; | 2032 return result; |
2042 } | 2033 } |
2043 | 2034 |
2044 | 2035 |
2045 Object* Heap::AllocateByteArray(int length) { | 2036 Object* Heap::AllocateByteArray(int length) { |
2046 int size = ByteArray::SizeFor(length); | 2037 int size = ByteArray::SizeFor(length); |
2047 AllocationSpace space = | 2038 AllocationSpace space = |
2048 size > MaxObjectSizeInPagedSpace() ? LO_SPACE : NEW_SPACE; | 2039 (size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : NEW_SPACE; |
2049 | |
2050 // New space can't cope with forced allocation. | |
2051 if (always_allocate()) space = LO_SPACE; | |
2052 | |
2053 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2040 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); |
2054 | |
2055 if (result->IsFailure()) return result; | 2041 if (result->IsFailure()) return result; |
2056 | 2042 |
2057 reinterpret_cast<Array*>(result)->set_map(byte_array_map()); | 2043 reinterpret_cast<Array*>(result)->set_map(byte_array_map()); |
2058 reinterpret_cast<Array*>(result)->set_length(length); | 2044 reinterpret_cast<Array*>(result)->set_length(length); |
2059 return result; | 2045 return result; |
2060 } | 2046 } |
2061 | 2047 |
2062 | 2048 |
2063 void Heap::CreateFillerObjectAt(Address addr, int size) { | 2049 void Heap::CreateFillerObjectAt(Address addr, int size) { |
2064 if (size == 0) return; | 2050 if (size == 0) return; |
2065 HeapObject* filler = HeapObject::FromAddress(addr); | 2051 HeapObject* filler = HeapObject::FromAddress(addr); |
2066 if (size == kPointerSize) { | 2052 if (size == kPointerSize) { |
2067 filler->set_map(Heap::one_pointer_filler_map()); | 2053 filler->set_map(Heap::one_pointer_filler_map()); |
2068 } else { | 2054 } else { |
2069 filler->set_map(Heap::byte_array_map()); | 2055 filler->set_map(Heap::byte_array_map()); |
2070 ByteArray::cast(filler)->set_length(ByteArray::LengthFor(size)); | 2056 ByteArray::cast(filler)->set_length(ByteArray::LengthFor(size)); |
2071 } | 2057 } |
2072 } | 2058 } |
2073 | 2059 |
2074 | 2060 |
2075 Object* Heap::AllocatePixelArray(int length, | 2061 Object* Heap::AllocatePixelArray(int length, |
2076 uint8_t* external_pointer, | 2062 uint8_t* external_pointer, |
2077 PretenureFlag pretenure) { | 2063 PretenureFlag pretenure) { |
2078 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2064 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
2079 | |
2080 // New space can't cope with forced allocation. | |
2081 if (always_allocate()) space = OLD_DATA_SPACE; | |
2082 | |
2083 Object* result = AllocateRaw(PixelArray::kAlignedSize, space, OLD_DATA_SPACE); | 2065 Object* result = AllocateRaw(PixelArray::kAlignedSize, space, OLD_DATA_SPACE); |
2084 | |
2085 if (result->IsFailure()) return result; | 2066 if (result->IsFailure()) return result; |
2086 | 2067 |
2087 reinterpret_cast<PixelArray*>(result)->set_map(pixel_array_map()); | 2068 reinterpret_cast<PixelArray*>(result)->set_map(pixel_array_map()); |
2088 reinterpret_cast<PixelArray*>(result)->set_length(length); | 2069 reinterpret_cast<PixelArray*>(result)->set_length(length); |
2089 reinterpret_cast<PixelArray*>(result)->set_external_pointer(external_pointer); | 2070 reinterpret_cast<PixelArray*>(result)->set_external_pointer(external_pointer); |
2090 | 2071 |
2091 return result; | 2072 return result; |
2092 } | 2073 } |
2093 | 2074 |
2094 | 2075 |
2095 Object* Heap::AllocateExternalArray(int length, | 2076 Object* Heap::AllocateExternalArray(int length, |
2096 ExternalArrayType array_type, | 2077 ExternalArrayType array_type, |
2097 void* external_pointer, | 2078 void* external_pointer, |
2098 PretenureFlag pretenure) { | 2079 PretenureFlag pretenure) { |
2099 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2080 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
2100 | |
2101 // New space can't cope with forced allocation. | |
2102 if (always_allocate()) space = OLD_DATA_SPACE; | |
2103 | |
2104 Object* result = AllocateRaw(ExternalArray::kAlignedSize, | 2081 Object* result = AllocateRaw(ExternalArray::kAlignedSize, |
2105 space, | 2082 space, |
2106 OLD_DATA_SPACE); | 2083 OLD_DATA_SPACE); |
2107 | |
2108 if (result->IsFailure()) return result; | 2084 if (result->IsFailure()) return result; |
2109 | 2085 |
2110 reinterpret_cast<ExternalArray*>(result)->set_map( | 2086 reinterpret_cast<ExternalArray*>(result)->set_map( |
2111 MapForExternalArrayType(array_type)); | 2087 MapForExternalArrayType(array_type)); |
2112 reinterpret_cast<ExternalArray*>(result)->set_length(length); | 2088 reinterpret_cast<ExternalArray*>(result)->set_length(length); |
2113 reinterpret_cast<ExternalArray*>(result)->set_external_pointer( | 2089 reinterpret_cast<ExternalArray*>(result)->set_external_pointer( |
2114 external_pointer); | 2090 external_pointer); |
2115 | 2091 |
2116 return result; | 2092 return result; |
2117 } | 2093 } |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2379 map->unused_property_fields() - | 2355 map->unused_property_fields() - |
2380 map->inobject_properties(); | 2356 map->inobject_properties(); |
2381 ASSERT(prop_size >= 0); | 2357 ASSERT(prop_size >= 0); |
2382 Object* properties = AllocateFixedArray(prop_size, pretenure); | 2358 Object* properties = AllocateFixedArray(prop_size, pretenure); |
2383 if (properties->IsFailure()) return properties; | 2359 if (properties->IsFailure()) return properties; |
2384 | 2360 |
2385 // Allocate the JSObject. | 2361 // Allocate the JSObject. |
2386 AllocationSpace space = | 2362 AllocationSpace space = |
2387 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; | 2363 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
2388 if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2364 if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
2389 if (always_allocate()) space = OLD_POINTER_SPACE; | |
2390 Object* obj = Allocate(map, space); | 2365 Object* obj = Allocate(map, space); |
2391 if (obj->IsFailure()) return obj; | 2366 if (obj->IsFailure()) return obj; |
2392 | 2367 |
2393 // Initialize the JSObject. | 2368 // Initialize the JSObject. |
2394 InitializeJSObjectFromMap(JSObject::cast(obj), | 2369 InitializeJSObjectFromMap(JSObject::cast(obj), |
2395 FixedArray::cast(properties), | 2370 FixedArray::cast(properties), |
2396 map); | 2371 map); |
2397 return obj; | 2372 return obj; |
2398 } | 2373 } |
2399 | 2374 |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2676 | 2651 |
2677 if (is_ascii) { | 2652 if (is_ascii) { |
2678 map = ascii_symbol_map(); | 2653 map = ascii_symbol_map(); |
2679 size = SeqAsciiString::SizeFor(chars); | 2654 size = SeqAsciiString::SizeFor(chars); |
2680 } else { | 2655 } else { |
2681 map = symbol_map(); | 2656 map = symbol_map(); |
2682 size = SeqTwoByteString::SizeFor(chars); | 2657 size = SeqTwoByteString::SizeFor(chars); |
2683 } | 2658 } |
2684 | 2659 |
2685 // Allocate string. | 2660 // Allocate string. |
2686 AllocationSpace space = | 2661 Object* result = (size > MaxObjectSizeInPagedSpace()) |
2687 (size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : OLD_DATA_SPACE; | 2662 ? lo_space_->AllocateRaw(size) |
2688 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2663 : old_data_space_->AllocateRaw(size); |
2689 if (result->IsFailure()) return result; | 2664 if (result->IsFailure()) return result; |
2690 | 2665 |
2691 reinterpret_cast<HeapObject*>(result)->set_map(map); | 2666 reinterpret_cast<HeapObject*>(result)->set_map(map); |
2692 // Set length and hash fields of the allocated string. | 2667 // Set length and hash fields of the allocated string. |
2693 String* answer = String::cast(result); | 2668 String* answer = String::cast(result); |
2694 answer->set_length(chars); | 2669 answer->set_length(chars); |
2695 answer->set_hash_field(hash_field); | 2670 answer->set_hash_field(hash_field); |
2696 | 2671 |
2697 ASSERT_EQ(size, answer->Size()); | 2672 ASSERT_EQ(size, answer->Size()); |
2698 | 2673 |
2699 // Fill in the characters. | 2674 // Fill in the characters. |
2700 for (int i = 0; i < chars; i++) { | 2675 for (int i = 0; i < chars; i++) { |
2701 answer->Set(i, buffer->GetNext()); | 2676 answer->Set(i, buffer->GetNext()); |
2702 } | 2677 } |
2703 return answer; | 2678 return answer; |
2704 } | 2679 } |
2705 | 2680 |
2706 | 2681 |
2707 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { | 2682 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
| 2683 int size = SeqAsciiString::SizeFor(length); |
2708 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2684 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 2685 AllocationSpace retry_space = OLD_DATA_SPACE; |
2709 | 2686 |
2710 // New space can't cope with forced allocation. | |
2711 if (always_allocate()) space = OLD_DATA_SPACE; | |
2712 | |
2713 int size = SeqAsciiString::SizeFor(length); | |
2714 | |
2715 Object* result = Failure::OutOfMemoryException(); | |
2716 if (space == NEW_SPACE) { | 2687 if (space == NEW_SPACE) { |
2717 result = size <= kMaxObjectSizeInNewSpace | 2688 if (size > kMaxObjectSizeInNewSpace) { |
2718 ? new_space_.AllocateRaw(size) | 2689 // Allocate in large object space, retry space will be ignored. |
2719 : lo_space_->AllocateRaw(size); | 2690 space = LO_SPACE; |
2720 } else { | 2691 } else if (size > MaxObjectSizeInPagedSpace()) { |
2721 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2692 // Allocate in new space, retry in large object space. |
2722 result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2693 retry_space = LO_SPACE; |
| 2694 } |
| 2695 } else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) { |
| 2696 space = LO_SPACE; |
2723 } | 2697 } |
| 2698 Object* result = AllocateRaw(size, space, retry_space); |
2724 if (result->IsFailure()) return result; | 2699 if (result->IsFailure()) return result; |
2725 | 2700 |
2726 // Partially initialize the object. | 2701 // Partially initialize the object. |
2727 HeapObject::cast(result)->set_map(ascii_string_map()); | 2702 HeapObject::cast(result)->set_map(ascii_string_map()); |
2728 String::cast(result)->set_length(length); | 2703 String::cast(result)->set_length(length); |
2729 String::cast(result)->set_hash_field(String::kEmptyHashField); | 2704 String::cast(result)->set_hash_field(String::kEmptyHashField); |
2730 ASSERT_EQ(size, HeapObject::cast(result)->Size()); | 2705 ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
2731 return result; | 2706 return result; |
2732 } | 2707 } |
2733 | 2708 |
2734 | 2709 |
2735 Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { | 2710 Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { |
| 2711 int size = SeqTwoByteString::SizeFor(length); |
2736 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2712 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 2713 AllocationSpace retry_space = OLD_DATA_SPACE; |
2737 | 2714 |
2738 // New space can't cope with forced allocation. | |
2739 if (always_allocate()) space = OLD_DATA_SPACE; | |
2740 | |
2741 int size = SeqTwoByteString::SizeFor(length); | |
2742 | |
2743 Object* result = Failure::OutOfMemoryException(); | |
2744 if (space == NEW_SPACE) { | 2715 if (space == NEW_SPACE) { |
2745 result = size <= kMaxObjectSizeInNewSpace | 2716 if (size > kMaxObjectSizeInNewSpace) { |
2746 ? new_space_.AllocateRaw(size) | 2717 // Allocate in large object space, retry space will be ignored. |
2747 : lo_space_->AllocateRaw(size); | 2718 space = LO_SPACE; |
2748 } else { | 2719 } else if (size > MaxObjectSizeInPagedSpace()) { |
2749 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2720 // Allocate in new space, retry in large object space. |
2750 result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2721 retry_space = LO_SPACE; |
| 2722 } |
| 2723 } else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) { |
| 2724 space = LO_SPACE; |
2751 } | 2725 } |
| 2726 Object* result = AllocateRaw(size, space, retry_space); |
2752 if (result->IsFailure()) return result; | 2727 if (result->IsFailure()) return result; |
2753 | 2728 |
2754 // Partially initialize the object. | 2729 // Partially initialize the object. |
2755 HeapObject::cast(result)->set_map(string_map()); | 2730 HeapObject::cast(result)->set_map(string_map()); |
2756 String::cast(result)->set_length(length); | 2731 String::cast(result)->set_length(length); |
2757 String::cast(result)->set_hash_field(String::kEmptyHashField); | 2732 String::cast(result)->set_hash_field(String::kEmptyHashField); |
2758 ASSERT_EQ(size, HeapObject::cast(result)->Size()); | 2733 ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
2759 return result; | 2734 return result; |
2760 } | 2735 } |
2761 | 2736 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2819 } | 2794 } |
2820 } | 2795 } |
2821 return result; | 2796 return result; |
2822 } | 2797 } |
2823 | 2798 |
2824 | 2799 |
2825 Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { | 2800 Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
2826 ASSERT(empty_fixed_array()->IsFixedArray()); | 2801 ASSERT(empty_fixed_array()->IsFixedArray()); |
2827 if (length == 0) return empty_fixed_array(); | 2802 if (length == 0) return empty_fixed_array(); |
2828 | 2803 |
2829 // New space can't cope with forced allocation. | 2804 AllocationSpace space = |
2830 if (always_allocate()) pretenure = TENURED; | 2805 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
| 2806 int size = FixedArray::SizeFor(length); |
| 2807 if (space == NEW_SPACE && size > kMaxObjectSizeInNewSpace) { |
| 2808 // Too big for new space. |
| 2809 space = LO_SPACE; |
| 2810 } else if (space == OLD_POINTER_SPACE && |
| 2811 size > MaxObjectSizeInPagedSpace()) { |
| 2812 // Too big for old pointer space. |
| 2813 space = LO_SPACE; |
| 2814 } |
2831 | 2815 |
2832 int size = FixedArray::SizeFor(length); | 2816 // Specialize allocation for the space. |
2833 Object* result = Failure::OutOfMemoryException(); | 2817 Object* result = Failure::OutOfMemoryException(); |
2834 if (pretenure != TENURED) { | 2818 if (space == NEW_SPACE) { |
2835 result = size <= kMaxObjectSizeInNewSpace | 2819 // We cannot use Heap::AllocateRaw() because it will not properly |
2836 ? new_space_.AllocateRaw(size) | 2820 // allocate extra remembered set bits if always_allocate() is true and |
2837 : lo_space_->AllocateRawFixedArray(size); | 2821 // new space allocation fails. |
| 2822 result = new_space_.AllocateRaw(size); |
| 2823 if (result->IsFailure() && always_allocate()) { |
| 2824 if (size <= MaxObjectSizeInPagedSpace()) { |
| 2825 result = old_pointer_space_->AllocateRaw(size); |
| 2826 } else { |
| 2827 result = lo_space_->AllocateRawFixedArray(size); |
| 2828 } |
| 2829 } |
| 2830 } else if (space == OLD_POINTER_SPACE) { |
| 2831 result = old_pointer_space_->AllocateRaw(size); |
| 2832 } else { |
| 2833 ASSERT(space == LO_SPACE); |
| 2834 result = lo_space_->AllocateRawFixedArray(size); |
2838 } | 2835 } |
2839 if (result->IsFailure()) { | 2836 if (result->IsFailure()) return result; |
2840 if (size > MaxObjectSizeInPagedSpace()) { | 2837 |
2841 result = lo_space_->AllocateRawFixedArray(size); | |
2842 } else { | |
2843 AllocationSpace space = | |
2844 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; | |
2845 result = AllocateRaw(size, space, OLD_POINTER_SPACE); | |
2846 } | |
2847 if (result->IsFailure()) return result; | |
2848 } | |
2849 // Initialize the object. | 2838 // Initialize the object. |
2850 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); | 2839 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); |
2851 FixedArray* array = FixedArray::cast(result); | 2840 FixedArray* array = FixedArray::cast(result); |
2852 array->set_length(length); | 2841 array->set_length(length); |
2853 Object* value = undefined_value(); | 2842 Object* value = undefined_value(); |
2854 for (int index = 0; index < length; index++) { | 2843 for (int index = 0; index < length; index++) { |
2855 array->set(index, value, SKIP_WRITE_BARRIER); | 2844 array->set(index, value, SKIP_WRITE_BARRIER); |
2856 } | 2845 } |
2857 return array; | 2846 return array; |
2858 } | 2847 } |
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4092 void ExternalStringTable::TearDown() { | 4081 void ExternalStringTable::TearDown() { |
4093 new_space_strings_.Free(); | 4082 new_space_strings_.Free(); |
4094 old_space_strings_.Free(); | 4083 old_space_strings_.Free(); |
4095 } | 4084 } |
4096 | 4085 |
4097 | 4086 |
4098 List<Object*> ExternalStringTable::new_space_strings_; | 4087 List<Object*> ExternalStringTable::new_space_strings_; |
4099 List<Object*> ExternalStringTable::old_space_strings_; | 4088 List<Object*> ExternalStringTable::old_space_strings_; |
4100 | 4089 |
4101 } } // namespace v8::internal | 4090 } } // namespace v8::internal |
OLD | NEW |