| 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 1232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1243 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); | 1243 ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
| 1244 return true; | 1244 return true; |
| 1245 } | 1245 } |
| 1246 | 1246 |
| 1247 | 1247 |
| 1248 Object* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { | 1248 Object* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { |
| 1249 // Statically ensure that it is safe to allocate heap numbers in paged | 1249 // Statically ensure that it is safe to allocate heap numbers in paged |
| 1250 // spaces. | 1250 // spaces. |
| 1251 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); | 1251 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); |
| 1252 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 1252 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 1253 |
| 1254 // New space can't cope with forced allocation. |
| 1255 if (always_allocate()) space = OLD_DATA_SPACE; |
| 1256 |
| 1253 Object* result = AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); | 1257 Object* result = AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); |
| 1254 if (result->IsFailure()) return result; | 1258 if (result->IsFailure()) return result; |
| 1255 | 1259 |
| 1256 HeapObject::cast(result)->set_map(heap_number_map()); | 1260 HeapObject::cast(result)->set_map(heap_number_map()); |
| 1257 HeapNumber::cast(result)->set_value(value); | 1261 HeapNumber::cast(result)->set_value(value); |
| 1258 return result; | 1262 return result; |
| 1259 } | 1263 } |
| 1260 | 1264 |
| 1261 | 1265 |
| 1262 Object* Heap::AllocateHeapNumber(double value) { | 1266 Object* Heap::AllocateHeapNumber(double value) { |
| 1263 // Use general version, if we're forced to always allocate. | 1267 // Use general version, if we're forced to always allocate. |
| 1264 if (always_allocate()) return AllocateHeapNumber(value, NOT_TENURED); | 1268 if (always_allocate()) return AllocateHeapNumber(value, TENURED); |
| 1269 |
| 1265 // This version of AllocateHeapNumber is optimized for | 1270 // This version of AllocateHeapNumber is optimized for |
| 1266 // allocation in new space. | 1271 // allocation in new space. |
| 1267 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); | 1272 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); |
| 1268 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); | 1273 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); |
| 1269 Object* result = new_space_.AllocateRaw(HeapNumber::kSize); | 1274 Object* result = new_space_.AllocateRaw(HeapNumber::kSize); |
| 1270 if (result->IsFailure()) return result; | 1275 if (result->IsFailure()) return result; |
| 1271 HeapObject::cast(result)->set_map(heap_number_map()); | 1276 HeapObject::cast(result)->set_map(heap_number_map()); |
| 1272 HeapNumber::cast(result)->set_value(value); | 1277 HeapNumber::cast(result)->set_value(value); |
| 1273 return result; | 1278 return result; |
| 1274 } | 1279 } |
| (...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1855 reinterpret_cast<Array*>(result)->set_length(length); | 1860 reinterpret_cast<Array*>(result)->set_length(length); |
| 1856 return result; | 1861 return result; |
| 1857 } | 1862 } |
| 1858 | 1863 |
| 1859 | 1864 |
| 1860 Object* Heap::AllocateByteArray(int length) { | 1865 Object* Heap::AllocateByteArray(int length) { |
| 1861 int size = ByteArray::SizeFor(length); | 1866 int size = ByteArray::SizeFor(length); |
| 1862 AllocationSpace space = | 1867 AllocationSpace space = |
| 1863 size > MaxObjectSizeInPagedSpace() ? LO_SPACE : NEW_SPACE; | 1868 size > MaxObjectSizeInPagedSpace() ? LO_SPACE : NEW_SPACE; |
| 1864 | 1869 |
| 1870 // New space can't cope with forced allocation. |
| 1871 if (always_allocate()) space = LO_SPACE; |
| 1872 |
| 1865 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); | 1873 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| 1866 | 1874 |
| 1867 if (result->IsFailure()) return result; | 1875 if (result->IsFailure()) return result; |
| 1868 | 1876 |
| 1869 reinterpret_cast<Array*>(result)->set_map(byte_array_map()); | 1877 reinterpret_cast<Array*>(result)->set_map(byte_array_map()); |
| 1870 reinterpret_cast<Array*>(result)->set_length(length); | 1878 reinterpret_cast<Array*>(result)->set_length(length); |
| 1871 return result; | 1879 return result; |
| 1872 } | 1880 } |
| 1873 | 1881 |
| 1874 | 1882 |
| 1875 void Heap::CreateFillerObjectAt(Address addr, int size) { | 1883 void Heap::CreateFillerObjectAt(Address addr, int size) { |
| 1876 if (size == 0) return; | 1884 if (size == 0) return; |
| 1877 HeapObject* filler = HeapObject::FromAddress(addr); | 1885 HeapObject* filler = HeapObject::FromAddress(addr); |
| 1878 if (size == kPointerSize) { | 1886 if (size == kPointerSize) { |
| 1879 filler->set_map(Heap::one_pointer_filler_map()); | 1887 filler->set_map(Heap::one_pointer_filler_map()); |
| 1880 } else { | 1888 } else { |
| 1881 filler->set_map(Heap::byte_array_map()); | 1889 filler->set_map(Heap::byte_array_map()); |
| 1882 ByteArray::cast(filler)->set_length(ByteArray::LengthFor(size)); | 1890 ByteArray::cast(filler)->set_length(ByteArray::LengthFor(size)); |
| 1883 } | 1891 } |
| 1884 } | 1892 } |
| 1885 | 1893 |
| 1886 | 1894 |
| 1887 Object* Heap::AllocatePixelArray(int length, | 1895 Object* Heap::AllocatePixelArray(int length, |
| 1888 uint8_t* external_pointer, | 1896 uint8_t* external_pointer, |
| 1889 PretenureFlag pretenure) { | 1897 PretenureFlag pretenure) { |
| 1890 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 1898 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 1891 | 1899 |
| 1900 // New space can't cope with forced allocation. |
| 1901 if (always_allocate()) space = OLD_DATA_SPACE; |
| 1902 |
| 1892 Object* result = AllocateRaw(PixelArray::kAlignedSize, space, OLD_DATA_SPACE); | 1903 Object* result = AllocateRaw(PixelArray::kAlignedSize, space, OLD_DATA_SPACE); |
| 1893 | 1904 |
| 1894 if (result->IsFailure()) return result; | 1905 if (result->IsFailure()) return result; |
| 1895 | 1906 |
| 1896 reinterpret_cast<PixelArray*>(result)->set_map(pixel_array_map()); | 1907 reinterpret_cast<PixelArray*>(result)->set_map(pixel_array_map()); |
| 1897 reinterpret_cast<PixelArray*>(result)->set_length(length); | 1908 reinterpret_cast<PixelArray*>(result)->set_length(length); |
| 1898 reinterpret_cast<PixelArray*>(result)->set_external_pointer(external_pointer); | 1909 reinterpret_cast<PixelArray*>(result)->set_external_pointer(external_pointer); |
| 1899 | 1910 |
| 1900 return result; | 1911 return result; |
| 1901 } | 1912 } |
| (...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2525 // Fill in the characters. | 2536 // Fill in the characters. |
| 2526 for (int i = 0; i < chars; i++) { | 2537 for (int i = 0; i < chars; i++) { |
| 2527 answer->Set(i, buffer->GetNext()); | 2538 answer->Set(i, buffer->GetNext()); |
| 2528 } | 2539 } |
| 2529 return answer; | 2540 return answer; |
| 2530 } | 2541 } |
| 2531 | 2542 |
| 2532 | 2543 |
| 2533 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { | 2544 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
| 2534 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2545 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 2546 |
| 2547 // New space can't cope with forced allocation. |
| 2548 if (always_allocate()) space = OLD_DATA_SPACE; |
| 2549 |
| 2535 int size = SeqAsciiString::SizeFor(length); | 2550 int size = SeqAsciiString::SizeFor(length); |
| 2536 | 2551 |
| 2537 Object* result = Failure::OutOfMemoryException(); | 2552 Object* result = Failure::OutOfMemoryException(); |
| 2538 if (space == NEW_SPACE) { | 2553 if (space == NEW_SPACE) { |
| 2539 result = size <= kMaxObjectSizeInNewSpace | 2554 result = size <= kMaxObjectSizeInNewSpace |
| 2540 ? new_space_.AllocateRaw(size) | 2555 ? new_space_.AllocateRaw(size) |
| 2541 : lo_space_->AllocateRawFixedArray(size); | 2556 : lo_space_->AllocateRaw(size); |
| 2542 } else { | 2557 } else { |
| 2543 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2558 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
| 2544 result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2559 result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| 2545 } | 2560 } |
| 2546 if (result->IsFailure()) return result; | 2561 if (result->IsFailure()) return result; |
| 2547 | 2562 |
| 2548 // Determine the map based on the string's length. | 2563 // Determine the map based on the string's length. |
| 2549 Map* map; | 2564 Map* map; |
| 2550 if (length <= String::kMaxShortStringSize) { | 2565 if (length <= String::kMaxShortStringSize) { |
| 2551 map = short_ascii_string_map(); | 2566 map = short_ascii_string_map(); |
| 2552 } else if (length <= String::kMaxMediumStringSize) { | 2567 } else if (length <= String::kMaxMediumStringSize) { |
| 2553 map = medium_ascii_string_map(); | 2568 map = medium_ascii_string_map(); |
| 2554 } else { | 2569 } else { |
| 2555 map = long_ascii_string_map(); | 2570 map = long_ascii_string_map(); |
| 2556 } | 2571 } |
| 2557 | 2572 |
| 2558 // Partially initialize the object. | 2573 // Partially initialize the object. |
| 2559 HeapObject::cast(result)->set_map(map); | 2574 HeapObject::cast(result)->set_map(map); |
| 2560 String::cast(result)->set_length(length); | 2575 String::cast(result)->set_length(length); |
| 2561 ASSERT_EQ(size, HeapObject::cast(result)->Size()); | 2576 ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
| 2562 return result; | 2577 return result; |
| 2563 } | 2578 } |
| 2564 | 2579 |
| 2565 | 2580 |
| 2566 Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { | 2581 Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { |
| 2567 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2582 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 2583 |
| 2584 // New space can't cope with forced allocation. |
| 2585 if (always_allocate()) space = OLD_DATA_SPACE; |
| 2586 |
| 2568 int size = SeqTwoByteString::SizeFor(length); | 2587 int size = SeqTwoByteString::SizeFor(length); |
| 2569 | 2588 |
| 2570 Object* result = Failure::OutOfMemoryException(); | 2589 Object* result = Failure::OutOfMemoryException(); |
| 2571 if (space == NEW_SPACE) { | 2590 if (space == NEW_SPACE) { |
| 2572 result = size <= kMaxObjectSizeInNewSpace | 2591 result = size <= kMaxObjectSizeInNewSpace |
| 2573 ? new_space_.AllocateRaw(size) | 2592 ? new_space_.AllocateRaw(size) |
| 2574 : lo_space_->AllocateRawFixedArray(size); | 2593 : lo_space_->AllocateRaw(size); |
| 2575 } else { | 2594 } else { |
| 2576 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2595 if (size > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
| 2577 result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2596 result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| 2578 } | 2597 } |
| 2579 if (result->IsFailure()) return result; | 2598 if (result->IsFailure()) return result; |
| 2580 | 2599 |
| 2581 // Determine the map based on the string's length. | 2600 // Determine the map based on the string's length. |
| 2582 Map* map; | 2601 Map* map; |
| 2583 if (length <= String::kMaxShortStringSize) { | 2602 if (length <= String::kMaxShortStringSize) { |
| 2584 map = short_string_map(); | 2603 map = short_string_map(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2602 if (result->IsFailure()) return result; | 2621 if (result->IsFailure()) return result; |
| 2603 // Initialize the object. | 2622 // Initialize the object. |
| 2604 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); | 2623 reinterpret_cast<Array*>(result)->set_map(fixed_array_map()); |
| 2605 reinterpret_cast<Array*>(result)->set_length(0); | 2624 reinterpret_cast<Array*>(result)->set_length(0); |
| 2606 return result; | 2625 return result; |
| 2607 } | 2626 } |
| 2608 | 2627 |
| 2609 | 2628 |
| 2610 Object* Heap::AllocateRawFixedArray(int length) { | 2629 Object* Heap::AllocateRawFixedArray(int length) { |
| 2611 // Use the general function if we're forced to always allocate. | 2630 // Use the general function if we're forced to always allocate. |
| 2612 if (always_allocate()) return AllocateFixedArray(length, NOT_TENURED); | 2631 if (always_allocate()) return AllocateFixedArray(length, TENURED); |
| 2613 // Allocate the raw data for a fixed array. | 2632 // Allocate the raw data for a fixed array. |
| 2614 int size = FixedArray::SizeFor(length); | 2633 int size = FixedArray::SizeFor(length); |
| 2615 return size <= kMaxObjectSizeInNewSpace | 2634 return size <= kMaxObjectSizeInNewSpace |
| 2616 ? new_space_.AllocateRaw(size) | 2635 ? new_space_.AllocateRaw(size) |
| 2617 : lo_space_->AllocateRawFixedArray(size); | 2636 : lo_space_->AllocateRawFixedArray(size); |
| 2618 } | 2637 } |
| 2619 | 2638 |
| 2620 | 2639 |
| 2621 Object* Heap::CopyFixedArray(FixedArray* src) { | 2640 Object* Heap::CopyFixedArray(FixedArray* src) { |
| 2622 int len = src->length(); | 2641 int len = src->length(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2655 } | 2674 } |
| 2656 } | 2675 } |
| 2657 return result; | 2676 return result; |
| 2658 } | 2677 } |
| 2659 | 2678 |
| 2660 | 2679 |
| 2661 Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { | 2680 Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
| 2662 ASSERT(empty_fixed_array()->IsFixedArray()); | 2681 ASSERT(empty_fixed_array()->IsFixedArray()); |
| 2663 if (length == 0) return empty_fixed_array(); | 2682 if (length == 0) return empty_fixed_array(); |
| 2664 | 2683 |
| 2684 // New space can't cope with forced allocation. |
| 2685 if (always_allocate()) pretenure = TENURED; |
| 2686 |
| 2665 int size = FixedArray::SizeFor(length); | 2687 int size = FixedArray::SizeFor(length); |
| 2666 Object* result = Failure::OutOfMemoryException(); | 2688 Object* result = Failure::OutOfMemoryException(); |
| 2667 if (pretenure != TENURED) { | 2689 if (pretenure != TENURED) { |
| 2668 result = size <= kMaxObjectSizeInNewSpace | 2690 result = size <= kMaxObjectSizeInNewSpace |
| 2669 ? new_space_.AllocateRaw(size) | 2691 ? new_space_.AllocateRaw(size) |
| 2670 : lo_space_->AllocateRawFixedArray(size); | 2692 : lo_space_->AllocateRawFixedArray(size); |
| 2671 } | 2693 } |
| 2672 if (result->IsFailure()) { | 2694 if (result->IsFailure()) { |
| 2673 if (size > MaxObjectSizeInPagedSpace()) { | 2695 if (size > MaxObjectSizeInPagedSpace()) { |
| 2674 result = lo_space_->AllocateRawFixedArray(size); | 2696 result = lo_space_->AllocateRawFixedArray(size); |
| (...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3827 for (int i = 0; i < kNumberOfCaches; i++) { | 3849 for (int i = 0; i < kNumberOfCaches; i++) { |
| 3828 if (caches_[i] != NULL) { | 3850 if (caches_[i] != NULL) { |
| 3829 delete caches_[i]; | 3851 delete caches_[i]; |
| 3830 caches_[i] = NULL; | 3852 caches_[i] = NULL; |
| 3831 } | 3853 } |
| 3832 } | 3854 } |
| 3833 } | 3855 } |
| 3834 | 3856 |
| 3835 | 3857 |
| 3836 } } // namespace v8::internal | 3858 } } // namespace v8::internal |
| OLD | NEW |