• 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 HashMap(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     // Omit root entries that can be written after initialization. They must
21     // not be referenced through the root list in the snapshot.
22     if (root->IsHeapObject() &&
23         isolate->heap()->RootCanBeTreatedAsConstant(root_index)) {
24       HeapObject* heap_object = HeapObject::cast(root);
25       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     }
33   }
34   isolate->set_root_index_map(map_);
35 }
36 
37 }  // namespace internal
38 }  // namespace v8
39