| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 HashMap encodings_; | 72 HashMap encodings_; |
| 73 static uint32_t Hash(Address key) { | 73 static uint32_t Hash(Address key) { |
| 74 return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key) >> 2); | 74 return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key) >> 2); |
| 75 } | 75 } |
| 76 | 76 |
| 77 int IndexOf(Address key) const; | 77 int IndexOf(Address key) const; |
| 78 | 78 |
| 79 static bool Match(void* key1, void* key2) { return key1 == key2; } | 79 static bool Match(void* key1, void* key2) { return key1 == key2; } |
| 80 | 80 |
| 81 void Put(Address key, int index); | 81 void Put(Address key, int index); |
| 82 |
| 83 Isolate* isolate_; |
| 82 }; | 84 }; |
| 83 | 85 |
| 84 | 86 |
| 85 class ExternalReferenceDecoder { | 87 class ExternalReferenceDecoder { |
| 86 public: | 88 public: |
| 87 ExternalReferenceDecoder(); | 89 ExternalReferenceDecoder(); |
| 88 ~ExternalReferenceDecoder(); | 90 ~ExternalReferenceDecoder(); |
| 89 | 91 |
| 90 Address Decode(uint32_t key) const { | 92 Address Decode(uint32_t key) const { |
| 91 if (key == 0) return NULL; | 93 if (key == 0) return NULL; |
| 92 return *Lookup(key); | 94 return *Lookup(key); |
| 93 } | 95 } |
| 94 | 96 |
| 95 private: | 97 private: |
| 96 Address** encodings_; | 98 Address** encodings_; |
| 97 | 99 |
| 98 Address* Lookup(uint32_t key) const { | 100 Address* Lookup(uint32_t key) const { |
| 99 int type = key >> kReferenceTypeShift; | 101 int type = key >> kReferenceTypeShift; |
| 100 ASSERT(kFirstTypeCode <= type && type < kTypeCodeCount); | 102 ASSERT(kFirstTypeCode <= type && type < kTypeCodeCount); |
| 101 int id = key & kReferenceIdMask; | 103 int id = key & kReferenceIdMask; |
| 102 return &encodings_[type][id]; | 104 return &encodings_[type][id]; |
| 103 } | 105 } |
| 104 | 106 |
| 105 void Put(uint32_t key, Address value) { | 107 void Put(uint32_t key, Address value) { |
| 106 *Lookup(key) = value; | 108 *Lookup(key) = value; |
| 107 } | 109 } |
| 110 |
| 111 Isolate* isolate_; |
| 108 }; | 112 }; |
| 109 | 113 |
| 110 | 114 |
| 111 class SnapshotByteSource { | 115 class SnapshotByteSource { |
| 112 public: | 116 public: |
| 113 SnapshotByteSource(const byte* array, int length) | 117 SnapshotByteSource(const byte* array, int length) |
| 114 : data_(array), length_(length), position_(0) { } | 118 : data_(array), length_(length), position_(0) { } |
| 115 | 119 |
| 116 bool HasMore() { return position_ < length_; } | 120 bool HasMore() { return position_ < length_; } |
| 117 | 121 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 137 }; | 141 }; |
| 138 | 142 |
| 139 | 143 |
| 140 // It is very common to have a reference to objects at certain offsets in the | 144 // It is very common to have a reference to objects at certain offsets in the |
| 141 // heap. These offsets have been determined experimentally. We code | 145 // heap. These offsets have been determined experimentally. We code |
| 142 // references to such objects in a single byte that encodes the way the pointer | 146 // references to such objects in a single byte that encodes the way the pointer |
| 143 // is written (only plain pointers allowed), the space number and the offset. | 147 // is written (only plain pointers allowed), the space number and the offset. |
| 144 // This only works for objects in the first page of a space. Don't use this for | 148 // This only works for objects in the first page of a space. Don't use this for |
| 145 // things in newspace since it bypasses the write barrier. | 149 // things in newspace since it bypasses the write barrier. |
| 146 | 150 |
| 147 static const int k64 = (sizeof(uintptr_t) - 4) / 4; | 151 RLYSTC const int k64 = (sizeof(uintptr_t) - 4) / 4; |
| 148 | 152 |
| 149 #define COMMON_REFERENCE_PATTERNS(f) \ | 153 #define COMMON_REFERENCE_PATTERNS(f) \ |
| 150 f(kNumberOfSpaces, 2, (11 - k64)) \ | 154 f(kNumberOfSpaces, 2, (11 - k64)) \ |
| 151 f((kNumberOfSpaces + 1), 2, 0) \ | 155 f((kNumberOfSpaces + 1), 2, 0) \ |
| 152 f((kNumberOfSpaces + 2), 2, (142 - 16 * k64)) \ | 156 f((kNumberOfSpaces + 2), 2, (142 - 16 * k64)) \ |
| 153 f((kNumberOfSpaces + 3), 2, (74 - 15 * k64)) \ | 157 f((kNumberOfSpaces + 3), 2, (74 - 15 * k64)) \ |
| 154 f((kNumberOfSpaces + 4), 2, 5) \ | 158 f((kNumberOfSpaces + 4), 2, 5) \ |
| 155 f((kNumberOfSpaces + 5), 1, 135) \ | 159 f((kNumberOfSpaces + 5), 1, 135) \ |
| 156 f((kNumberOfSpaces + 6), 2, (228 - 39 * k64)) | 160 f((kNumberOfSpaces + 6), 2, (228 - 39 * k64)) |
| 157 | 161 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 170 f(12, 24) \ | 174 f(12, 24) \ |
| 171 f(13, 28) \ | 175 f(13, 28) \ |
| 172 f(14, 32) \ | 176 f(14, 32) \ |
| 173 f(15, 36) | 177 f(15, 36) |
| 174 | 178 |
| 175 // The Serializer/Deserializer class is a common superclass for Serializer and | 179 // The Serializer/Deserializer class is a common superclass for Serializer and |
| 176 // Deserializer which is used to store common constants and methods used by | 180 // Deserializer which is used to store common constants and methods used by |
| 177 // both. | 181 // both. |
| 178 class SerializerDeserializer: public ObjectVisitor { | 182 class SerializerDeserializer: public ObjectVisitor { |
| 179 public: | 183 public: |
| 180 static void Iterate(ObjectVisitor* visitor); | 184 RLYSTC void Iterate(ObjectVisitor* visitor); |
| 181 static void SetSnapshotCacheSize(int size); | 185 RLYSTC void SetSnapshotCacheSize(int size); |
| 182 | 186 |
| 183 protected: | 187 protected: |
| 184 // Where the pointed-to object can be found: | 188 // Where the pointed-to object can be found: |
| 185 enum Where { | 189 enum Where { |
| 186 kNewObject = 0, // Object is next in snapshot. | 190 kNewObject = 0, // Object is next in snapshot. |
| 187 // 1-8 One per space. | 191 // 1-8 One per space. |
| 188 kRootArray = 0x9, // Object is found in root array. | 192 kRootArray = 0x9, // Object is found in root array. |
| 189 kPartialSnapshotCache = 0xa, // Object is in the cache. | 193 kPartialSnapshotCache = 0xa, // Object is in the cache. |
| 190 kExternalReference = 0xb, // Pointer to an external reference. | 194 kExternalReference = 0xb, // Pointer to an external reference. |
| 191 // 0xc-0xf Free. | 195 // 0xc-0xf Free. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 209 | 213 |
| 210 // Where to point within the object. | 214 // Where to point within the object. |
| 211 enum WhereToPoint { | 215 enum WhereToPoint { |
| 212 kStartOfObject = 0, | 216 kStartOfObject = 0, |
| 213 kFirstInstruction = 0x80, | 217 kFirstInstruction = 0x80, |
| 214 kWhereToPointMask = 0x80 | 218 kWhereToPointMask = 0x80 |
| 215 }; | 219 }; |
| 216 | 220 |
| 217 // Misc. | 221 // Misc. |
| 218 // Raw data to be copied from the snapshot. | 222 // Raw data to be copied from the snapshot. |
| 219 static const int kRawData = 0x30; | 223 RLYSTC const int kRawData = 0x30; |
| 220 // Some common raw lengths: 0x31-0x3f | 224 // Some common raw lengths: 0x31-0x3f |
| 221 // A tag emitted at strategic points in the snapshot to delineate sections. | 225 // A tag emitted at strategic points in the snapshot to delineate sections. |
| 222 // If the deserializer does not find these at the expected moments then it | 226 // If the deserializer does not find these at the expected moments then it |
| 223 // is an indication that the snapshot and the VM do not fit together. | 227 // is an indication that the snapshot and the VM do not fit together. |
| 224 // Examine the build process for architecture, version or configuration | 228 // Examine the build process for architecture, version or configuration |
| 225 // mismatches. | 229 // mismatches. |
| 226 static const int kSynchronize = 0x70; | 230 RLYSTC const int kSynchronize = 0x70; |
| 227 // Used for the source code of the natives, which is in the executable, but | 231 // Used for the source code of the natives, which is in the executable, but |
| 228 // is referred to from external strings in the snapshot. | 232 // is referred to from external strings in the snapshot. |
| 229 static const int kNativesStringResource = 0x71; | 233 RLYSTC const int kNativesStringResource = 0x71; |
| 230 static const int kNewPage = 0x72; | 234 RLYSTC const int kNewPage = 0x72; |
| 231 // 0x73-0x7f Free. | 235 // 0x73-0x7f Free. |
| 232 // 0xb0-0xbf Free. | 236 // 0xb0-0xbf Free. |
| 233 // 0xf0-0xff Free. | 237 // 0xf0-0xff Free. |
| 234 | 238 |
| 235 | 239 |
| 236 static const int kLargeData = LAST_SPACE; | 240 RLYSTC const int kLargeData = LAST_SPACE; |
| 237 static const int kLargeCode = kLargeData + 1; | 241 RLYSTC const int kLargeCode = kLargeData + 1; |
| 238 static const int kLargeFixedArray = kLargeCode + 1; | 242 RLYSTC const int kLargeFixedArray = kLargeCode + 1; |
| 239 static const int kNumberOfSpaces = kLargeFixedArray + 1; | 243 RLYSTC const int kNumberOfSpaces = kLargeFixedArray + 1; |
| 240 static const int kAnyOldSpace = -1; | 244 RLYSTC const int kAnyOldSpace = -1; |
| 241 | 245 |
| 242 // A bitmask for getting the space out of an instruction. | 246 // A bitmask for getting the space out of an instruction. |
| 243 static const int kSpaceMask = 15; | 247 RLYSTC const int kSpaceMask = 15; |
| 244 | 248 |
| 245 static inline bool SpaceIsLarge(int space) { return space >= kLargeData; } | 249 RLYSTC inline bool SpaceIsLarge(int space) { return space >= kLargeData; } |
| 246 static inline bool SpaceIsPaged(int space) { | 250 RLYSTC inline bool SpaceIsPaged(int space) { |
| 247 return space >= FIRST_PAGED_SPACE && space <= LAST_PAGED_SPACE; | 251 return space >= FIRST_PAGED_SPACE && space <= LAST_PAGED_SPACE; |
| 248 } | 252 } |
| 249 | |
| 250 static int partial_snapshot_cache_length_; | |
| 251 static const int kPartialSnapshotCacheCapacity = 1400; | |
| 252 static Object* partial_snapshot_cache_[]; | |
| 253 }; | 253 }; |
| 254 | 254 |
| 255 | 255 |
| 256 int SnapshotByteSource::GetInt() { | 256 int SnapshotByteSource::GetInt() { |
| 257 // A little unwind to catch the really small ints. | 257 // A little unwind to catch the really small ints. |
| 258 int snapshot_byte = Get(); | 258 int snapshot_byte = Get(); |
| 259 if ((snapshot_byte & 0x80) == 0) { | 259 if ((snapshot_byte & 0x80) == 0) { |
| 260 return snapshot_byte; | 260 return snapshot_byte; |
| 261 } | 261 } |
| 262 int accumulator = (snapshot_byte & 0x7f) << 7; | 262 int accumulator = (snapshot_byte & 0x7f) << 7; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { | 306 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { |
| 307 UNREACHABLE(); | 307 UNREACHABLE(); |
| 308 } | 308 } |
| 309 | 309 |
| 310 void ReadChunk(Object** start, Object** end, int space, Address address); | 310 void ReadChunk(Object** start, Object** end, int space, Address address); |
| 311 HeapObject* GetAddressFromStart(int space); | 311 HeapObject* GetAddressFromStart(int space); |
| 312 inline HeapObject* GetAddressFromEnd(int space); | 312 inline HeapObject* GetAddressFromEnd(int space); |
| 313 Address Allocate(int space_number, Space* space, int size); | 313 Address Allocate(int space_number, Space* space, int size); |
| 314 void ReadObject(int space_number, Space* space, Object** write_back); | 314 void ReadObject(int space_number, Space* space, Object** write_back); |
| 315 | 315 |
| 316 // Cached current isolate. |
| 317 Isolate* isolate_; |
| 318 |
| 316 // Keep track of the pages in the paged spaces. | 319 // Keep track of the pages in the paged spaces. |
| 317 // (In large object space we are keeping track of individual objects | 320 // (In large object space we are keeping track of individual objects |
| 318 // rather than pages.) In new space we just need the address of the | 321 // rather than pages.) In new space we just need the address of the |
| 319 // first object and the others will flow from that. | 322 // first object and the others will flow from that. |
| 320 List<Address> pages_[SerializerDeserializer::kNumberOfSpaces]; | 323 List<Address> pages_[SerializerDeserializer::kNumberOfSpaces]; |
| 321 | 324 |
| 322 SnapshotByteSource* source_; | 325 SnapshotByteSource* source_; |
| 323 static ExternalReferenceDecoder* external_reference_decoder_; | |
| 324 // This is the address of the next object that will be allocated in each | 326 // This is the address of the next object that will be allocated in each |
| 325 // space. It is used to calculate the addresses of back-references. | 327 // space. It is used to calculate the addresses of back-references. |
| 326 Address high_water_[LAST_SPACE + 1]; | 328 Address high_water_[LAST_SPACE + 1]; |
| 327 // This is the address of the most recent object that was allocated. It | 329 // This is the address of the most recent object that was allocated. It |
| 328 // is used to set the location of the new page when we encounter a | 330 // is used to set the location of the new page when we encounter a |
| 329 // START_NEW_PAGE_SERIALIZATION tag. | 331 // START_NEW_PAGE_SERIALIZATION tag. |
| 330 Address last_object_address_; | 332 Address last_object_address_; |
| 331 | 333 |
| 334 ExternalReferenceDecoder* external_reference_decoder_; |
| 335 |
| 332 DISALLOW_COPY_AND_ASSIGN(Deserializer); | 336 DISALLOW_COPY_AND_ASSIGN(Deserializer); |
| 333 }; | 337 }; |
| 334 | 338 |
| 335 | 339 |
| 336 class SnapshotByteSink { | 340 class SnapshotByteSink { |
| 337 public: | 341 public: |
| 338 virtual ~SnapshotByteSink() { } | 342 virtual ~SnapshotByteSink() { } |
| 339 virtual void Put(int byte, const char* description) = 0; | 343 virtual void Put(int byte, const char* description) = 0; |
| 340 virtual void PutSection(int byte, const char* description) { | 344 virtual void PutSection(int byte, const char* description) { |
| 341 Put(byte, description); | 345 Put(byte, description); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 369 } | 373 } |
| 370 | 374 |
| 371 void AddMapping(HeapObject* obj, int to) { | 375 void AddMapping(HeapObject* obj, int to) { |
| 372 ASSERT(!IsMapped(obj)); | 376 ASSERT(!IsMapped(obj)); |
| 373 HashMap::Entry* entry = | 377 HashMap::Entry* entry = |
| 374 serialization_map_->Lookup(Key(obj), Hash(obj), true); | 378 serialization_map_->Lookup(Key(obj), Hash(obj), true); |
| 375 entry->value = Value(to); | 379 entry->value = Value(to); |
| 376 } | 380 } |
| 377 | 381 |
| 378 private: | 382 private: |
| 379 static bool SerializationMatchFun(void* key1, void* key2) { | 383 RLYSTC bool SerializationMatchFun(void* key1, void* key2) { |
| 380 return key1 == key2; | 384 return key1 == key2; |
| 381 } | 385 } |
| 382 | 386 |
| 383 static uint32_t Hash(HeapObject* obj) { | 387 RLYSTC uint32_t Hash(HeapObject* obj) { |
| 384 return static_cast<int32_t>(reinterpret_cast<intptr_t>(obj->address())); | 388 return static_cast<int32_t>(reinterpret_cast<intptr_t>(obj->address())); |
| 385 } | 389 } |
| 386 | 390 |
| 387 static void* Key(HeapObject* obj) { | 391 RLYSTC void* Key(HeapObject* obj) { |
| 388 return reinterpret_cast<void*>(obj->address()); | 392 return reinterpret_cast<void*>(obj->address()); |
| 389 } | 393 } |
| 390 | 394 |
| 391 static void* Value(int v) { | 395 RLYSTC void* Value(int v) { |
| 392 return reinterpret_cast<void*>(v); | 396 return reinterpret_cast<void*>(v); |
| 393 } | 397 } |
| 394 | 398 |
| 395 HashMap* serialization_map_; | 399 HashMap* serialization_map_; |
| 396 AssertNoAllocation* no_allocation_; | 400 AssertNoAllocation* no_allocation_; |
| 397 DISALLOW_COPY_AND_ASSIGN(SerializationAddressMapper); | 401 DISALLOW_COPY_AND_ASSIGN(SerializationAddressMapper); |
| 398 }; | 402 }; |
| 399 | 403 |
| 400 | 404 |
| 401 class Serializer : public SerializerDeserializer { | 405 // There can be only one serializer per V8 process. |
| 406 STATIC_CLASS Serializer : public SerializerDeserializer { |
| 402 public: | 407 public: |
| 403 explicit Serializer(SnapshotByteSink* sink); | 408 explicit Serializer(SnapshotByteSink* sink); |
| 404 ~Serializer(); | 409 ~Serializer(); |
| 405 void VisitPointers(Object** start, Object** end); | 410 void VisitPointers(Object** start, Object** end); |
| 406 // You can call this after serialization to find out how much space was used | 411 // You can call this after serialization to find out how much space was used |
| 407 // in each space. | 412 // in each space. |
| 408 int CurrentAllocationAddress(int space) { | 413 int CurrentAllocationAddress(int space) { |
| 409 if (SpaceIsLarge(space)) return large_object_total_; | 414 if (SpaceIsLarge(space)) return large_object_total_; |
| 410 return fullness_[space]; | 415 return fullness_[space]; |
| 411 } | 416 } |
| 412 | 417 |
| 413 static void Enable() { | 418 RLYSTC void Enable() { |
| 414 if (!serialization_enabled_) { | 419 if (!serialization_enabled_) { |
| 415 ASSERT(!too_late_to_enable_now_); | 420 ASSERT(!too_late_to_enable_now_); |
| 416 } | 421 } |
| 417 serialization_enabled_ = true; | 422 serialization_enabled_ = true; |
| 418 } | 423 } |
| 419 | 424 |
| 420 static void Disable() { serialization_enabled_ = false; } | 425 RLYSTC void Disable() { serialization_enabled_ = false; } |
| 421 // Call this when you have made use of the fact that there is no serialization | 426 // Call this when you have made use of the fact that there is no serialization |
| 422 // going on. | 427 // going on. |
| 423 static void TooLateToEnableNow() { too_late_to_enable_now_ = true; } | 428 RLYSTC void TooLateToEnableNow() { too_late_to_enable_now_ = true; } |
| 424 static bool enabled() { return serialization_enabled_; } | 429 RLYSTC bool enabled() { return serialization_enabled_; } |
| 425 SerializationAddressMapper* address_mapper() { return &address_mapper_; } | 430 SerializationAddressMapper* address_mapper() { return &address_mapper_; } |
| 426 #ifdef DEBUG | 431 #ifdef DEBUG |
| 427 virtual void Synchronize(const char* tag); | 432 virtual void Synchronize(const char* tag); |
| 428 #endif | 433 #endif |
| 429 | 434 |
| 430 protected: | 435 protected: |
| 431 static const int kInvalidRootIndex = -1; | 436 RLYSTC const int kInvalidRootIndex = -1; |
| 432 virtual int RootIndex(HeapObject* heap_object) = 0; | 437 virtual int RootIndex(HeapObject* heap_object) = 0; |
| 433 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) = 0; | 438 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) = 0; |
| 434 | 439 |
| 435 class ObjectSerializer : public ObjectVisitor { | 440 class ObjectSerializer : public ObjectVisitor { |
| 436 public: | 441 public: |
| 437 ObjectSerializer(Serializer* serializer, | 442 ObjectSerializer(Serializer* serializer, |
| 438 Object* o, | 443 Object* o, |
| 439 SnapshotByteSink* sink, | 444 SnapshotByteSink* sink, |
| 440 HowToCode how_to_code, | 445 HowToCode how_to_code, |
| 441 WhereToPoint where_to_point) | 446 WhereToPoint where_to_point) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 void SerializeReferenceToPreviousObject( | 481 void SerializeReferenceToPreviousObject( |
| 477 int space, | 482 int space, |
| 478 int address, | 483 int address, |
| 479 HowToCode how_to_code, | 484 HowToCode how_to_code, |
| 480 WhereToPoint where_to_point); | 485 WhereToPoint where_to_point); |
| 481 void InitializeAllocators(); | 486 void InitializeAllocators(); |
| 482 // This will return the space for an object. If the object is in large | 487 // This will return the space for an object. If the object is in large |
| 483 // object space it may return kLargeCode or kLargeFixedArray in order | 488 // object space it may return kLargeCode or kLargeFixedArray in order |
| 484 // to indicate to the deserializer what kind of large object allocation | 489 // to indicate to the deserializer what kind of large object allocation |
| 485 // to make. | 490 // to make. |
| 486 static int SpaceOfObject(HeapObject* object); | 491 RLYSTC int SpaceOfObject(HeapObject* object); |
| 487 // This just returns the space of the object. It will return LO_SPACE | 492 // This just returns the space of the object. It will return LO_SPACE |
| 488 // for all large objects since you can't check the type of the object | 493 // for all large objects since you can't check the type of the object |
| 489 // once the map has been used for the serialization address. | 494 // once the map has been used for the serialization address. |
| 490 static int SpaceOfAlreadySerializedObject(HeapObject* object); | 495 RLYSTC int SpaceOfAlreadySerializedObject(HeapObject* object); |
| 491 int Allocate(int space, int size, bool* new_page_started); | 496 int Allocate(int space, int size, bool* new_page_started); |
| 492 int EncodeExternalReference(Address addr) { | 497 int EncodeExternalReference(Address addr) { |
| 493 return external_reference_encoder_->Encode(addr); | 498 return external_reference_encoder_->Encode(addr); |
| 494 } | 499 } |
| 495 | 500 |
| 496 // Keep track of the fullness of each space in order to generate | 501 // Keep track of the fullness of each space in order to generate |
| 497 // relative addresses for back references. Large objects are | 502 // relative addresses for back references. Large objects are |
| 498 // just numbered sequentially since relative addresses make no | 503 // just numbered sequentially since relative addresses make no |
| 499 // sense in large object space. | 504 // sense in large object space. |
| 500 int fullness_[LAST_SPACE + 1]; | 505 int fullness_[LAST_SPACE + 1]; |
| 501 SnapshotByteSink* sink_; | 506 SnapshotByteSink* sink_; |
| 502 int current_root_index_; | 507 int current_root_index_; |
| 503 ExternalReferenceEncoder* external_reference_encoder_; | 508 ExternalReferenceEncoder* external_reference_encoder_; |
| 504 static bool serialization_enabled_; | 509 RLYSTC bool serialization_enabled_; |
| 505 // Did we already make use of the fact that serialization was not enabled? | 510 // Did we already make use of the fact that serialization was not enabled? |
| 506 static bool too_late_to_enable_now_; | 511 RLYSTC bool too_late_to_enable_now_; |
| 507 int large_object_total_; | 512 int large_object_total_; |
| 508 SerializationAddressMapper address_mapper_; | 513 SerializationAddressMapper address_mapper_; |
| 509 | 514 |
| 510 friend class ObjectSerializer; | 515 friend class ObjectSerializer; |
| 511 friend class Deserializer; | 516 friend class Deserializer; |
| 512 | 517 |
| 513 DISALLOW_COPY_AND_ASSIGN(Serializer); | 518 DISALLOW_COPY_AND_ASSIGN(Serializer); |
| 514 }; | 519 }; |
| 515 | 520 |
| 516 | 521 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 532 virtual int RootIndex(HeapObject* o); | 537 virtual int RootIndex(HeapObject* o); |
| 533 virtual int PartialSnapshotCacheIndex(HeapObject* o); | 538 virtual int PartialSnapshotCacheIndex(HeapObject* o); |
| 534 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { | 539 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { |
| 535 // Scripts should be referred only through shared function infos. We can't | 540 // Scripts should be referred only through shared function infos. We can't |
| 536 // allow them to be part of the partial snapshot because they contain a | 541 // allow them to be part of the partial snapshot because they contain a |
| 537 // unique ID, and deserializing several partial snapshots containing script | 542 // unique ID, and deserializing several partial snapshots containing script |
| 538 // would cause dupes. | 543 // would cause dupes. |
| 539 ASSERT(!o->IsScript()); | 544 ASSERT(!o->IsScript()); |
| 540 return o->IsString() || o->IsSharedFunctionInfo() || | 545 return o->IsString() || o->IsSharedFunctionInfo() || |
| 541 o->IsHeapNumber() || o->IsCode() || | 546 o->IsHeapNumber() || o->IsCode() || |
| 542 o->map() == Heap::fixed_cow_array_map(); | 547 o->map() == HEAP->fixed_cow_array_map(); |
| 543 } | 548 } |
| 544 | 549 |
| 545 private: | 550 private: |
| 546 Serializer* startup_serializer_; | 551 Serializer* startup_serializer_; |
| 547 DISALLOW_COPY_AND_ASSIGN(PartialSerializer); | 552 DISALLOW_COPY_AND_ASSIGN(PartialSerializer); |
| 548 }; | 553 }; |
| 549 | 554 |
| 550 | 555 |
| 551 class StartupSerializer : public Serializer { | 556 class StartupSerializer : public Serializer { |
| 552 public: | 557 public: |
| 553 explicit StartupSerializer(SnapshotByteSink* sink) : Serializer(sink) { | 558 explicit StartupSerializer(SnapshotByteSink* sink) : Serializer(sink) { |
| 554 // Clear the cache of objects used by the partial snapshot. After the | 559 // Clear the cache of objects used by the partial snapshot. After the |
| 555 // strong roots have been serialized we can create a partial snapshot | 560 // strong roots have been serialized we can create a partial snapshot |
| 556 // which will repopulate the cache with objects neede by that partial | 561 // which will repopulate the cache with objects neede by that partial |
| 557 // snapshot. | 562 // snapshot. |
| 558 partial_snapshot_cache_length_ = 0; | 563 Isolate::Current()->set_serialize_partial_snapshot_cache_length(0); |
| 559 } | 564 } |
| 560 // Serialize the current state of the heap. The order is: | 565 // Serialize the current state of the heap. The order is: |
| 561 // 1) Strong references. | 566 // 1) Strong references. |
| 562 // 2) Partial snapshot cache. | 567 // 2) Partial snapshot cache. |
| 563 // 3) Weak references (eg the symbol table). | 568 // 3) Weak references (eg the symbol table). |
| 564 virtual void SerializeStrongReferences(); | 569 virtual void SerializeStrongReferences(); |
| 565 virtual void SerializeObject(Object* o, | 570 virtual void SerializeObject(Object* o, |
| 566 HowToCode how_to_code, | 571 HowToCode how_to_code, |
| 567 WhereToPoint where_to_point); | 572 WhereToPoint where_to_point); |
| 568 void SerializeWeakReferences(); | 573 void SerializeWeakReferences(); |
| 569 void Serialize() { | 574 void Serialize() { |
| 570 SerializeStrongReferences(); | 575 SerializeStrongReferences(); |
| 571 SerializeWeakReferences(); | 576 SerializeWeakReferences(); |
| 572 } | 577 } |
| 573 | 578 |
| 574 private: | 579 private: |
| 575 virtual int RootIndex(HeapObject* o) { return kInvalidRootIndex; } | 580 virtual int RootIndex(HeapObject* o) { return kInvalidRootIndex; } |
| 576 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { | 581 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { |
| 577 return false; | 582 return false; |
| 578 } | 583 } |
| 579 }; | 584 }; |
| 580 | 585 |
| 581 | 586 |
| 582 } } // namespace v8::internal | 587 } } // namespace v8::internal |
| 583 | 588 |
| 584 #endif // V8_SERIALIZE_H_ | 589 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |