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

Side by Side Diff: src/heap/heap.cc

Issue 1358703003: Changed scavenge GC to collect unmodified references (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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
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/heap/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after
1444 } 1444 }
1445 } 1445 }
1446 1446
1447 1447
1448 static bool IsUnscavengedHeapObject(Heap* heap, Object** p) { 1448 static bool IsUnscavengedHeapObject(Heap* heap, Object** p) {
1449 return heap->InNewSpace(*p) && 1449 return heap->InNewSpace(*p) &&
1450 !HeapObject::cast(*p)->map_word().IsForwardingAddress(); 1450 !HeapObject::cast(*p)->map_word().IsForwardingAddress();
1451 } 1451 }
1452 1452
1453 1453
1454 static bool IsUnModifiedNewSpaceObject(Object** p) {
1455 Object* object = *p;
1456 if (object->IsHeapObject()) {
1457 HeapObject* heap_object = reinterpret_cast<HeapObject*>(object);
1458 if (!heap_object->GetIsolate()->heap()->InFromSpace(heap_object))
jochen (gone - plz use gerrit) 2015/09/21 11:33:25 if (!IsUnscavengedHeapObject(..)) return true;
1459 return true;
1460 if (heap_object->map()->GetBackPointer()->IsUndefined()) return true;
jochen (gone - plz use gerrit) 2015/09/21 11:54:19 maybe this is the wrong check? Try heap_object->ma
1461 return false;
1462 }
1463 return true;
1464 }
1465
1466
1454 void Heap::ScavengeStoreBufferCallback(Heap* heap, MemoryChunk* page, 1467 void Heap::ScavengeStoreBufferCallback(Heap* heap, MemoryChunk* page,
1455 StoreBufferEvent event) { 1468 StoreBufferEvent event) {
1456 heap->store_buffer_rebuilder_.Callback(page, event); 1469 heap->store_buffer_rebuilder_.Callback(page, event);
1457 } 1470 }
1458 1471
1459 1472
1460 void PromotionQueue::Initialize() { 1473 void PromotionQueue::Initialize() {
1461 // The last to-space page may be used for promotion queue. On promotion 1474 // The last to-space page may be used for promotion queue. On promotion
1462 // conflict, we use the emergency stack. 1475 // conflict, we use the emergency stack.
1463 DCHECK((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) == 1476 DCHECK((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) ==
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 if (collector->is_code_flushing_enabled()) { 1613 if (collector->is_code_flushing_enabled()) {
1601 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); 1614 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor);
1602 } 1615 }
1603 } 1616 }
1604 1617
1605 { 1618 {
1606 GCTracer::Scope gc_scope(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); 1619 GCTracer::Scope gc_scope(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE);
1607 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); 1620 new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
1608 } 1621 }
1609 1622
1610 { 1623 if (FLAG_scavenge_remove_unmodified_objects) {
1624 isolate()->global_handles()->IterateNewSpaceWeakRoots(
1625 &scavenge_visitor, &IsUnModifiedNewSpaceObject);
1626 new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
1627 } else {
1611 GCTracer::Scope gc_scope(tracer(), 1628 GCTracer::Scope gc_scope(tracer(),
1612 GCTracer::Scope::SCAVENGER_OBJECT_GROUPS); 1629 GCTracer::Scope::SCAVENGER_OBJECT_GROUPS);
1613 while (isolate()->global_handles()->IterateObjectGroups( 1630 while (isolate()->global_handles()->IterateObjectGroups(
1614 &scavenge_visitor, &IsUnscavengedHeapObject)) { 1631 &scavenge_visitor, &IsUnscavengedHeapObject)) {
1615 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); 1632 new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
1616 } 1633 }
1617 isolate()->global_handles()->RemoveObjectGroups(); 1634 isolate()->global_handles()->RemoveObjectGroups();
1618 isolate()->global_handles()->RemoveImplicitRefGroups(); 1635 isolate()->global_handles()->RemoveImplicitRefGroups();
1619 } 1636 }
1620 1637
(...skipping 4484 matching lines...) Expand 10 before | Expand all | Expand 10 after
6105 } 6122 }
6106 6123
6107 6124
6108 // static 6125 // static
6109 int Heap::GetStaticVisitorIdForMap(Map* map) { 6126 int Heap::GetStaticVisitorIdForMap(Map* map) {
6110 return StaticVisitorBase::GetVisitorId(map); 6127 return StaticVisitorBase::GetVisitorId(map);
6111 } 6128 }
6112 6129
6113 } // namespace internal 6130 } // namespace internal
6114 } // namespace v8 6131 } // namespace v8
OLDNEW
« src/global-handles.cc ('K') | « src/global-handles.cc ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698