Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 89f1b61281a40fc709a63b2b3bbb137f2b6ddcf1..87c8b28f4b504bc187a6b14b1f8ef39085b7cec7 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -1321,7 +1321,26 @@ bool Heap::PerformGarbageCollection( |
MinorMarkCompact(); |
break; |
case SCAVENGER: |
+#ifdef VERIFY_HEAP |
+ std::vector<HeapObject*> objects_in_to_space; |
+ if (FLAG_verify_minor_mc_marking) { |
+ objects_in_to_space = mark_compact_collector()->GetObjectsInToSpace(); |
+ mark_compact_collector()->MarkYoungGenerationForVerification(); |
+ isolate()->global_handles()->ResetNewSpaceHandlesForTesting(); |
+ } |
+#endif // VERIFY_HEAP |
Scavenge(); |
+#ifdef VERIFY_HEAP |
+ if (FLAG_verify_minor_mc_marking) { |
+ mark_compact_collector() |
+ ->VerifyYoungGenerationMarkbitsUsingForwardingPointers( |
+ objects_in_to_space); |
+ for (Page* p : NewSpacePageRange(new_space()->FromSpaceStart(), |
+ new_space()->FromSpaceEnd())) { |
+ p->ClearLiveness(); |
+ } |
+ } |
+#endif // VERIFY_HEAP |
break; |
} |
@@ -1502,21 +1521,6 @@ static bool IsUnscavengedHeapObject(Heap* heap, Object** p) { |
!HeapObject::cast(*p)->map_word().IsForwardingAddress(); |
} |
- |
-static bool IsUnmodifiedHeapObject(Object** p) { |
- Object* object = *p; |
- if (object->IsSmi()) return false; |
- HeapObject* heap_object = HeapObject::cast(object); |
- if (!object->IsJSObject()) return false; |
- JSObject* js_object = JSObject::cast(object); |
- if (!js_object->WasConstructedFromApiFunction()) return false; |
- JSFunction* constructor = |
- JSFunction::cast(js_object->map()->GetConstructor()); |
- |
- return constructor->initial_map() == heap_object->map(); |
-} |
- |
- |
void PromotionQueue::Initialize() { |
// The last to-space page may be used for promotion queue. On promotion |
// conflict, we use the emergency stack. |
@@ -1691,8 +1695,10 @@ void Heap::Scavenge() { |
isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending( |
&IsUnscavengedHeapObject); |
- isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots( |
- &scavenge_visitor); |
+ isolate() |
+ ->global_handles() |
+ ->IterateNewSpaceWeakUnmodifiedRoots<GlobalHandles::HANDLE_PHANTOM_NODES>( |
+ &scavenge_visitor); |
new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
UpdateNewSpaceReferencesInExternalStringTable( |
@@ -2904,6 +2910,18 @@ bool Heap::RootCanBeTreatedAsConstant(RootListIndex root_index) { |
!InNewSpace(root(root_index)); |
} |
+bool Heap::IsUnmodifiedHeapObject(Object** p) { |
+ Object* object = *p; |
+ if (object->IsSmi()) return false; |
+ HeapObject* heap_object = HeapObject::cast(object); |
+ if (!object->IsJSObject()) return false; |
+ JSObject* js_object = JSObject::cast(object); |
+ if (!js_object->WasConstructedFromApiFunction()) return false; |
+ JSFunction* constructor = |
+ JSFunction::cast(js_object->map()->GetConstructor()); |
+ |
+ return constructor->initial_map() == heap_object->map(); |
+} |
int Heap::FullSizeNumberStringCacheLength() { |
// Compute the size of the number string cache based on the max newspace size. |