• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/address-map.h"
6 #include "src/heap/heap.h"
7 #include "src/isolate.h"
8 #include "src/objects-inl.h"
9 
10 namespace v8 {
11 namespace internal {
12 
RootIndexMap(Isolate * isolate)13 RootIndexMap::RootIndexMap(Isolate* isolate) {
14   map_ = isolate->root_index_map();
15   if (map_ != NULL) return;
16   map_ = new base::HashMap(base::HashMap::PointersMatch);
17   for (uint32_t i = 0; i < Heap::kStrongRootListLength; i++) {
18     Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i);
19     Object* root = isolate->heap()->root(root_index);
20     if (!root->IsHeapObject()) continue;
21     // Omit root entries that can be written after initialization. They must
22     // not be referenced through the root list in the snapshot.
23     if (isolate->heap()->RootCanBeTreatedAsConstant(root_index)) {
24       HeapObject* heap_object = HeapObject::cast(root);
25       base::HashMap::Entry* entry = LookupEntry(map_, heap_object, false);
26       if (entry != NULL) {
27         // Some are initialized to a previous value in the root list.
28         DCHECK_LT(GetValue(entry), i);
29       } else {
30         SetValue(LookupEntry(map_, heap_object, true), i);
31       }
32     } else {
33       // Immortal immovable root objects are constant and allocated on the first
34       // page of old space. Non-constant roots cannot be immortal immovable. The
35       // root index map contains all immortal immmovable root objects.
36       CHECK(!Heap::RootIsImmortalImmovable(root_index));
37     }
38   }
39   isolate->set_root_index_map(map_);
40 }
41 
42 }  // namespace internal
43 }  // namespace v8
44