OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2755 return true; | 2755 return true; |
2756 } | 2756 } |
2757 | 2757 |
2758 | 2758 |
2759 void LargeObjectSpace::TearDown() { | 2759 void LargeObjectSpace::TearDown() { |
2760 while (first_chunk_ != NULL) { | 2760 while (first_chunk_ != NULL) { |
2761 LargeObjectChunk* chunk = first_chunk_; | 2761 LargeObjectChunk* chunk = first_chunk_; |
2762 first_chunk_ = first_chunk_->next(); | 2762 first_chunk_ = first_chunk_->next(); |
2763 LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk->address())); | 2763 LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk->address())); |
2764 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); | 2764 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); |
2765 Executability executable = | 2765 Executability executable = page->PageExecutability(); |
2766 page->IsPageExecutable() ? EXECUTABLE : NOT_EXECUTABLE; | |
2767 ObjectSpace space = kObjectSpaceLoSpace; | 2766 ObjectSpace space = kObjectSpaceLoSpace; |
2768 if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; | 2767 if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; |
2769 size_t size = chunk->size(); | 2768 size_t size = chunk->size(); |
2770 size_t guard_size = (executable == EXECUTABLE) ? Page::kPageSize : 0; | 2769 size_t guard_size = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
2771 heap()->isolate()->memory_allocator()->FreeRawMemory( | 2770 heap()->isolate()->memory_allocator()->FreeRawMemory( |
2772 chunk->address() - guard_size, | 2771 chunk->address() - guard_size, |
2773 size + guard_size, | 2772 size + guard_size, |
2774 executable); | 2773 executable); |
2775 heap()->isolate()->memory_allocator()->PerformAllocationCallback( | 2774 heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
2776 space, kAllocationActionFree, size); | 2775 space, kAllocationActionFree, size); |
(...skipping 29 matching lines...) Expand all Loading... |
2806 first_chunk_ = chunk; | 2805 first_chunk_ = chunk; |
2807 | 2806 |
2808 // Initialize page header. | 2807 // Initialize page header. |
2809 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); | 2808 Page* page = Page::FromAddress(RoundUp(chunk->address(), Page::kPageSize)); |
2810 Address object_address = page->ObjectAreaStart(); | 2809 Address object_address = page->ObjectAreaStart(); |
2811 | 2810 |
2812 // Clear the low order bit of the second word in the page to flag it as a | 2811 // Clear the low order bit of the second word in the page to flag it as a |
2813 // large object page. If the chunk_size happened to be written there, its | 2812 // large object page. If the chunk_size happened to be written there, its |
2814 // low order bit should already be clear. | 2813 // low order bit should already be clear. |
2815 page->SetIsLargeObjectPage(true); | 2814 page->SetIsLargeObjectPage(true); |
2816 page->SetIsPageExecutable(executable); | 2815 page->SetPageExecutability(executable); |
2817 page->SetRegionMarks(Page::kAllRegionsCleanMarks); | 2816 page->SetRegionMarks(Page::kAllRegionsCleanMarks); |
2818 return HeapObject::FromAddress(object_address); | 2817 return HeapObject::FromAddress(object_address); |
2819 } | 2818 } |
2820 | 2819 |
2821 | 2820 |
2822 MaybeObject* LargeObjectSpace::AllocateRawCode(int size_in_bytes) { | 2821 MaybeObject* LargeObjectSpace::AllocateRawCode(int size_in_bytes) { |
2823 ASSERT(0 < size_in_bytes); | 2822 ASSERT(0 < size_in_bytes); |
2824 return AllocateRawInternal(size_in_bytes, | 2823 return AllocateRawInternal(size_in_bytes, |
2825 size_in_bytes, | 2824 size_in_bytes, |
2826 EXECUTABLE); | 2825 EXECUTABLE); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2939 while (current != NULL) { | 2938 while (current != NULL) { |
2940 HeapObject* object = current->GetObject(); | 2939 HeapObject* object = current->GetObject(); |
2941 if (object->IsMarked()) { | 2940 if (object->IsMarked()) { |
2942 object->ClearMark(); | 2941 object->ClearMark(); |
2943 heap()->mark_compact_collector()->tracer()->decrement_marked_count(); | 2942 heap()->mark_compact_collector()->tracer()->decrement_marked_count(); |
2944 previous = current; | 2943 previous = current; |
2945 current = current->next(); | 2944 current = current->next(); |
2946 } else { | 2945 } else { |
2947 Page* page = Page::FromAddress(RoundUp(current->address(), | 2946 Page* page = Page::FromAddress(RoundUp(current->address(), |
2948 Page::kPageSize)); | 2947 Page::kPageSize)); |
2949 Executability executable = | 2948 Executability executable = page->PageExecutability(); |
2950 page->IsPageExecutable() ? EXECUTABLE : NOT_EXECUTABLE; | |
2951 Address chunk_address = current->address(); | 2949 Address chunk_address = current->address(); |
2952 size_t chunk_size = current->size(); | 2950 size_t chunk_size = current->size(); |
2953 | 2951 |
2954 // Cut the chunk out from the chunk list. | 2952 // Cut the chunk out from the chunk list. |
2955 current = current->next(); | 2953 current = current->next(); |
2956 if (previous == NULL) { | 2954 if (previous == NULL) { |
2957 first_chunk_ = current; | 2955 first_chunk_ = current; |
2958 } else { | 2956 } else { |
2959 previous->set_next(current); | 2957 previous->set_next(current); |
2960 } | 2958 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3089 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { | 3087 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { |
3090 if (obj->IsCode()) { | 3088 if (obj->IsCode()) { |
3091 Code* code = Code::cast(obj); | 3089 Code* code = Code::cast(obj); |
3092 isolate->code_kind_statistics()[code->kind()] += code->Size(); | 3090 isolate->code_kind_statistics()[code->kind()] += code->Size(); |
3093 } | 3091 } |
3094 } | 3092 } |
3095 } | 3093 } |
3096 #endif // DEBUG | 3094 #endif // DEBUG |
3097 | 3095 |
3098 } } // namespace v8::internal | 3096 } } // namespace v8::internal |
OLD | NEW |