1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/utils/address-map.h" 6 #include "src/execution/isolate.h" 7 #include "src/heap/heap.h" 8 #include "src/objects/heap-object-inl.h" 9 #include "src/objects/objects-inl.h" 10 11 namespace v8 { 12 namespace internal { 13 RootIndexMap(Isolate * isolate)14RootIndexMap::RootIndexMap(Isolate* isolate) { 15 map_ = isolate->root_index_map(); 16 if (map_ != nullptr) return; 17 map_ = new HeapObjectToIndexHashMap(); 18 for (RootIndex root_index = RootIndex::kFirstStrongOrReadOnlyRoot; 19 root_index <= RootIndex::kLastStrongOrReadOnlyRoot; ++root_index) { 20 Object root = isolate->root(root_index); 21 if (!root.IsHeapObject()) continue; 22 // Omit root entries that can be written after initialization. They must 23 // not be referenced through the root list in the snapshot. 24 // Since we map the raw address of an root item to its root list index, the 25 // raw address must be constant, i.e. the object must be immovable. 26 if (RootsTable::IsImmortalImmovable(root_index)) { 27 HeapObject heap_object = HeapObject::cast(root); 28 Maybe<uint32_t> maybe_index = map_->Get(heap_object); 29 uint32_t index = static_cast<uint32_t>(root_index); 30 if (maybe_index.IsJust()) { 31 // Some are initialized to a previous value in the root list. 32 DCHECK_LT(maybe_index.FromJust(), index); 33 } else { 34 map_->Set(heap_object, index); 35 } 36 } 37 } 38 isolate->set_root_index_map(map_); 39 } 40 Lookup(Address obj,RootIndex * out_root_list) const41bool RootIndexMap::Lookup(Address obj, RootIndex* out_root_list) const { 42 return Lookup(HeapObject::cast(Object(obj)), out_root_list); 43 } 44 45 } // namespace internal 46 } // namespace v8 47