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

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

Issue 301553003: Make incremental marker post-process JSWeakCollection. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Hide some visitor functions. Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « src/incremental-marking.cc ('k') | src/objects-visiting.h » ('j') | 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 "v8.h" 5 #include "v8.h"
6 6
7 #include "code-stubs.h" 7 #include "code-stubs.h"
8 #include "compilation-cache.h" 8 #include "compilation-cache.h"
9 #include "cpu-profiler.h" 9 #include "cpu-profiler.h"
10 #include "deoptimizer.h" 10 #include "deoptimizer.h"
(...skipping 1454 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 if (!o->IsHeapObject()) continue; 1465 if (!o->IsHeapObject()) continue;
1466 collector->RecordSlot(start, p, o); 1466 collector->RecordSlot(start, p, o);
1467 HeapObject* obj = HeapObject::cast(o); 1467 HeapObject* obj = HeapObject::cast(o);
1468 MarkBit mark = Marking::MarkBitFrom(obj); 1468 MarkBit mark = Marking::MarkBitFrom(obj);
1469 if (mark.Get()) continue; 1469 if (mark.Get()) continue;
1470 VisitUnmarkedObject(collector, obj); 1470 VisitUnmarkedObject(collector, obj);
1471 } 1471 }
1472 return true; 1472 return true;
1473 } 1473 }
1474 1474
1475 static void VisitWeakCollection(Map* map, HeapObject* object) {
1476 MarkCompactCollector* collector = map->GetHeap()->mark_compact_collector();
1477 JSWeakCollection* weak_collection =
1478 reinterpret_cast<JSWeakCollection*>(object);
1479
1480 // Enqueue weak map in linked list of encountered weak maps.
1481 if (weak_collection->next() == Smi::FromInt(0)) {
1482 weak_collection->set_next(collector->encountered_weak_collections());
1483 collector->set_encountered_weak_collections(weak_collection);
1484 }
1485
1486 // Skip visiting the backing hash table containing the mappings.
1487 int object_size = JSWeakCollection::BodyDescriptor::SizeOf(map, object);
1488 BodyVisitorBase<MarkCompactMarkingVisitor>::IteratePointers(
1489 map->GetHeap(),
1490 object,
1491 JSWeakCollection::BodyDescriptor::kStartOffset,
1492 JSWeakCollection::kTableOffset);
1493 BodyVisitorBase<MarkCompactMarkingVisitor>::IteratePointers(
1494 map->GetHeap(),
1495 object,
1496 JSWeakCollection::kTableOffset + kPointerSize,
1497 object_size);
1498
1499 // Mark the backing hash table without pushing it on the marking stack.
1500 Object* table_object = weak_collection->table();
1501 if (!table_object->IsHashTable()) return;
1502 WeakHashTable* table = WeakHashTable::cast(table_object);
1503 Object** table_slot =
1504 HeapObject::RawField(weak_collection, JSWeakCollection::kTableOffset);
1505 MarkBit table_mark = Marking::MarkBitFrom(table);
1506 collector->RecordSlot(table_slot, table_slot, table);
1507 if (!table_mark.Get()) collector->SetMark(table, table_mark);
1508 // Recording the map slot can be skipped, because maps are not compacted.
1509 collector->MarkObject(table->map(), Marking::MarkBitFrom(table->map()));
1510 ASSERT(MarkCompactCollector::IsMarked(table->map()));
1511 }
1512
1513 private: 1475 private:
1514 template<int id> 1476 template<int id>
1515 static inline void TrackObjectStatsAndVisit(Map* map, HeapObject* obj); 1477 static inline void TrackObjectStatsAndVisit(Map* map, HeapObject* obj);
1516 1478
1517 // Code flushing support. 1479 // Code flushing support.
1518 1480
1519 static const int kRegExpCodeThreshold = 5; 1481 static const int kRegExpCodeThreshold = 5;
1520 1482
1521 static void UpdateRegExpCodeAgeAndFlush(Heap* heap, 1483 static void UpdateRegExpCodeAgeAndFlush(Heap* heap,
1522 JSRegExp* re, 1484 JSRegExp* re,
(...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
2809 HeapObject::cast(weak_collection_obj))); 2771 HeapObject::cast(weak_collection_obj)));
2810 JSWeakCollection* weak_collection = 2772 JSWeakCollection* weak_collection =
2811 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); 2773 reinterpret_cast<JSWeakCollection*>(weak_collection_obj);
2812 ObjectHashTable* table = ObjectHashTable::cast(weak_collection->table()); 2774 ObjectHashTable* table = ObjectHashTable::cast(weak_collection->table());
2813 for (int i = 0; i < table->Capacity(); i++) { 2775 for (int i = 0; i < table->Capacity(); i++) {
2814 if (!MarkCompactCollector::IsMarked(HeapObject::cast(table->KeyAt(i)))) { 2776 if (!MarkCompactCollector::IsMarked(HeapObject::cast(table->KeyAt(i)))) {
2815 table->RemoveEntry(i); 2777 table->RemoveEntry(i);
2816 } 2778 }
2817 } 2779 }
2818 weak_collection_obj = weak_collection->next(); 2780 weak_collection_obj = weak_collection->next();
2819 weak_collection->set_next(Smi::FromInt(0)); 2781 weak_collection->set_next(heap()->undefined_value());
2820 } 2782 }
2821 set_encountered_weak_collections(Smi::FromInt(0)); 2783 set_encountered_weak_collections(Smi::FromInt(0));
2822 } 2784 }
2823 2785
2824 2786
2825 // We scavange new space simultaneously with sweeping. This is done in two 2787 // We scavange new space simultaneously with sweeping. This is done in two
2826 // passes. 2788 // passes.
2827 // 2789 //
2828 // The first pass migrates all alive objects from one semispace to another or 2790 // The first pass migrates all alive objects from one semispace to another or
2829 // promotes them to old space. Forwarding address is written directly into 2791 // promotes them to old space. Forwarding address is written directly into
(...skipping 1671 matching lines...) Expand 10 before | Expand all | Expand 10 after
4501 while (buffer != NULL) { 4463 while (buffer != NULL) {
4502 SlotsBuffer* next_buffer = buffer->next(); 4464 SlotsBuffer* next_buffer = buffer->next();
4503 DeallocateBuffer(buffer); 4465 DeallocateBuffer(buffer);
4504 buffer = next_buffer; 4466 buffer = next_buffer;
4505 } 4467 }
4506 *buffer_address = NULL; 4468 *buffer_address = NULL;
4507 } 4469 }
4508 4470
4509 4471
4510 } } // namespace v8::internal 4472 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/incremental-marking.cc ('k') | src/objects-visiting.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698