OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/heap/spaces.h" | 5 #include "src/heap/spaces.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1270 if (page == p) return true; | 1270 if (page == p) return true; |
1271 } | 1271 } |
1272 return false; | 1272 return false; |
1273 } | 1273 } |
1274 | 1274 |
1275 | 1275 |
1276 Object* PagedSpace::FindObject(Address addr) { | 1276 Object* PagedSpace::FindObject(Address addr) { |
1277 // Note: this function can only be called on iterable spaces. | 1277 // Note: this function can only be called on iterable spaces. |
1278 DCHECK(!heap()->mark_compact_collector()->in_use()); | 1278 DCHECK(!heap()->mark_compact_collector()->in_use()); |
1279 | 1279 |
1280 if (!Contains(addr)) return Smi::kZero; // Signaling not found. | 1280 if (!Contains(addr)) return Smi::FromInt(0); // Signaling not found. |
1281 | 1281 |
1282 Page* p = Page::FromAddress(addr); | 1282 Page* p = Page::FromAddress(addr); |
1283 HeapObjectIterator it(p); | 1283 HeapObjectIterator it(p); |
1284 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 1284 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
1285 Address cur = obj->address(); | 1285 Address cur = obj->address(); |
1286 Address next = cur + obj->Size(); | 1286 Address next = cur + obj->Size(); |
1287 if ((cur <= addr) && (addr < next)) return obj; | 1287 if ((cur <= addr) && (addr < next)) return obj; |
1288 } | 1288 } |
1289 | 1289 |
1290 UNREACHABLE(); | 1290 UNREACHABLE(); |
1291 return Smi::kZero; | 1291 return Smi::FromInt(0); |
1292 } | 1292 } |
1293 | 1293 |
1294 void PagedSpace::ShrinkImmortalImmovablePages() { | 1294 void PagedSpace::ShrinkImmortalImmovablePages() { |
1295 DCHECK(!heap()->deserialization_complete()); | 1295 DCHECK(!heap()->deserialization_complete()); |
1296 MemoryChunk::UpdateHighWaterMark(allocation_info_.top()); | 1296 MemoryChunk::UpdateHighWaterMark(allocation_info_.top()); |
1297 EmptyAllocationInfo(); | 1297 EmptyAllocationInfo(); |
1298 ResetFreeList(); | 1298 ResetFreeList(); |
1299 | 1299 |
1300 for (Page* page : *this) { | 1300 for (Page* page : *this) { |
1301 DCHECK(page->IsFlagSet(Page::NEVER_EVACUATE)); | 1301 DCHECK(page->IsFlagSet(Page::NEVER_EVACUATE)); |
(...skipping 1686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2988 InsertChunkMapEntries(page); | 2988 InsertChunkMapEntries(page); |
2989 | 2989 |
2990 HeapObject* object = page->GetObject(); | 2990 HeapObject* object = page->GetObject(); |
2991 MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), object_size); | 2991 MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), object_size); |
2992 | 2992 |
2993 if (Heap::ShouldZapGarbage()) { | 2993 if (Heap::ShouldZapGarbage()) { |
2994 // Make the object consistent so the heap can be verified in OldSpaceStep. | 2994 // Make the object consistent so the heap can be verified in OldSpaceStep. |
2995 // We only need to do this in debug builds or if verify_heap is on. | 2995 // We only need to do this in debug builds or if verify_heap is on. |
2996 reinterpret_cast<Object**>(object->address())[0] = | 2996 reinterpret_cast<Object**>(object->address())[0] = |
2997 heap()->fixed_array_map(); | 2997 heap()->fixed_array_map(); |
2998 reinterpret_cast<Object**>(object->address())[1] = Smi::kZero; | 2998 reinterpret_cast<Object**>(object->address())[1] = Smi::FromInt(0); |
2999 } | 2999 } |
3000 | 3000 |
3001 heap()->StartIncrementalMarkingIfAllocationLimitIsReached(Heap::kNoGCFlags, | 3001 heap()->StartIncrementalMarkingIfAllocationLimitIsReached(Heap::kNoGCFlags, |
3002 kNoGCCallbackFlags); | 3002 kNoGCCallbackFlags); |
3003 AllocationStep(object->address(), object_size); | 3003 AllocationStep(object->address(), object_size); |
3004 | 3004 |
3005 if (heap()->incremental_marking()->black_allocation()) { | 3005 if (heap()->incremental_marking()->black_allocation()) { |
3006 Marking::MarkBlack(ObjectMarking::MarkBitFrom(object)); | 3006 Marking::MarkBlack(ObjectMarking::MarkBitFrom(object)); |
3007 MemoryChunk::IncrementLiveBytesFromGC(object, object_size); | 3007 MemoryChunk::IncrementLiveBytesFromGC(object, object_size); |
3008 } | 3008 } |
3009 return object; | 3009 return object; |
3010 } | 3010 } |
3011 | 3011 |
3012 | 3012 |
3013 size_t LargeObjectSpace::CommittedPhysicalMemory() { | 3013 size_t LargeObjectSpace::CommittedPhysicalMemory() { |
3014 // On a platform that provides lazy committing of memory, we over-account | 3014 // On a platform that provides lazy committing of memory, we over-account |
3015 // the actually committed memory. There is no easy way right now to support | 3015 // the actually committed memory. There is no easy way right now to support |
3016 // precise accounting of committed memory in large object space. | 3016 // precise accounting of committed memory in large object space. |
3017 return CommittedMemory(); | 3017 return CommittedMemory(); |
3018 } | 3018 } |
3019 | 3019 |
3020 | 3020 |
3021 // GC support | 3021 // GC support |
3022 Object* LargeObjectSpace::FindObject(Address a) { | 3022 Object* LargeObjectSpace::FindObject(Address a) { |
3023 LargePage* page = FindPage(a); | 3023 LargePage* page = FindPage(a); |
3024 if (page != NULL) { | 3024 if (page != NULL) { |
3025 return page->GetObject(); | 3025 return page->GetObject(); |
3026 } | 3026 } |
3027 return Smi::kZero; // Signaling not found. | 3027 return Smi::FromInt(0); // Signaling not found. |
3028 } | 3028 } |
3029 | 3029 |
3030 | 3030 |
3031 LargePage* LargeObjectSpace::FindPage(Address a) { | 3031 LargePage* LargeObjectSpace::FindPage(Address a) { |
3032 uintptr_t key = reinterpret_cast<uintptr_t>(a) / MemoryChunk::kAlignment; | 3032 uintptr_t key = reinterpret_cast<uintptr_t>(a) / MemoryChunk::kAlignment; |
3033 base::HashMap::Entry* e = chunk_map_.Lookup(reinterpret_cast<void*>(key), | 3033 base::HashMap::Entry* e = chunk_map_.Lookup(reinterpret_cast<void*>(key), |
3034 static_cast<uint32_t>(key)); | 3034 static_cast<uint32_t>(key)); |
3035 if (e != NULL) { | 3035 if (e != NULL) { |
3036 DCHECK(e->value != NULL); | 3036 DCHECK(e->value != NULL); |
3037 LargePage* page = reinterpret_cast<LargePage*>(e->value); | 3037 LargePage* page = reinterpret_cast<LargePage*>(e->value); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3235 object->ShortPrint(); | 3235 object->ShortPrint(); |
3236 PrintF("\n"); | 3236 PrintF("\n"); |
3237 } | 3237 } |
3238 printf(" --------------------------------------\n"); | 3238 printf(" --------------------------------------\n"); |
3239 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3239 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
3240 } | 3240 } |
3241 | 3241 |
3242 #endif // DEBUG | 3242 #endif // DEBUG |
3243 } // namespace internal | 3243 } // namespace internal |
3244 } // namespace v8 | 3244 } // namespace v8 |
OLD | NEW |