OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 MarkLiveObjects(); | 78 MarkLiveObjects(); |
79 | 79 |
80 if (FLAG_collect_maps) ClearNonLiveTransitions(); | 80 if (FLAG_collect_maps) ClearNonLiveTransitions(); |
81 | 81 |
82 SweepLargeObjectSpace(); | 82 SweepLargeObjectSpace(); |
83 | 83 |
84 if (IsCompacting()) { | 84 if (IsCompacting()) { |
85 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_COMPACT); | 85 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_COMPACT); |
86 EncodeForwardingAddresses(); | 86 EncodeForwardingAddresses(); |
87 | 87 |
| 88 Heap::MarkMapPointersAsEncoded(true); |
88 UpdatePointers(); | 89 UpdatePointers(); |
| 90 Heap::MarkMapPointersAsEncoded(false); |
| 91 PcToCodeCache::FlushPcToCodeCache(); |
89 | 92 |
90 RelocateObjects(); | 93 RelocateObjects(); |
91 } else { | 94 } else { |
92 SweepSpaces(); | 95 SweepSpaces(); |
| 96 PcToCodeCache::FlushPcToCodeCache(); |
93 } | 97 } |
94 | 98 |
95 Finish(); | 99 Finish(); |
96 | 100 |
97 // Save the count of marked objects remaining after the collection and | 101 // Save the count of marked objects remaining after the collection and |
98 // null out the GC tracer. | 102 // null out the GC tracer. |
99 previous_marked_count_ = tracer_->marked_count(); | 103 previous_marked_count_ = tracer_->marked_count(); |
100 ASSERT(previous_marked_count_ == 0); | 104 ASSERT(previous_marked_count_ == 0); |
101 tracer_ = NULL; | 105 tracer_ = NULL; |
102 } | 106 } |
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1178 // of a live object). A second distinguished map-pointer encoding is used | 1182 // of a live object). A second distinguished map-pointer encoding is used |
1179 // to mark free regions larger than one word, and the size of the free | 1183 // to mark free regions larger than one word, and the size of the free |
1180 // region (including the first word) is written to the second word of the | 1184 // region (including the first word) is written to the second word of the |
1181 // region. | 1185 // region. |
1182 // | 1186 // |
1183 // Any valid map page offset must lie in the object area of the page, so map | 1187 // Any valid map page offset must lie in the object area of the page, so map |
1184 // page offsets less than Page::kObjectStartOffset are invalid. We use a | 1188 // page offsets less than Page::kObjectStartOffset are invalid. We use a |
1185 // pair of distinguished invalid map encodings (for single word and multiple | 1189 // pair of distinguished invalid map encodings (for single word and multiple |
1186 // words) to indicate free regions in the page found during computation of | 1190 // words) to indicate free regions in the page found during computation of |
1187 // forwarding addresses and skipped over in subsequent sweeps. | 1191 // forwarding addresses and skipped over in subsequent sweeps. |
1188 static const uint32_t kSingleFreeEncoding = 0; | |
1189 static const uint32_t kMultiFreeEncoding = 1; | |
1190 | 1192 |
1191 | 1193 |
1192 // Encode a free region, defined by the given start address and size, in the | 1194 // Encode a free region, defined by the given start address and size, in the |
1193 // first word or two of the region. | 1195 // first word or two of the region. |
1194 void EncodeFreeRegion(Address free_start, int free_size) { | 1196 void EncodeFreeRegion(Address free_start, int free_size) { |
1195 ASSERT(free_size >= kIntSize); | 1197 ASSERT(free_size >= kIntSize); |
1196 if (free_size == kIntSize) { | 1198 if (free_size == kIntSize) { |
1197 Memory::uint32_at(free_start) = kSingleFreeEncoding; | 1199 Memory::uint32_at(free_start) = MarkCompactCollector::kSingleFreeEncoding; |
1198 } else { | 1200 } else { |
1199 ASSERT(free_size >= 2 * kIntSize); | 1201 ASSERT(free_size >= 2 * kIntSize); |
1200 Memory::uint32_at(free_start) = kMultiFreeEncoding; | 1202 Memory::uint32_at(free_start) = MarkCompactCollector::kMultiFreeEncoding; |
1201 Memory::int_at(free_start + kIntSize) = free_size; | 1203 Memory::int_at(free_start + kIntSize) = free_size; |
1202 } | 1204 } |
1203 | 1205 |
1204 #ifdef DEBUG | 1206 #ifdef DEBUG |
1205 // Zap the body of the free region. | 1207 // Zap the body of the free region. |
1206 if (FLAG_enable_slow_asserts) { | 1208 if (FLAG_enable_slow_asserts) { |
1207 for (int offset = 2 * kIntSize; | 1209 for (int offset = 2 * kIntSize; |
1208 offset < free_size; | 1210 offset < free_size; |
1209 offset += kPointerSize) { | 1211 offset += kPointerSize) { |
1210 Memory::Address_at(free_start + offset) = kZapValue; | 1212 Memory::Address_at(free_start + offset) = kZapValue; |
(...skipping 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2664 } | 2666 } |
2665 | 2667 |
2666 | 2668 |
2667 void MarkCompactCollector::Initialize() { | 2669 void MarkCompactCollector::Initialize() { |
2668 StaticPointersToNewGenUpdatingVisitor::Initialize(); | 2670 StaticPointersToNewGenUpdatingVisitor::Initialize(); |
2669 StaticMarkingVisitor::Initialize(); | 2671 StaticMarkingVisitor::Initialize(); |
2670 } | 2672 } |
2671 | 2673 |
2672 | 2674 |
2673 } } // namespace v8::internal | 2675 } } // namespace v8::internal |
OLD | NEW |