Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
index 376e848..c250b90 100644
--- a/src/heap/incremental-marking.cc
+++ b/src/heap/incremental-marking.cc
@@ -279,7 +279,7 @@
if (IsMarking() && Marking::IsBlack(Marking::MarkBitFrom(object))) {
Page* page = Page::FromAddress(object->address());
if ((page->owner() != nullptr) && (page->owner()->identity() == LO_SPACE)) {
- // IterateBlackObject requires us to visit the hole object.
+ // IterateBlackObject requires us to visit the whole object.
page->ResetProgressBar();
}
IncrementalMarkingMarkingVisitor::IterateBody(object->map(), object);
@@ -353,7 +353,7 @@
NewSpace* space) {
NewSpacePageIterator it(space);
while (it.has_next()) {
- NewSpacePage* p = it.next();
+ Page* p = it.next();
SetNewSpacePageFlags(p, false);
}
}
@@ -366,7 +366,7 @@
DeactivateIncrementalWriteBarrierForSpace(heap_->new_space());
LargePage* lop = heap_->lo_space()->first_page();
- while (lop->is_valid()) {
+ while (LargePage::IsValid(lop)) {
SetOldSpacePageFlags(lop, false, false);
lop = lop->next_page();
}
@@ -385,7 +385,7 @@
void IncrementalMarking::ActivateIncrementalWriteBarrier(NewSpace* space) {
NewSpacePageIterator it(space->ToSpaceStart(), space->ToSpaceEnd());
while (it.has_next()) {
- NewSpacePage* p = it.next();
+ Page* p = it.next();
SetNewSpacePageFlags(p, true);
}
}
@@ -398,7 +398,7 @@
ActivateIncrementalWriteBarrier(heap_->new_space());
LargePage* lop = heap_->lo_space()->first_page();
- while (lop->is_valid()) {
+ while (LargePage::IsValid(lop)) {
SetOldSpacePageFlags(lop, true, is_compacting_);
lop = lop->next_page();
}
@@ -558,12 +558,6 @@
heap_->CompletelyClearInstanceofCache();
heap_->isolate()->compilation_cache()->MarkCompactPrologue();
- if (FLAG_cleanup_code_caches_at_gc) {
- // We will mark cache black with a separate pass
- // when we finish marking.
- MarkObjectGreyDoNotEnqueue(heap_->polymorphic_code_cache());
- }
-
// Mark strong roots grey.
IncrementalMarkingRootMarkingVisitor visitor(this);
heap_->IterateStrongRoots(&visitor, VISIT_ONLY_STRONG);
@@ -605,6 +599,7 @@
void IncrementalMarking::MarkObjectGroups() {
+ DCHECK(!heap_->UsingEmbedderHeapTracer());
DCHECK(!finalize_marking_completed_);
DCHECK(IsMarking());
@@ -735,7 +730,9 @@
// 4) Remove weak cell with live values from the list of weak cells, they
// do not need processing during GC.
MarkRoots();
- MarkObjectGroups();
+ if (!heap_->UsingEmbedderHeapTracer()) {
+ MarkObjectGroups();
+ }
if (incremental_marking_finalization_rounds_ == 0) {
// Map retaining is needed for perfromance, not correctness,
// so we can do it only once at the beginning of the finalization.
@@ -932,13 +929,6 @@
}
}
- if (FLAG_cleanup_code_caches_at_gc) {
- PolymorphicCodeCache* poly_cache = heap_->polymorphic_code_cache();
- Marking::GreyToBlack(Marking::MarkBitFrom(poly_cache));
- MemoryChunk::IncrementLiveBytesFromGC(poly_cache,
- PolymorphicCodeCache::kSize);
- }
-
Object* context = heap_->native_contexts_list();
while (!context->IsUndefined()) {
// GC can happen when the context is not fully initialized,
@@ -952,7 +942,7 @@
MemoryChunk::IncrementLiveBytesFromGC(cache, cache->Size());
}
}
- context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK);
+ context = Context::cast(context)->next_context_link();
}
}
@@ -1130,6 +1120,18 @@
}
}
+void IncrementalMarking::FinalizeSweeping() {
+ DCHECK(state_ == SWEEPING);
+ if (heap_->mark_compact_collector()->sweeping_in_progress() &&
+ (heap_->mark_compact_collector()->sweeper().IsSweepingCompleted() ||
+ !FLAG_concurrent_sweeping)) {
+ heap_->mark_compact_collector()->EnsureSweepingCompleted();
+ }
+ if (!heap_->mark_compact_collector()->sweeping_in_progress()) {
+ bytes_scanned_ = 0;
+ StartMarking();
+ }
+}
intptr_t IncrementalMarking::Step(intptr_t allocated_bytes,
CompletionAction action,
@@ -1179,17 +1181,11 @@
bytes_scanned_ += bytes_to_process;
+ // TODO(hpayer): Do not account for sweeping finalization while marking.
if (state_ == SWEEPING) {
- if (heap_->mark_compact_collector()->sweeping_in_progress() &&
- (heap_->mark_compact_collector()->IsSweepingCompleted() ||
- !FLAG_concurrent_sweeping)) {
- heap_->mark_compact_collector()->EnsureSweepingCompleted();
- }
- if (!heap_->mark_compact_collector()->sweeping_in_progress()) {
- bytes_scanned_ = 0;
- StartMarking();
- }
+ FinalizeSweeping();
}
+
if (state_ == MARKING) {
bytes_processed = ProcessMarkingDeque(bytes_to_process);
if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) {