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
10namespace v8 {
11namespace internal {
12
13RootIndexMap::RootIndexMap(Isolate* isolate) {
14  map_ = isolate->root_index_map();
15  if (map_ != NULL) return;
16  map_ = new HeapObjectToIndexHashMap();
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      Maybe<uint32_t> maybe_index = map_->Get(heap_object);
26      if (maybe_index.IsJust()) {
27        // Some are initialized to a previous value in the root list.
28        DCHECK_LT(maybe_index.FromJust(), i);
29      } else {
30        map_->Set(heap_object, 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