From: erik.corry@gmail.com Date: Wed, 2 May 2012 12:58:40 +0000 (+0000) Subject: Enable code flushing even when objects were marked incrementally, X-Git-Tag: upstream/4.7.83~16768 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd3c2c028f58e1b3a72b9ec84e9367df9149c861;p=platform%2Fupstream%2Fv8.git Enable code flushing even when objects were marked incrementally, since the incremental visitor is setting the gc_age fields correctly. This means the ResetSharedFunctionInfoCountersDuringIncrementalMarking test passes even if it hits a marking stack overflow. Review URL: https://chromiumcodereview.appspot.com/10258001 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11481 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mark-compact.cc b/src/mark-compact.cc index 9818da7..507ad84 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -1397,6 +1397,12 @@ class StaticMarkingVisitor : public StaticVisitorBase { static void VisitSharedFunctionInfoAndFlushCode(Map* map, HeapObject* object) { + Heap* heap = map->GetHeap(); + SharedFunctionInfo* shared = reinterpret_cast(object); + if (shared->ic_age() != heap->global_ic_age()) { + shared->ResetForNewContext(heap->global_ic_age()); + } + MarkCompactCollector* collector = map->GetHeap()->mark_compact_collector(); if (!collector->is_code_flushing_enabled()) { VisitSharedFunctionInfoGeneric(map, object); @@ -1413,10 +1419,6 @@ class StaticMarkingVisitor : public StaticVisitorBase { if (shared->IsInobjectSlackTrackingInProgress()) shared->DetachInitialMap(); - if (shared->ic_age() != heap->global_ic_age()) { - shared->ResetForNewContext(heap->global_ic_age()); - } - if (!known_flush_code_candidate) { known_flush_code_candidate = IsFlushable(heap, shared); if (known_flush_code_candidate) { @@ -1975,6 +1977,7 @@ static inline int MarkWordToObjectStarts(uint32_t mark_bits, int* starts); static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque, Page* p) { + ASSERT(!marking_deque->IsFull()); ASSERT(strcmp(Marking::kWhiteBitPattern, "00") == 0); ASSERT(strcmp(Marking::kBlackBitPattern, "10") == 0); ASSERT(strcmp(Marking::kGreyBitPattern, "11") == 0); diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc index 3946340..72079dc 100644 --- a/test/cctest/test-heap.cc +++ b/test/cctest/test-heap.cc @@ -1214,7 +1214,9 @@ TEST(TestSizeOfObjects) { // The heap size should go back to initial size after a full GC, even // though sweeping didn't finish yet. HEAP->CollectAllGarbage(Heap::kNoGCFlags); - CHECK(!HEAP->old_pointer_space()->IsSweepingComplete()); + + // Normally sweeping would not be complete here, but no guarantees. + CHECK_EQ(initial_size, static_cast(HEAP->SizeOfObjects())); // Advancing the sweeper step-wise should not change the heap size. @@ -1649,6 +1651,15 @@ TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { while (!marking->IsStopped() && !marking->IsComplete()) { marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); } + if (!marking->IsStopped() || marking->should_hurry()) { + // We don't normally finish a GC via Step(), we normally finish by + // setting the stack guard and then do the final steps in the stack + // guard interrupt. But here we didn't ask for that, and there is no + // JS code running to trigger the interrupt, so we explicitly finalize + // here. + HEAP->CollectAllGarbage(Heap::kNoGCFlags, + "Test finalizing incremental mark-sweep"); + } CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age()); CHECK_EQ(0, f->shared()->opt_count());