Chromium Code Reviews| 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 4286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4297 Address end, | 4297 Address end, |
| 4298 ObjectSlotCallback callback) { | 4298 ObjectSlotCallback callback) { |
| 4299 Address slot_address = start; | 4299 Address slot_address = start; |
| 4300 while (slot_address < end) { | 4300 while (slot_address < end) { |
| 4301 Object** slot = reinterpret_cast<Object**>(slot_address); | 4301 Object** slot = reinterpret_cast<Object**>(slot_address); |
| 4302 Object* object = *slot; | 4302 Object* object = *slot; |
| 4303 // If the store buffer becomes overfull we mark pages as being exempt from | 4303 // If the store buffer becomes overfull we mark pages as being exempt from |
| 4304 // the store buffer. These pages are scanned to find pointers that point | 4304 // the store buffer. These pages are scanned to find pointers that point |
| 4305 // to the new space. In that case we may hit newly promoted objects and | 4305 // to the new space. In that case we may hit newly promoted objects and |
| 4306 // fix the pointers before the promotion queue gets to them. Thus the 'if'. | 4306 // fix the pointers before the promotion queue gets to them. Thus the 'if'. |
| 4307 if (Heap::InFromSpace(object)) { | 4307 if (object->IsHeapObject()) { |
| 4308 callback(reinterpret_cast<HeapObject**>(slot), HeapObject::cast(object)); | 4308 if (Heap::InFromSpace(object)) { |
| 4309 if (InNewSpace(*slot)) { | 4309 callback(reinterpret_cast<HeapObject**>(slot), |
| 4310 ASSERT(Heap::InToSpace(*slot)); | 4310 HeapObject::cast(object)); |
| 4311 ASSERT((*slot)->IsHeapObject()); | 4311 Object* new_object = *slot; |
| 4312 store_buffer_.EnterDirectlyIntoStoreBuffer( | 4312 if (InNewSpace(new_object)) { |
| 4313 reinterpret_cast<Address>(slot)); | 4313 ASSERT(Heap::InToSpace(new_object)); |
| 4314 ASSERT(new_object->IsHeapObject()); | |
| 4315 store_buffer_.EnterDirectlyIntoStoreBuffer( | |
| 4316 reinterpret_cast<Address>(slot)); | |
| 4317 } | |
| 4318 ASSERT(!MarkCompactCollector::IsOnEvacuationCandidate(new_object)); | |
| 4319 } else if (MarkCompactCollector::IsOnEvacuationCandidate(object)) { | |
| 4320 mark_compact_collector()->RecordSlot(slot, slot, object); | |
|
Erik Corry
2011/07/04 11:04:11
Does this happen? The pointer can't suddenly star
Vyacheslav Egorov (Chromium)
2011/08/05 12:50:28
This else if belongs to the first if. So yes this
| |
| 4314 } | 4321 } |
| 4315 } | 4322 } |
| 4316 slot_address += kPointerSize; | 4323 slot_address += kPointerSize; |
| 4317 } | 4324 } |
| 4318 } | 4325 } |
| 4319 | 4326 |
| 4320 | 4327 |
| 4321 #ifdef DEBUG | 4328 #ifdef DEBUG |
| 4322 typedef bool (*CheckStoreBufferFilter)(Object** addr); | 4329 typedef bool (*CheckStoreBufferFilter)(Object** addr); |
| 4323 | 4330 |
| (...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5847 } | 5854 } |
| 5848 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); | 5855 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); |
| 5849 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { | 5856 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { |
| 5850 next = chunk->next_chunk(); | 5857 next = chunk->next_chunk(); |
| 5851 isolate_->memory_allocator()->Free(chunk); | 5858 isolate_->memory_allocator()->Free(chunk); |
| 5852 } | 5859 } |
| 5853 chunks_queued_for_free_ = NULL; | 5860 chunks_queued_for_free_ = NULL; |
| 5854 } | 5861 } |
| 5855 | 5862 |
| 5856 } } // namespace v8::internal | 5863 } } // namespace v8::internal |
| OLD | NEW |