| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_SERIALIZE_H_ | 5 #ifndef V8_SERIALIZE_H_ |
| 6 #define V8_SERIALIZE_H_ | 6 #define V8_SERIALIZE_H_ |
| 7 | 7 |
| 8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/hashmap.h" | 9 #include "src/hashmap.h" |
| 10 #include "src/heap-profiler.h" | 10 #include "src/heap-profiler.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 HashMap* map_; | 182 HashMap* map_; |
| 183 | 183 |
| 184 DISALLOW_COPY_AND_ASSIGN(RootIndexMap); | 184 DISALLOW_COPY_AND_ASSIGN(RootIndexMap); |
| 185 }; | 185 }; |
| 186 | 186 |
| 187 | 187 |
| 188 class BackReference { | 188 class BackReference { |
| 189 public: | 189 public: |
| 190 explicit BackReference(uint32_t bitfield) : bitfield_(bitfield) {} | 190 explicit BackReference(uint32_t bitfield) : bitfield_(bitfield) {} |
| 191 | 191 |
| 192 BackReference(AllocationSpace space, uint32_t chunk_index, | 192 BackReference() : bitfield_(kInvalidValue) {} |
| 193 uint32_t chunk_offset) { | 193 |
| 194 DCHECK(IsAligned(chunk_offset, kObjectAlignment)); | 194 static BackReference SourceReference() { return BackReference(kSourceValue); } |
| 195 bitfield_ = SpaceBits::encode(space) | ChunkIndexBits::encode(chunk_index) | | 195 |
| 196 ChunkOffsetBits::encode(chunk_offset >> kObjectAlignmentBits); | 196 static BackReference LargeObjectReference(uint32_t index) { |
| 197 return BackReference(SpaceBits::encode(LO_SPACE) | |
| 198 ChunkOffsetBits::encode(index)); |
| 197 } | 199 } |
| 198 | 200 |
| 199 BackReference() : bitfield_(kInvalidValue) {} | 201 static BackReference Reference(AllocationSpace space, uint32_t chunk_index, |
| 202 uint32_t chunk_offset) { |
| 203 DCHECK(IsAligned(chunk_offset, kObjectAlignment)); |
| 204 DCHECK_NE(LO_SPACE, space); |
| 205 return BackReference( |
| 206 SpaceBits::encode(space) | ChunkIndexBits::encode(chunk_index) | |
| 207 ChunkOffsetBits::encode(chunk_offset >> kObjectAlignmentBits)); |
| 208 } |
| 200 | 209 |
| 201 bool is_valid() const { return bitfield_ != kInvalidValue; } | 210 bool is_valid() const { return bitfield_ != kInvalidValue; } |
| 211 bool is_source() const { return bitfield_ == kSourceValue; } |
| 202 | 212 |
| 203 AllocationSpace space() const { | 213 AllocationSpace space() const { |
| 204 DCHECK(is_valid()); | 214 DCHECK(is_valid()); |
| 205 return SpaceBits::decode(bitfield_); | 215 return SpaceBits::decode(bitfield_); |
| 206 } | 216 } |
| 207 | 217 |
| 208 uint32_t chunk_offset() const { | 218 uint32_t chunk_offset() const { |
| 209 DCHECK(is_valid()); | 219 DCHECK(is_valid()); |
| 210 return ChunkOffsetBits::decode(bitfield_) << kObjectAlignmentBits; | 220 return ChunkOffsetBits::decode(bitfield_) << kObjectAlignmentBits; |
| 211 } | 221 } |
| 212 | 222 |
| 213 uint32_t chunk_index() const { | 223 uint32_t chunk_index() const { |
| 214 DCHECK(is_valid()); | 224 DCHECK(is_valid()); |
| 215 return ChunkIndexBits::decode(bitfield_); | 225 return ChunkIndexBits::decode(bitfield_); |
| 216 } | 226 } |
| 217 | 227 |
| 218 uint32_t reference() const { | 228 uint32_t reference() const { |
| 219 DCHECK(is_valid()); | 229 DCHECK(is_valid()); |
| 220 return bitfield_ & (ChunkOffsetBits::kMask | ChunkIndexBits::kMask); | 230 return bitfield_ & (ChunkOffsetBits::kMask | ChunkIndexBits::kMask); |
| 221 } | 231 } |
| 222 | 232 |
| 223 uint32_t bitfield() const { return bitfield_; } | 233 uint32_t bitfield() const { return bitfield_; } |
| 224 | 234 |
| 225 private: | 235 private: |
| 226 static const uint32_t kInvalidValue = 0xFFFFFFFF; | 236 static const uint32_t kInvalidValue = 0xFFFFFFFF; |
| 237 static const uint32_t kSourceValue = 0xFFFFFFFE; |
| 227 static const int kChunkOffsetSize = kPageSizeBits - kObjectAlignmentBits; | 238 static const int kChunkOffsetSize = kPageSizeBits - kObjectAlignmentBits; |
| 228 static const int kChunkIndexSize = 32 - kChunkOffsetSize - kSpaceTagSize; | 239 static const int kChunkIndexSize = 32 - kChunkOffsetSize - kSpaceTagSize; |
| 229 | 240 |
| 230 public: | 241 public: |
| 231 static const int kMaxChunkIndex = (1 << kChunkIndexSize) - 1; | 242 static const int kMaxChunkIndex = (1 << kChunkIndexSize) - 1; |
| 232 | 243 |
| 233 private: | 244 private: |
| 234 class ChunkOffsetBits : public BitField<uint32_t, 0, kChunkOffsetSize> {}; | 245 class ChunkOffsetBits : public BitField<uint32_t, 0, kChunkOffsetSize> {}; |
| 235 class ChunkIndexBits | 246 class ChunkIndexBits |
| 236 : public BitField<uint32_t, ChunkOffsetBits::kNext, kChunkIndexSize> {}; | 247 : public BitField<uint32_t, ChunkOffsetBits::kNext, kChunkIndexSize> {}; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 256 return entry ? BackReference(GetValue(entry)) : BackReference(); | 267 return entry ? BackReference(GetValue(entry)) : BackReference(); |
| 257 } | 268 } |
| 258 | 269 |
| 259 void Add(HeapObject* obj, BackReference b) { | 270 void Add(HeapObject* obj, BackReference b) { |
| 260 DCHECK(b.is_valid()); | 271 DCHECK(b.is_valid()); |
| 261 DCHECK_EQ(NULL, LookupEntry(map_, obj, false)); | 272 DCHECK_EQ(NULL, LookupEntry(map_, obj, false)); |
| 262 HashMap::Entry* entry = LookupEntry(map_, obj, true); | 273 HashMap::Entry* entry = LookupEntry(map_, obj, true); |
| 263 SetValue(entry, b.bitfield()); | 274 SetValue(entry, b.bitfield()); |
| 264 } | 275 } |
| 265 | 276 |
| 277 void AddSourceString(String* string) { |
| 278 Add(string, BackReference::SourceReference()); |
| 279 } |
| 280 |
| 266 private: | 281 private: |
| 267 DisallowHeapAllocation no_allocation_; | 282 DisallowHeapAllocation no_allocation_; |
| 268 HashMap* map_; | 283 HashMap* map_; |
| 269 DISALLOW_COPY_AND_ASSIGN(BackReferenceMap); | 284 DISALLOW_COPY_AND_ASSIGN(BackReferenceMap); |
| 270 }; | 285 }; |
| 271 | 286 |
| 272 | 287 |
| 273 // The Serializer/Deserializer class is a common superclass for Serializer and | 288 // The Serializer/Deserializer class is a common superclass for Serializer and |
| 274 // Deserializer which is used to store common constants and methods used by | 289 // Deserializer which is used to store common constants and methods used by |
| 275 // both. | 290 // both. |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 | 708 |
| 694 List<uint32_t>* stub_keys() { return &stub_keys_; } | 709 List<uint32_t>* stub_keys() { return &stub_keys_; } |
| 695 int num_internalized_strings() const { return num_internalized_strings_; } | 710 int num_internalized_strings() const { return num_internalized_strings_; } |
| 696 | 711 |
| 697 private: | 712 private: |
| 698 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, | 713 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, |
| 699 Code* main_code) | 714 Code* main_code) |
| 700 : Serializer(isolate, sink), | 715 : Serializer(isolate, sink), |
| 701 source_(source), | 716 source_(source), |
| 702 main_code_(main_code), | 717 main_code_(main_code), |
| 703 num_internalized_strings_(0) {} | 718 num_internalized_strings_(0) { |
| 719 back_reference_map_.AddSourceString(source); |
| 720 } |
| 704 | 721 |
| 705 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, | 722 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, |
| 706 WhereToPoint where_to_point, int skip); | 723 WhereToPoint where_to_point, int skip); |
| 707 | 724 |
| 708 void SerializeBuiltin(int builtin_index, HowToCode how_to_code, | 725 void SerializeBuiltin(int builtin_index, HowToCode how_to_code, |
| 709 WhereToPoint where_to_point); | 726 WhereToPoint where_to_point); |
| 710 void SerializeIC(Code* ic, HowToCode how_to_code, | 727 void SerializeIC(Code* ic, HowToCode how_to_code, |
| 711 WhereToPoint where_to_point); | 728 WhereToPoint where_to_point); |
| 712 void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, | 729 void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, |
| 713 WhereToPoint where_to_point); | 730 WhereToPoint where_to_point); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 // Following the header, we store, in sequential order | 844 // Following the header, we store, in sequential order |
| 828 // - code stub keys | 845 // - code stub keys |
| 829 // - serialization payload | 846 // - serialization payload |
| 830 | 847 |
| 831 ScriptData* script_data_; | 848 ScriptData* script_data_; |
| 832 bool owns_script_data_; | 849 bool owns_script_data_; |
| 833 }; | 850 }; |
| 834 } } // namespace v8::internal | 851 } } // namespace v8::internal |
| 835 | 852 |
| 836 #endif // V8_SERIALIZE_H_ | 853 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |