Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: src/address-map.h

Issue 2490783004: [serializer] small fixes for blink snapshot. (Closed)
Patch Set: rebase and fix Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | src/address-map.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_ADDRESS_MAP_H_ 5 #ifndef V8_ADDRESS_MAP_H_
6 #define V8_ADDRESS_MAP_H_ 6 #define V8_ADDRESS_MAP_H_
7 7
8 #include "include/v8.h"
8 #include "src/assert-scope.h" 9 #include "src/assert-scope.h"
9 #include "src/base/hashmap.h" 10 #include "src/base/hashmap.h"
10 #include "src/objects.h" 11 #include "src/objects.h"
11 12
12 namespace v8 { 13 namespace v8 {
13 namespace internal { 14 namespace internal {
14 15
15 class AddressMapBase { 16 template <typename Type>
16 protected: 17 class PointerToIndexHashMap
17 static void SetValue(base::HashMap::Entry* entry, uint32_t v) { 18 : public base::TemplateHashMapImpl<uintptr_t, uint32_t,
18 entry->value = reinterpret_cast<void*>(v); 19 base::KeyEqualityMatcher<intptr_t>,
20 base::DefaultAllocationPolicy> {
21 public:
22 typedef base::TemplateHashMapEntry<uintptr_t, uint32_t> Entry;
23
24 inline void Set(Type value, uint32_t index) {
25 uintptr_t key = Key(value);
26 LookupOrInsert(key, Hash(key))->value = index;
19 } 27 }
20 28
21 static uint32_t GetValue(base::HashMap::Entry* entry) { 29 inline Maybe<uint32_t> Get(Type value) const {
22 return static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); 30 uintptr_t key = Key(value);
23 } 31 Entry* entry = Lookup(key, Hash(key));
24 32 if (entry == nullptr) return Nothing<uint32_t>();
25 inline static base::HashMap::Entry* LookupEntry(base::HashMap* map, 33 return Just(entry->value);
26 HeapObject* obj,
27 bool insert) {
28 if (insert) {
29 map->LookupOrInsert(Key(obj), Hash(obj));
30 }
31 return map->Lookup(Key(obj), Hash(obj));
32 } 34 }
33 35
34 private: 36 private:
35 static uint32_t Hash(HeapObject* obj) { 37 static uintptr_t Key(Type value) {
36 return static_cast<int32_t>(reinterpret_cast<intptr_t>(obj->address())); 38 return reinterpret_cast<uintptr_t>(value);
37 } 39 }
38 40
39 static void* Key(HeapObject* obj) { 41 static uint32_t Hash(uintptr_t key) {
40 return reinterpret_cast<void*>(obj->address()); 42 return static_cast<uint32_t>(key >> kPointerSizeLog2);
41 } 43 }
42 }; 44 };
43 45
44 class RootIndexMap : public AddressMapBase { 46 class AddressToIndexHashMap : public PointerToIndexHashMap<Address> {};
47 class HeapObjectToIndexHashMap : public PointerToIndexHashMap<HeapObject*> {};
48
49 class RootIndexMap {
45 public: 50 public:
46 explicit RootIndexMap(Isolate* isolate); 51 explicit RootIndexMap(Isolate* isolate);
47 52
48 static const int kInvalidRootIndex = -1; 53 static const int kInvalidRootIndex = -1;
49 54
50 int Lookup(HeapObject* obj) { 55 int Lookup(HeapObject* obj) {
51 base::HashMap::Entry* entry = LookupEntry(map_, obj, false); 56 Maybe<uint32_t> maybe_index = map_->Get(obj);
52 if (entry) return GetValue(entry); 57 return maybe_index.IsJust() ? maybe_index.FromJust() : kInvalidRootIndex;
53 return kInvalidRootIndex;
54 } 58 }
55 59
56 private: 60 private:
57 base::HashMap* map_; 61 HeapObjectToIndexHashMap* map_;
58 62
59 DISALLOW_COPY_AND_ASSIGN(RootIndexMap); 63 DISALLOW_COPY_AND_ASSIGN(RootIndexMap);
60 }; 64 };
61 65
62 class SerializerReference { 66 class SerializerReference {
63 public: 67 public:
64 SerializerReference() : bitfield_(Special(kInvalidValue)) {} 68 SerializerReference() : bitfield_(Special(kInvalidValue)) {}
65 69
66 static SerializerReference FromBitfield(uint32_t bitfield) { 70 static SerializerReference FromBitfield(uint32_t bitfield) {
67 return SerializerReference(bitfield); 71 return SerializerReference(bitfield);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 class SpaceBits : public BitField<int, kValueIndexSize, kSpaceTagSize> {}; 183 class SpaceBits : public BitField<int, kValueIndexSize, kSpaceTagSize> {};
180 STATIC_ASSERT(SpaceBits::kNext == 32); 184 STATIC_ASSERT(SpaceBits::kNext == 32);
181 185
182 uint32_t bitfield_; 186 uint32_t bitfield_;
183 187
184 friend class SerializerReferenceMap; 188 friend class SerializerReferenceMap;
185 }; 189 };
186 190
187 // Mapping objects to their location after deserialization. 191 // Mapping objects to their location after deserialization.
188 // This is used during building, but not at runtime by V8. 192 // This is used during building, but not at runtime by V8.
189 class SerializerReferenceMap : public AddressMapBase { 193 class SerializerReferenceMap {
190 public: 194 public:
191 SerializerReferenceMap() 195 SerializerReferenceMap()
192 : no_allocation_(), map_(), attached_reference_index_(0) {} 196 : no_allocation_(), map_(), attached_reference_index_(0) {}
193 197
194 SerializerReference Lookup(HeapObject* obj) { 198 SerializerReference Lookup(HeapObject* obj) {
195 base::HashMap::Entry* entry = LookupEntry(&map_, obj, false); 199 Maybe<uint32_t> maybe_index = map_.Get(obj);
196 return entry ? SerializerReference(GetValue(entry)) : SerializerReference(); 200 return maybe_index.IsJust() ? SerializerReference(maybe_index.FromJust())
201 : SerializerReference();
197 } 202 }
198 203
199 void Add(HeapObject* obj, SerializerReference b) { 204 void Add(HeapObject* obj, SerializerReference b) {
200 DCHECK(b.is_valid()); 205 DCHECK(b.is_valid());
201 DCHECK_NULL(LookupEntry(&map_, obj, false)); 206 DCHECK(map_.Get(obj).IsNothing());
202 base::HashMap::Entry* entry = LookupEntry(&map_, obj, true); 207 map_.Set(obj, b.bitfield_);
203 SetValue(entry, b.bitfield_);
204 } 208 }
205 209
206 SerializerReference AddAttachedReference(HeapObject* attached_reference) { 210 SerializerReference AddAttachedReference(HeapObject* attached_reference) {
207 SerializerReference reference = 211 SerializerReference reference =
208 SerializerReference::AttachedReference(attached_reference_index_++); 212 SerializerReference::AttachedReference(attached_reference_index_++);
209 Add(attached_reference, reference); 213 Add(attached_reference, reference);
210 return reference; 214 return reference;
211 } 215 }
212 216
213 private: 217 private:
214 DisallowHeapAllocation no_allocation_; 218 DisallowHeapAllocation no_allocation_;
215 base::HashMap map_; 219 HeapObjectToIndexHashMap map_;
216 int attached_reference_index_; 220 int attached_reference_index_;
217 DISALLOW_COPY_AND_ASSIGN(SerializerReferenceMap); 221 DISALLOW_COPY_AND_ASSIGN(SerializerReferenceMap);
218 }; 222 };
219 223
220 } // namespace internal 224 } // namespace internal
221 } // namespace v8 225 } // namespace v8
222 226
223 #endif // V8_ADDRESS_MAP_H_ 227 #endif // V8_ADDRESS_MAP_H_
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/address-map.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698