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 2539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2550 | 2550 |
2551 // Note that we never eliminate a transition array, though we might right-trim | 2551 // Note that we never eliminate a transition array, though we might right-trim |
2552 // such that number_of_transitions() == 0. If this assumption changes, | 2552 // such that number_of_transitions() == 0. If this assumption changes, |
2553 // TransitionArray::Insert() will need to deal with the case that a transition | 2553 // TransitionArray::Insert() will need to deal with the case that a transition |
2554 // array disappeared during GC. | 2554 // array disappeared during GC. |
2555 int trim = TransitionArray::Capacity(transitions) - transition_index; | 2555 int trim = TransitionArray::Capacity(transitions) - transition_index; |
2556 if (trim > 0) { | 2556 if (trim > 0) { |
2557 // Non-full-TransitionArray cases can never reach this point. | 2557 // Non-full-TransitionArray cases can never reach this point. |
2558 DCHECK(TransitionArray::IsFullTransitionArray(transitions)); | 2558 DCHECK(TransitionArray::IsFullTransitionArray(transitions)); |
2559 TransitionArray* t = TransitionArray::cast(transitions); | 2559 TransitionArray* t = TransitionArray::cast(transitions); |
2560 heap_->RightTrimFixedArray<Heap::FROM_GC>( | 2560 heap_->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>( |
2561 t, trim * TransitionArray::kTransitionSize); | 2561 t, trim * TransitionArray::kTransitionSize); |
2562 t->SetNumberOfTransitions(transition_index); | 2562 t->SetNumberOfTransitions(transition_index); |
2563 // The map still has a full transition array. | 2563 // The map still has a full transition array. |
2564 DCHECK(TransitionArray::IsFullTransitionArray(map->raw_transitions())); | 2564 DCHECK(TransitionArray::IsFullTransitionArray(map->raw_transitions())); |
2565 } | 2565 } |
2566 } | 2566 } |
2567 | 2567 |
2568 | 2568 |
2569 void MarkCompactCollector::TrimDescriptorArray(Map* map, | 2569 void MarkCompactCollector::TrimDescriptorArray(Map* map, |
2570 DescriptorArray* descriptors, | 2570 DescriptorArray* descriptors, |
2571 int number_of_own_descriptors) { | 2571 int number_of_own_descriptors) { |
2572 int number_of_descriptors = descriptors->number_of_descriptors_storage(); | 2572 int number_of_descriptors = descriptors->number_of_descriptors_storage(); |
2573 int to_trim = number_of_descriptors - number_of_own_descriptors; | 2573 int to_trim = number_of_descriptors - number_of_own_descriptors; |
2574 if (to_trim == 0) return; | 2574 if (to_trim == 0) return; |
2575 | 2575 |
2576 heap_->RightTrimFixedArray<Heap::FROM_GC>( | 2576 heap_->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>( |
2577 descriptors, to_trim * DescriptorArray::kDescriptorSize); | 2577 descriptors, to_trim * DescriptorArray::kDescriptorSize); |
2578 descriptors->SetNumberOfDescriptors(number_of_own_descriptors); | 2578 descriptors->SetNumberOfDescriptors(number_of_own_descriptors); |
2579 | 2579 |
2580 if (descriptors->HasEnumCache()) TrimEnumCache(map, descriptors); | 2580 if (descriptors->HasEnumCache()) TrimEnumCache(map, descriptors); |
2581 descriptors->Sort(); | 2581 descriptors->Sort(); |
2582 | 2582 |
2583 if (FLAG_unbox_double_fields) { | 2583 if (FLAG_unbox_double_fields) { |
2584 LayoutDescriptor* layout_descriptor = map->layout_descriptor(); | 2584 LayoutDescriptor* layout_descriptor = map->layout_descriptor(); |
2585 layout_descriptor = layout_descriptor->Trim(heap_, map, descriptors, | 2585 layout_descriptor = layout_descriptor->Trim(heap_, map, descriptors, |
2586 number_of_own_descriptors); | 2586 number_of_own_descriptors); |
2587 SLOW_DCHECK(layout_descriptor->IsConsistentWithMap(map, true)); | 2587 SLOW_DCHECK(layout_descriptor->IsConsistentWithMap(map, true)); |
2588 } | 2588 } |
2589 } | 2589 } |
2590 | 2590 |
2591 | 2591 |
2592 void MarkCompactCollector::TrimEnumCache(Map* map, | 2592 void MarkCompactCollector::TrimEnumCache(Map* map, |
2593 DescriptorArray* descriptors) { | 2593 DescriptorArray* descriptors) { |
2594 int live_enum = map->EnumLength(); | 2594 int live_enum = map->EnumLength(); |
2595 if (live_enum == kInvalidEnumCacheSentinel) { | 2595 if (live_enum == kInvalidEnumCacheSentinel) { |
2596 live_enum = map->NumberOfDescribedProperties(OWN_DESCRIPTORS, DONT_ENUM); | 2596 live_enum = map->NumberOfDescribedProperties(OWN_DESCRIPTORS, DONT_ENUM); |
2597 } | 2597 } |
2598 if (live_enum == 0) return descriptors->ClearEnumCache(); | 2598 if (live_enum == 0) return descriptors->ClearEnumCache(); |
2599 | 2599 |
2600 FixedArray* enum_cache = descriptors->GetEnumCache(); | 2600 FixedArray* enum_cache = descriptors->GetEnumCache(); |
2601 | 2601 |
2602 int to_trim = enum_cache->length() - live_enum; | 2602 int to_trim = enum_cache->length() - live_enum; |
2603 if (to_trim <= 0) return; | 2603 if (to_trim <= 0) return; |
2604 heap_->RightTrimFixedArray<Heap::FROM_GC>(descriptors->GetEnumCache(), | 2604 heap_->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>( |
2605 to_trim); | 2605 descriptors->GetEnumCache(), to_trim); |
2606 | 2606 |
2607 if (!descriptors->HasEnumIndicesCache()) return; | 2607 if (!descriptors->HasEnumIndicesCache()) return; |
2608 FixedArray* enum_indices_cache = descriptors->GetEnumIndicesCache(); | 2608 FixedArray* enum_indices_cache = descriptors->GetEnumIndicesCache(); |
2609 heap_->RightTrimFixedArray<Heap::FROM_GC>(enum_indices_cache, to_trim); | 2609 heap_->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(enum_indices_cache, |
| 2610 to_trim); |
2610 } | 2611 } |
2611 | 2612 |
2612 | 2613 |
2613 void MarkCompactCollector::ProcessWeakCollections() { | 2614 void MarkCompactCollector::ProcessWeakCollections() { |
2614 GCTracer::Scope gc_scope(heap()->tracer(), | 2615 GCTracer::Scope gc_scope(heap()->tracer(), |
2615 GCTracer::Scope::MC_WEAKCOLLECTION_PROCESS); | 2616 GCTracer::Scope::MC_WEAKCOLLECTION_PROCESS); |
2616 Object* weak_collection_obj = heap()->encountered_weak_collections(); | 2617 Object* weak_collection_obj = heap()->encountered_weak_collections(); |
2617 while (weak_collection_obj != Smi::FromInt(0)) { | 2618 while (weak_collection_obj != Smi::FromInt(0)) { |
2618 JSWeakCollection* weak_collection = | 2619 JSWeakCollection* weak_collection = |
2619 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); | 2620 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); |
(...skipping 2111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4731 SlotsBuffer* buffer = *buffer_address; | 4732 SlotsBuffer* buffer = *buffer_address; |
4732 while (buffer != NULL) { | 4733 while (buffer != NULL) { |
4733 SlotsBuffer* next_buffer = buffer->next(); | 4734 SlotsBuffer* next_buffer = buffer->next(); |
4734 DeallocateBuffer(buffer); | 4735 DeallocateBuffer(buffer); |
4735 buffer = next_buffer; | 4736 buffer = next_buffer; |
4736 } | 4737 } |
4737 *buffer_address = NULL; | 4738 *buffer_address = NULL; |
4738 } | 4739 } |
4739 } | 4740 } |
4740 } // namespace v8::internal | 4741 } // namespace v8::internal |
OLD | NEW |