| 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 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 // And 15 common raw lengths. | 192 // And 15 common raw lengths. |
| 193 OBJECT_SERIALIZATION = 16, | 193 OBJECT_SERIALIZATION = 16, |
| 194 // One variant per space. | 194 // One variant per space. |
| 195 CODE_OBJECT_SERIALIZATION = 25, | 195 CODE_OBJECT_SERIALIZATION = 25, |
| 196 // One per space (only code spaces in use). | 196 // One per space (only code spaces in use). |
| 197 EXTERNAL_REFERENCE_SERIALIZATION = 34, | 197 EXTERNAL_REFERENCE_SERIALIZATION = 34, |
| 198 EXTERNAL_BRANCH_TARGET_SERIALIZATION = 35, | 198 EXTERNAL_BRANCH_TARGET_SERIALIZATION = 35, |
| 199 SYNCHRONIZE = 36, | 199 SYNCHRONIZE = 36, |
| 200 START_NEW_PAGE_SERIALIZATION = 37, | 200 START_NEW_PAGE_SERIALIZATION = 37, |
| 201 NATIVES_STRING_RESOURCE = 38, | 201 NATIVES_STRING_RESOURCE = 38, |
| 202 // Free: 39-47. | 202 ROOT_SERIALIZATION = 39, |
| 203 // Free: 40-47. |
| 203 BACKREF_SERIALIZATION = 48, | 204 BACKREF_SERIALIZATION = 48, |
| 204 // One per space, must be kSpaceMask aligned. | 205 // One per space, must be kSpaceMask aligned. |
| 205 // Free: 57-63. | 206 // Free: 57-63. |
| 206 REFERENCE_SERIALIZATION = 64, | 207 REFERENCE_SERIALIZATION = 64, |
| 207 // One per space and common references. Must be kSpaceMask aligned. | 208 // One per space and common references. Must be kSpaceMask aligned. |
| 208 CODE_BACKREF_SERIALIZATION = 80, | 209 CODE_BACKREF_SERIALIZATION = 80, |
| 209 // One per space, must be kSpaceMask aligned. | 210 // One per space, must be kSpaceMask aligned. |
| 210 // Free: 89-95. | 211 // Free: 89-95. |
| 211 CODE_REFERENCE_SERIALIZATION = 96 | 212 CODE_REFERENCE_SERIALIZATION = 96 |
| 212 // One per space, must be kSpaceMask aligned. | 213 // One per space, must be kSpaceMask aligned. |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 virtual void PutSection(int byte, const char* description) { | 287 virtual void PutSection(int byte, const char* description) { |
| 287 Put(byte, description); | 288 Put(byte, description); |
| 288 } | 289 } |
| 289 void PutInt(uintptr_t integer, const char* description); | 290 void PutInt(uintptr_t integer, const char* description); |
| 290 }; | 291 }; |
| 291 | 292 |
| 292 | 293 |
| 293 class Serializer : public SerDes { | 294 class Serializer : public SerDes { |
| 294 public: | 295 public: |
| 295 explicit Serializer(SnapshotByteSink* sink); | 296 explicit Serializer(SnapshotByteSink* sink); |
| 296 // Serialize the current state of the heap. This operation destroys the | 297 // Serialize the current state of the heap. |
| 297 // heap contents. | |
| 298 void Serialize(); | 298 void Serialize(); |
| 299 // Serialize a single object and the objects reachable from it. |
| 300 void SerializePartial(Object** obj); |
| 299 void VisitPointers(Object** start, Object** end); | 301 void VisitPointers(Object** start, Object** end); |
| 302 // You can call this after serialization to find out how much space was used |
| 303 // in each space. |
| 304 int CurrentAllocationAddress(int space) { |
| 305 if (SpaceIsLarge(space)) space = LO_SPACE; |
| 306 return fullness_[space]; |
| 307 } |
| 300 | 308 |
| 301 static void Enable() { | 309 static void Enable() { |
| 302 if (!serialization_enabled_) { | 310 if (!serialization_enabled_) { |
| 303 ASSERT(!too_late_to_enable_now_); | 311 ASSERT(!too_late_to_enable_now_); |
| 304 } | 312 } |
| 305 serialization_enabled_ = true; | 313 serialization_enabled_ = true; |
| 306 } | 314 } |
| 307 | 315 |
| 308 static void Disable() { serialization_enabled_ = false; } | 316 static void Disable() { serialization_enabled_ = false; } |
| 309 // Call this when you have made use of the fact that there is no serialization | 317 // Call this when you have made use of the fact that there is no serialization |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 // This will return the space for an object. If the object is in large | 367 // This will return the space for an object. If the object is in large |
| 360 // object space it may return kLargeCode or kLargeFixedArray in order | 368 // object space it may return kLargeCode or kLargeFixedArray in order |
| 361 // to indicate to the deserializer what kind of large object allocation | 369 // to indicate to the deserializer what kind of large object allocation |
| 362 // to make. | 370 // to make. |
| 363 static int SpaceOfObject(HeapObject* object); | 371 static int SpaceOfObject(HeapObject* object); |
| 364 // This just returns the space of the object. It will return LO_SPACE | 372 // This just returns the space of the object. It will return LO_SPACE |
| 365 // for all large objects since you can't check the type of the object | 373 // for all large objects since you can't check the type of the object |
| 366 // once the map has been used for the serialization address. | 374 // once the map has been used for the serialization address. |
| 367 static int SpaceOfAlreadySerializedObject(HeapObject* object); | 375 static int SpaceOfAlreadySerializedObject(HeapObject* object); |
| 368 int Allocate(int space, int size, bool* new_page_started); | 376 int Allocate(int space, int size, bool* new_page_started); |
| 369 int CurrentAllocationAddress(int space) { | |
| 370 if (SpaceIsLarge(space)) space = LO_SPACE; | |
| 371 return fullness_[space]; | |
| 372 } | |
| 373 int EncodeExternalReference(Address addr) { | 377 int EncodeExternalReference(Address addr) { |
| 374 return external_reference_encoder_->Encode(addr); | 378 return external_reference_encoder_->Encode(addr); |
| 375 } | 379 } |
| 380 int RootIndex(HeapObject* heap_object); |
| 381 static const int kInvalidRootIndex = -1; |
| 376 | 382 |
| 377 // Keep track of the fullness of each space in order to generate | 383 // Keep track of the fullness of each space in order to generate |
| 378 // relative addresses for back references. Large objects are | 384 // relative addresses for back references. Large objects are |
| 379 // just numbered sequentially since relative addresses make no | 385 // just numbered sequentially since relative addresses make no |
| 380 // sense in large object space. | 386 // sense in large object space. |
| 381 int fullness_[LAST_SPACE + 1]; | 387 int fullness_[LAST_SPACE + 1]; |
| 382 SnapshotByteSink* sink_; | 388 SnapshotByteSink* sink_; |
| 383 int current_root_index_; | 389 int current_root_index_; |
| 384 ExternalReferenceEncoder* external_reference_encoder_; | 390 ExternalReferenceEncoder* external_reference_encoder_; |
| 391 bool partial_; |
| 385 static bool serialization_enabled_; | 392 static bool serialization_enabled_; |
| 386 // Did we already make use of the fact that serialization was not enabled? | 393 // Did we already make use of the fact that serialization was not enabled? |
| 387 static bool too_late_to_enable_now_; | 394 static bool too_late_to_enable_now_; |
| 388 | 395 |
| 389 friend class ObjectSerializer; | 396 friend class ObjectSerializer; |
| 390 friend class Deserializer; | 397 friend class Deserializer; |
| 391 | 398 |
| 392 DISALLOW_COPY_AND_ASSIGN(Serializer); | 399 DISALLOW_COPY_AND_ASSIGN(Serializer); |
| 393 }; | 400 }; |
| 394 | 401 |
| 395 } } // namespace v8::internal | 402 } } // namespace v8::internal |
| 396 | 403 |
| 397 #endif // V8_SERIALIZE_H_ | 404 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |