| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 3023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3034 int object_size) { | 3034 int object_size) { |
| 3035 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); | 3035 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); |
| 3036 | 3036 |
| 3037 OldSpace* old_space = heap()->old_space(); | 3037 OldSpace* old_space = heap()->old_space(); |
| 3038 | 3038 |
| 3039 HeapObject* target; | 3039 HeapObject* target; |
| 3040 AllocationAlignment alignment = object->RequiredAlignment(); | 3040 AllocationAlignment alignment = object->RequiredAlignment(); |
| 3041 AllocationResult allocation = old_space->AllocateRaw(object_size, alignment); | 3041 AllocationResult allocation = old_space->AllocateRaw(object_size, alignment); |
| 3042 if (allocation.To(&target)) { | 3042 if (allocation.To(&target)) { |
| 3043 MigrateObject(target, object, object_size, old_space->identity()); | 3043 MigrateObject(target, object, object_size, old_space->identity()); |
| 3044 // If we end up needing more special cases, we should factor this out. | |
| 3045 if (V8_UNLIKELY(target->IsJSArrayBuffer())) { | |
| 3046 heap()->PromoteArrayBuffer(target); | |
| 3047 } | |
| 3048 heap()->IncrementPromotedObjectsSize(object_size); | 3044 heap()->IncrementPromotedObjectsSize(object_size); |
| 3049 return true; | 3045 return true; |
| 3050 } | 3046 } |
| 3051 | 3047 |
| 3052 return false; | 3048 return false; |
| 3053 } | 3049 } |
| 3054 | 3050 |
| 3055 | 3051 |
| 3056 bool MarkCompactCollector::IsSlotInBlackObject(Page* p, Address slot, | 3052 bool MarkCompactCollector::IsSlotInBlackObject(Page* p, Address slot, |
| 3057 HeapObject** out_object) { | 3053 HeapObject** out_object) { |
| (...skipping 1306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4364 void MarkCompactCollector::SweepSpaces() { | 4360 void MarkCompactCollector::SweepSpaces() { |
| 4365 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP); | 4361 GCTracer::Scope gc_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP); |
| 4366 double start_time = 0.0; | 4362 double start_time = 0.0; |
| 4367 if (FLAG_print_cumulative_gc_stat) { | 4363 if (FLAG_print_cumulative_gc_stat) { |
| 4368 start_time = base::OS::TimeCurrentMillis(); | 4364 start_time = base::OS::TimeCurrentMillis(); |
| 4369 } | 4365 } |
| 4370 | 4366 |
| 4371 #ifdef DEBUG | 4367 #ifdef DEBUG |
| 4372 state_ = SWEEP_SPACES; | 4368 state_ = SWEEP_SPACES; |
| 4373 #endif | 4369 #endif |
| 4370 heap()->FreeDeadArrayBuffers(); |
| 4374 | 4371 |
| 4375 MoveEvacuationCandidatesToEndOfPagesList(); | 4372 MoveEvacuationCandidatesToEndOfPagesList(); |
| 4376 | 4373 |
| 4377 // Noncompacting collections simply sweep the spaces to clear the mark | 4374 // Noncompacting collections simply sweep the spaces to clear the mark |
| 4378 // bits and free the nonlive blocks (for old and map spaces). We sweep | 4375 // bits and free the nonlive blocks (for old and map spaces). We sweep |
| 4379 // the map space last because freeing non-live maps overwrites them and | 4376 // the map space last because freeing non-live maps overwrites them and |
| 4380 // the other spaces rely on possibly non-live maps to get the sizes for | 4377 // the other spaces rely on possibly non-live maps to get the sizes for |
| 4381 // non-live objects. | 4378 // non-live objects. |
| 4382 { | 4379 { |
| 4383 GCTracer::Scope sweep_scope(heap()->tracer(), | 4380 GCTracer::Scope sweep_scope(heap()->tracer(), |
| 4384 GCTracer::Scope::MC_SWEEP_OLDSPACE); | 4381 GCTracer::Scope::MC_SWEEP_OLDSPACE); |
| 4385 { SweepSpace(heap()->old_space(), CONCURRENT_SWEEPING); } | 4382 { SweepSpace(heap()->old_space(), CONCURRENT_SWEEPING); } |
| 4386 sweeping_in_progress_ = true; | 4383 sweeping_in_progress_ = true; |
| 4387 if (heap()->concurrent_sweeping_enabled()) { | 4384 if (heap()->concurrent_sweeping_enabled()) { |
| 4388 StartSweeperThreads(); | 4385 StartSweeperThreads(); |
| 4389 } | 4386 } |
| 4390 } | 4387 } |
| 4391 RemoveDeadInvalidatedCode(); | 4388 RemoveDeadInvalidatedCode(); |
| 4392 | 4389 |
| 4393 { | 4390 { |
| 4394 GCTracer::Scope sweep_scope(heap()->tracer(), | 4391 GCTracer::Scope sweep_scope(heap()->tracer(), |
| 4395 GCTracer::Scope::MC_SWEEP_CODE); | 4392 GCTracer::Scope::MC_SWEEP_CODE); |
| 4396 SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING); | 4393 SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING); |
| 4397 } | 4394 } |
| 4398 | 4395 |
| 4399 EvacuateNewSpaceAndCandidates(); | 4396 EvacuateNewSpaceAndCandidates(); |
| 4400 | 4397 |
| 4401 heap()->FreeDeadArrayBuffers(false); | |
| 4402 | |
| 4403 // ClearNonLiveReferences depends on precise sweeping of map space to | 4398 // ClearNonLiveReferences depends on precise sweeping of map space to |
| 4404 // detect whether unmarked map became dead in this collection or in one | 4399 // detect whether unmarked map became dead in this collection or in one |
| 4405 // of the previous ones. | 4400 // of the previous ones. |
| 4406 { | 4401 { |
| 4407 GCTracer::Scope sweep_scope(heap()->tracer(), | 4402 GCTracer::Scope sweep_scope(heap()->tracer(), |
| 4408 GCTracer::Scope::MC_SWEEP_MAP); | 4403 GCTracer::Scope::MC_SWEEP_MAP); |
| 4409 SweepSpace(heap()->map_space(), SEQUENTIAL_SWEEPING); | 4404 SweepSpace(heap()->map_space(), SEQUENTIAL_SWEEPING); |
| 4410 } | 4405 } |
| 4411 | 4406 |
| 4412 // Deallocate unmarked objects and clear marked bits for marked objects. | 4407 // Deallocate unmarked objects and clear marked bits for marked objects. |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4728 SlotsBuffer* buffer = *buffer_address; | 4723 SlotsBuffer* buffer = *buffer_address; |
| 4729 while (buffer != NULL) { | 4724 while (buffer != NULL) { |
| 4730 SlotsBuffer* next_buffer = buffer->next(); | 4725 SlotsBuffer* next_buffer = buffer->next(); |
| 4731 DeallocateBuffer(buffer); | 4726 DeallocateBuffer(buffer); |
| 4732 buffer = next_buffer; | 4727 buffer = next_buffer; |
| 4733 } | 4728 } |
| 4734 *buffer_address = NULL; | 4729 *buffer_address = NULL; |
| 4735 } | 4730 } |
| 4736 } // namespace internal | 4731 } // namespace internal |
| 4737 } // namespace v8 | 4732 } // namespace v8 |
| OLD | NEW |