Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(627)

Side by Side Diff: src/heap/mark-compact.cc

Issue 1267313002: Retire ShortCircuitConsString. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 1194
1195 1195
1196 MarkCompactCollector::~MarkCompactCollector() { 1196 MarkCompactCollector::~MarkCompactCollector() {
1197 if (code_flusher_ != NULL) { 1197 if (code_flusher_ != NULL) {
1198 delete code_flusher_; 1198 delete code_flusher_;
1199 code_flusher_ = NULL; 1199 code_flusher_ = NULL;
1200 } 1200 }
1201 } 1201 }
1202 1202
1203 1203
1204 static inline HeapObject* ShortCircuitConsString(Object** p) {
1205 // Optimization: If the heap object pointed to by p is a non-internalized
1206 // cons string whose right substring is HEAP->empty_string, update
1207 // it in place to its left substring. Return the updated value.
1208 //
1209 // Here we assume that if we change *p, we replace it with a heap object
1210 // (i.e., the left substring of a cons string is always a heap object).
1211 //
1212 // The check performed is:
1213 // object->IsConsString() && !object->IsInternalizedString() &&
1214 // (ConsString::cast(object)->second() == HEAP->empty_string())
1215 // except the maps for the object and its possible substrings might be
1216 // marked.
1217 HeapObject* object = HeapObject::cast(*p);
1218 Map* map = object->map();
1219 InstanceType type = map->instance_type();
1220 if (!IsShortcutCandidate(type)) return object;
1221
1222 Object* second = reinterpret_cast<ConsString*>(object)->second();
1223 Heap* heap = map->GetHeap();
1224 if (second != heap->empty_string()) {
1225 return object;
1226 }
1227
1228 // Since we don't have the object's start, it is impossible to update the
1229 // page dirty marks. Therefore, we only replace the string with its left
1230 // substring when page dirty marks do not change.
1231 Object* first = reinterpret_cast<ConsString*>(object)->first();
1232 if (!heap->InNewSpace(object) && heap->InNewSpace(first)) return object;
1233
1234 *p = first;
1235 return HeapObject::cast(first);
1236 }
1237
1238
1239 class MarkCompactMarkingVisitor 1204 class MarkCompactMarkingVisitor
1240 : public StaticMarkingVisitor<MarkCompactMarkingVisitor> { 1205 : public StaticMarkingVisitor<MarkCompactMarkingVisitor> {
1241 public: 1206 public:
1242 static void ObjectStatsVisitBase(StaticVisitorBase::VisitorId id, Map* map, 1207 static void ObjectStatsVisitBase(StaticVisitorBase::VisitorId id, Map* map,
1243 HeapObject* obj); 1208 HeapObject* obj);
1244 1209
1245 static void ObjectStatsCountFixedArray( 1210 static void ObjectStatsCountFixedArray(
1246 FixedArrayBase* fixed_array, FixedArraySubInstanceType fast_type, 1211 FixedArrayBase* fixed_array, FixedArraySubInstanceType fast_type,
1247 FixedArraySubInstanceType dictionary_type); 1212 FixedArraySubInstanceType dictionary_type);
1248 1213
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 heap->mark_compact_collector()->SetMark(object, mark_bit); 1251 heap->mark_compact_collector()->SetMark(object, mark_bit);
1287 return true; 1252 return true;
1288 } 1253 }
1289 return false; 1254 return false;
1290 } 1255 }
1291 1256
1292 // Mark object pointed to by p. 1257 // Mark object pointed to by p.
1293 INLINE(static void MarkObjectByPointer(MarkCompactCollector* collector, 1258 INLINE(static void MarkObjectByPointer(MarkCompactCollector* collector,
1294 HeapObject* object, Object** p)) { 1259 HeapObject* object, Object** p)) {
1295 if (!(*p)->IsHeapObject()) return; 1260 if (!(*p)->IsHeapObject()) return;
1296 HeapObject* target_object = ShortCircuitConsString(p); 1261 HeapObject* target_object = HeapObject::cast(*p);
1297 collector->RecordSlot(object, p, target_object); 1262 collector->RecordSlot(object, p, target_object);
1298 MarkBit mark = Marking::MarkBitFrom(target_object); 1263 MarkBit mark = Marking::MarkBitFrom(target_object);
1299 collector->MarkObject(target_object, mark); 1264 collector->MarkObject(target_object, mark);
1300 } 1265 }
1301 1266
1302 1267
1303 // Visit an unmarked object. 1268 // Visit an unmarked object.
1304 INLINE(static void VisitUnmarkedObject(MarkCompactCollector* collector, 1269 INLINE(static void VisitUnmarkedObject(MarkCompactCollector* collector,
1305 HeapObject* obj)) { 1270 HeapObject* obj)) {
1306 #ifdef DEBUG 1271 #ifdef DEBUG
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1664 1629
1665 // Skip the weak next code link in a code object, which is visited in 1630 // Skip the weak next code link in a code object, which is visited in
1666 // ProcessTopOptimizedFrame. 1631 // ProcessTopOptimizedFrame.
1667 void VisitNextCodeLink(Object** p) {} 1632 void VisitNextCodeLink(Object** p) {}
1668 1633
1669 private: 1634 private:
1670 void MarkObjectByPointer(Object** p) { 1635 void MarkObjectByPointer(Object** p) {
1671 if (!(*p)->IsHeapObject()) return; 1636 if (!(*p)->IsHeapObject()) return;
1672 1637
1673 // Replace flat cons strings in place. 1638 // Replace flat cons strings in place.
1674 HeapObject* object = ShortCircuitConsString(p); 1639 HeapObject* object = HeapObject::cast(*p);
1675 MarkBit mark_bit = Marking::MarkBitFrom(object); 1640 MarkBit mark_bit = Marking::MarkBitFrom(object);
1676 if (Marking::IsBlackOrGrey(mark_bit)) return; 1641 if (Marking::IsBlackOrGrey(mark_bit)) return;
1677 1642
1678 Map* map = object->map(); 1643 Map* map = object->map();
1679 // Mark the object. 1644 // Mark the object.
1680 collector_->SetMark(object, mark_bit); 1645 collector_->SetMark(object, mark_bit);
1681 1646
1682 // Mark the map pointer and body, and push them on the marking stack. 1647 // Mark the map pointer and body, and push them on the marking stack.
1683 MarkBit map_mark = Marking::MarkBitFrom(map); 1648 MarkBit map_mark = Marking::MarkBitFrom(map);
1684 collector_->MarkObject(map, map_mark); 1649 collector_->MarkObject(map, map_mark);
(...skipping 3116 matching lines...) Expand 10 before | Expand all | Expand 10 after
4801 SlotsBuffer* buffer = *buffer_address; 4766 SlotsBuffer* buffer = *buffer_address;
4802 while (buffer != NULL) { 4767 while (buffer != NULL) {
4803 SlotsBuffer* next_buffer = buffer->next(); 4768 SlotsBuffer* next_buffer = buffer->next();
4804 DeallocateBuffer(buffer); 4769 DeallocateBuffer(buffer);
4805 buffer = next_buffer; 4770 buffer = next_buffer;
4806 } 4771 }
4807 *buffer_address = NULL; 4772 *buffer_address = NULL;
4808 } 4773 }
4809 } // namespace internal 4774 } // namespace internal
4810 } // namespace v8 4775 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698