Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 456fc34fc8cf8601d5902937d3451cc8a0205a58..779c86846856e452fc312ec94517f6bfdd29f607 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -4907,29 +4907,84 @@ bool Heap::InSpace(Address addr, AllocationSpace space) { |
} |
-bool Heap::RootIsImmortalImmovable(int root_index) { |
- switch (root_index) { |
-#define CASE(name) \ |
- case Heap::k##name##RootIndex: \ |
- return true; |
- IMMORTAL_IMMOVABLE_ROOT_LIST(CASE); |
-#undef CASE |
+// static |
+bool Heap::RootIsImmortalImmovable(RootListIndex index) { |
+ // Heap roots that are known to be immortal immovable, for which we can safely |
+ // skip write barriers. This list is not complete and has omissions. |
+ switch (index) { |
+ case Heap::kByteArrayMapRootIndex: |
+ case Heap::kFreeSpaceMapRootIndex: |
+ case Heap::kOnePointerFillerMapRootIndex: |
+ case Heap::kTwoPointerFillerMapRootIndex: |
+ case Heap::kUndefinedValueRootIndex: |
+ case Heap::kTheHoleValueRootIndex: |
+ case Heap::kNullValueRootIndex: |
+ case Heap::kTrueValueRootIndex: |
+ case Heap::kFalseValueRootIndex: |
+ case Heap::kUninitializedValueRootIndex: |
+ case Heap::kCellMapRootIndex: |
+ case Heap::kGlobalPropertyCellMapRootIndex: |
+ case Heap::kSharedFunctionInfoMapRootIndex: |
+ case Heap::kMetaMapRootIndex: |
+ case Heap::kHeapNumberMapRootIndex: |
+ case Heap::kMutableHeapNumberMapRootIndex: |
+ case Heap::kFloat32x4MapRootIndex: |
+ case Heap::kNativeContextMapRootIndex: |
+ case Heap::kFixedArrayMapRootIndex: |
+ case Heap::kCodeMapRootIndex: |
+ case Heap::kScopeInfoMapRootIndex: |
+ case Heap::kFixedCOWArrayMapRootIndex: |
+ case Heap::kFixedDoubleArrayMapRootIndex: |
+ case Heap::kWeakCellMapRootIndex: |
+ case Heap::kNoInterceptorResultSentinelRootIndex: |
+ case Heap::kHashTableMapRootIndex: |
+ case Heap::kOrderedHashTableMapRootIndex: |
+ case Heap::kEmptyFixedArrayRootIndex: |
+ case Heap::kEmptyByteArrayRootIndex: |
+ case Heap::kEmptyDescriptorArrayRootIndex: |
+ case Heap::kArgumentsMarkerRootIndex: |
+ case Heap::kSymbolMapRootIndex: |
+ case Heap::kSloppyArgumentsElementsMapRootIndex: |
+ case Heap::kFunctionContextMapRootIndex: |
+ case Heap::kCatchContextMapRootIndex: |
+ case Heap::kWithContextMapRootIndex: |
+ case Heap::kBlockContextMapRootIndex: |
+ case Heap::kModuleContextMapRootIndex: |
+ case Heap::kScriptContextMapRootIndex: |
+ case Heap::kUndefinedMapRootIndex: |
+ case Heap::kTheHoleMapRootIndex: |
+ case Heap::kNullMapRootIndex: |
+ case Heap::kBooleanMapRootIndex: |
+ case Heap::kUninitializedMapRootIndex: |
+ case Heap::kArgumentsMarkerMapRootIndex: |
+ case Heap::kJSMessageObjectMapRootIndex: |
+ case Heap::kForeignMapRootIndex: |
+ case Heap::kNeanderMapRootIndex: |
+ case Heap::kempty_stringRootIndex: |
+#define STRING_INDEX_DECLARATION(Name, str) case Heap::k##Name##RootIndex: |
+ INTERNALIZED_STRING_LIST(STRING_INDEX_DECLARATION) |
+#undef STRING_INDEX_DECLARATION |
+#define SYMBOL_INDEX_DECLARATION(Name) case Heap::k##Name##RootIndex: |
+ PRIVATE_SYMBOL_LIST(SYMBOL_INDEX_DECLARATION) |
+#undef SYMBOL_INDEX_DECLARATION |
+#define STRING_TYPE_INDEX_DECLARATION(NAME, size, name, Name) \ |
+ case Heap::k##Name##MapRootIndex: |
+ STRING_TYPE_LIST(STRING_TYPE_INDEX_DECLARATION) |
+#undef STRING_TYPE_INDEX_DECLARATION |
+ return true; |
default: |
return false; |
} |
} |
-bool Heap::GetRootListIndex(Handle<HeapObject> object, |
- Heap::RootListIndex* index_return) { |
- Object* ptr = *object; |
-#define IMMORTAL_IMMOVABLE_ROOT(Name) \ |
- if (ptr == roots_[Heap::k##Name##RootIndex]) { \ |
- *index_return = k##Name##RootIndex; \ |
- return true; \ |
+bool Heap::GetRootListIndex(Object* object, RootListIndex* index_return) const { |
+ for (size_t i = 0; i < arraysize(roots_); ++i) { |
+ if (roots_[i] == object) { |
+ *index_return = static_cast<RootListIndex>(i); |
+ return true; |
+ } |
} |
- IMMORTAL_IMMOVABLE_ROOT_LIST(IMMORTAL_IMMOVABLE_ROOT) |
-#undef IMMORTAL_IMMOVABLE_ROOT |
return false; |
} |