Chromium Code Reviews| Index: src/spaces.cc |
| =================================================================== |
| --- src/spaces.cc (revision 9017) |
| +++ src/spaces.cc (working copy) |
| @@ -2728,8 +2728,17 @@ |
| void LargeObjectChunk::Free(Executability executable) { |
| + size_t guard_size = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
| + ObjectSpace space = |
| + (executable == EXECUTABLE) ? kObjectSpaceCodeSpace : kObjectSpaceLoSpace; |
| + // Do not access instance fields after FreeRawMemory! |
| + Address my_address = address(); |
| + size_t my_size = size(); |
| Isolate* isolate = GetPage()->heap_->isolate(); |
| - isolate->memory_allocator()->FreeRawMemory(address(), size(), executable); |
| + MemoryAllocator* a = isolate->memory_allocator(); |
| + a->FreeRawMemory(my_address - guard_size, my_size + guard_size, executable); |
| + a->PerformAllocationCallback(space, kAllocationActionFree, my_size); |
| + LOG(isolate, DeleteEvent("LargeObjectChunk", my_address)); |
| } |
| @@ -2765,23 +2774,9 @@ |
| while (first_chunk_ != NULL) { |
| LargeObjectChunk* chunk = first_chunk_; |
| first_chunk_ = first_chunk_->next(); |
| - LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk->address())); |
| - Executability executable = chunk->GetPage()->PageExecutability(); |
| - ObjectSpace space = kObjectSpaceLoSpace; |
| - if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; |
| - size_t size = chunk->size(); |
| - size_t guard_size = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
| - heap()->isolate()->memory_allocator()->FreeRawMemory( |
| - chunk->address() - guard_size, |
| - size + guard_size, |
| - executable); |
| - heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
| - space, kAllocationActionFree, size); |
| + chunk->Free(chunk->GetPage()->PageExecutability()); |
| } |
| - |
| - size_ = 0; |
| - page_count_ = 0; |
| - objects_size_ = 0; |
| + Setup(); |
|
Vyacheslav Egorov (Chromium)
2011/08/25 15:22:54
Calling Setup from TearDown is very confusing.
|
| } |
| @@ -2947,11 +2942,8 @@ |
| previous = current; |
| current = current->next(); |
| } else { |
| - Executability executable = current->GetPage()->PageExecutability(); |
| - Address chunk_address = current->address(); |
| - size_t chunk_size = current->size(); |
| - |
| // Cut the chunk out from the chunk list. |
| + LargeObjectChunk* current_chunk = current; |
| current = current->next(); |
| if (previous == NULL) { |
| first_chunk_ = current; |
| @@ -2964,22 +2956,10 @@ |
| object, heap()->isolate()); |
| LiveObjectList::ProcessNonLive(object); |
| - size_ -= static_cast<int>(chunk_size); |
| + size_ -= static_cast<int>(current_chunk->size()); |
| objects_size_ -= object->Size(); |
| page_count_--; |
| - ObjectSpace space = kObjectSpaceLoSpace; |
| - size_t guard_size = 0; |
| - if (executable == EXECUTABLE) { |
| - space = kObjectSpaceCodeSpace; |
| - guard_size = Page::kPageSize; |
| - } |
| - heap()->isolate()->memory_allocator()->FreeRawMemory( |
| - chunk_address - guard_size, |
| - chunk_size + guard_size, |
| - executable); |
| - heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
| - space, kAllocationActionFree, size_); |
| - LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk_address)); |
| + current_chunk->Free(current_chunk->GetPage()->PageExecutability()); |
| } |
| } |
| } |