V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
address-map.cc
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 RootIndexMap::RootIndexMap(Isolate* isolate) {
14  map_ = isolate->root_index_map();
15  if (map_ != nullptr) return;
16  map_ = new HeapObjectToIndexHashMap();
17  for (RootIndex root_index = RootIndex::kFirstStrongOrReadOnlyRoot;
18  root_index <= RootIndex::kLastStrongOrReadOnlyRoot; ++root_index) {
19  Object* root = isolate->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  // Since we map the raw address of an root item to its root list index, the
24  // raw address must be constant, i.e. the object must be immovable.
25  if (RootsTable::IsImmortalImmovable(root_index)) {
26  HeapObject* heap_object = HeapObject::cast(root);
27  Maybe<uint32_t> maybe_index = map_->Get(heap_object);
28  uint32_t index = static_cast<uint32_t>(root_index);
29  if (maybe_index.IsJust()) {
30  // Some are initialized to a previous value in the root list.
31  DCHECK_LT(maybe_index.FromJust(), index);
32  } else {
33  map_->Set(heap_object, index);
34  }
35  }
36  }
37  isolate->set_root_index_map(map_);
38 }
39 
40 } // namespace internal
41 } // namespace v8
Definition: libplatform.h:13