Line data Source code
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 :
13 4758992 : RootIndexMap::RootIndexMap(Isolate* isolate) {
14 4758992 : map_ = isolate->root_index_map();
15 9517985 : if (map_ != NULL) return;
16 48418 : map_ = new HeapObjectToIndexHashMap();
17 9902289 : 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 9878078 : 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 9783944 : if (isolate->heap()->RootCanBeTreatedAsConstant(root_index)) {
24 : HeapObject* heap_object = HeapObject::cast(root);
25 9393733 : Maybe<uint32_t> maybe_index = map_->Get(heap_object);
26 9393725 : 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 9393723 : 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 390215 : CHECK(!Heap::RootIsImmortalImmovable(root_index));
37 : }
38 : }
39 24211 : isolate->set_root_index_map(map_);
40 : }
41 :
42 : } // namespace internal
43 : } // namespace v8
|