| 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 // A Deserializer reads a snapshot and reconstructs the Object graph it defines. | 232 // A Deserializer reads a snapshot and reconstructs the Object graph it defines. |
| 233 class Deserializer: public SerDes { | 233 class Deserializer: public SerDes { |
| 234 public: | 234 public: |
| 235 // Create a deserializer from a snapshot byte source. | 235 // Create a deserializer from a snapshot byte source. |
| 236 explicit Deserializer(SnapshotByteSource* source); | 236 explicit Deserializer(SnapshotByteSource* source); |
| 237 | 237 |
| 238 virtual ~Deserializer() { } | 238 virtual ~Deserializer() { } |
| 239 | 239 |
| 240 // Deserialize the snapshot into an empty heap. | 240 // Deserialize the snapshot into an empty heap. |
| 241 void Deserialize(); | 241 void Deserialize(); |
| 242 |
| 243 // Deserialize a single object and the objects reachable from it. |
| 244 void DeserializePartial(Object** root); |
| 245 |
| 242 #ifdef DEBUG | 246 #ifdef DEBUG |
| 243 virtual void Synchronize(const char* tag); | 247 virtual void Synchronize(const char* tag); |
| 244 #endif | 248 #endif |
| 245 | 249 |
| 250 static void TearDown(); |
| 251 |
| 246 private: | 252 private: |
| 247 virtual void VisitPointers(Object** start, Object** end); | 253 virtual void VisitPointers(Object** start, Object** end); |
| 248 | 254 |
| 249 virtual void VisitExternalReferences(Address* start, Address* end) { | 255 virtual void VisitExternalReferences(Address* start, Address* end) { |
| 250 UNREACHABLE(); | 256 UNREACHABLE(); |
| 251 } | 257 } |
| 252 | 258 |
| 253 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { | 259 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { |
| 254 UNREACHABLE(); | 260 UNREACHABLE(); |
| 255 } | 261 } |
| 256 | 262 |
| 257 void ReadChunk(Object** start, Object** end, int space, Address address); | 263 void ReadChunk(Object** start, Object** end, int space, Address address); |
| 258 HeapObject* GetAddressFromStart(int space); | 264 HeapObject* GetAddressFromStart(int space); |
| 259 inline HeapObject* GetAddressFromEnd(int space); | 265 inline HeapObject* GetAddressFromEnd(int space); |
| 260 Address Allocate(int space_number, Space* space, int size); | 266 Address Allocate(int space_number, Space* space, int size); |
| 261 void ReadObject(int space_number, Space* space, Object** write_back); | 267 void ReadObject(int space_number, Space* space, Object** write_back); |
| 262 | 268 |
| 263 // Keep track of the pages in the paged spaces. | 269 // Keep track of the pages in the paged spaces. |
| 264 // (In large object space we are keeping track of individual objects | 270 // (In large object space we are keeping track of individual objects |
| 265 // rather than pages.) In new space we just need the address of the | 271 // rather than pages.) In new space we just need the address of the |
| 266 // first object and the others will flow from that. | 272 // first object and the others will flow from that. |
| 267 List<Address> pages_[SerDes::kNumberOfSpaces]; | 273 List<Address> pages_[SerDes::kNumberOfSpaces]; |
| 268 | 274 |
| 269 SnapshotByteSource* source_; | 275 SnapshotByteSource* source_; |
| 270 ExternalReferenceDecoder* external_reference_decoder_; | 276 static ExternalReferenceDecoder* external_reference_decoder_; |
| 271 // This is the address of the next object that will be allocated in each | 277 // This is the address of the next object that will be allocated in each |
| 272 // space. It is used to calculate the addresses of back-references. | 278 // space. It is used to calculate the addresses of back-references. |
| 273 Address high_water_[LAST_SPACE + 1]; | 279 Address high_water_[LAST_SPACE + 1]; |
| 274 // This is the address of the most recent object that was allocated. It | 280 // This is the address of the most recent object that was allocated. It |
| 275 // is used to set the location of the new page when we encounter a | 281 // is used to set the location of the new page when we encounter a |
| 276 // START_NEW_PAGE_SERIALIZATION tag. | 282 // START_NEW_PAGE_SERIALIZATION tag. |
| 277 Address last_object_address_; | 283 Address last_object_address_; |
| 278 | 284 |
| 279 DISALLOW_COPY_AND_ASSIGN(Deserializer); | 285 DISALLOW_COPY_AND_ASSIGN(Deserializer); |
| 280 }; | 286 }; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 295 public: | 301 public: |
| 296 explicit Serializer(SnapshotByteSink* sink); | 302 explicit Serializer(SnapshotByteSink* sink); |
| 297 // Serialize the current state of the heap. | 303 // Serialize the current state of the heap. |
| 298 void Serialize(); | 304 void Serialize(); |
| 299 // Serialize a single object and the objects reachable from it. | 305 // Serialize a single object and the objects reachable from it. |
| 300 void SerializePartial(Object** obj); | 306 void SerializePartial(Object** obj); |
| 301 void VisitPointers(Object** start, Object** end); | 307 void VisitPointers(Object** start, Object** end); |
| 302 // You can call this after serialization to find out how much space was used | 308 // You can call this after serialization to find out how much space was used |
| 303 // in each space. | 309 // in each space. |
| 304 int CurrentAllocationAddress(int space) { | 310 int CurrentAllocationAddress(int space) { |
| 305 if (SpaceIsLarge(space)) space = LO_SPACE; | 311 if (SpaceIsLarge(space)) return large_object_total_; |
| 306 return fullness_[space]; | 312 return fullness_[space]; |
| 307 } | 313 } |
| 308 | 314 |
| 309 static void Enable() { | 315 static void Enable() { |
| 310 if (!serialization_enabled_) { | 316 if (!serialization_enabled_) { |
| 311 ASSERT(!too_late_to_enable_now_); | 317 ASSERT(!too_late_to_enable_now_); |
| 312 } | 318 } |
| 313 serialization_enabled_ = true; | 319 serialization_enabled_ = true; |
| 314 } | 320 } |
| 315 | 321 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 // just numbered sequentially since relative addresses make no | 391 // just numbered sequentially since relative addresses make no |
| 386 // sense in large object space. | 392 // sense in large object space. |
| 387 int fullness_[LAST_SPACE + 1]; | 393 int fullness_[LAST_SPACE + 1]; |
| 388 SnapshotByteSink* sink_; | 394 SnapshotByteSink* sink_; |
| 389 int current_root_index_; | 395 int current_root_index_; |
| 390 ExternalReferenceEncoder* external_reference_encoder_; | 396 ExternalReferenceEncoder* external_reference_encoder_; |
| 391 bool partial_; | 397 bool partial_; |
| 392 static bool serialization_enabled_; | 398 static bool serialization_enabled_; |
| 393 // Did we already make use of the fact that serialization was not enabled? | 399 // Did we already make use of the fact that serialization was not enabled? |
| 394 static bool too_late_to_enable_now_; | 400 static bool too_late_to_enable_now_; |
| 401 int large_object_total_; |
| 395 | 402 |
| 396 friend class ObjectSerializer; | 403 friend class ObjectSerializer; |
| 397 friend class Deserializer; | 404 friend class Deserializer; |
| 398 | 405 |
| 399 DISALLOW_COPY_AND_ASSIGN(Serializer); | 406 DISALLOW_COPY_AND_ASSIGN(Serializer); |
| 400 }; | 407 }; |
| 401 | 408 |
| 402 } } // namespace v8::internal | 409 } } // namespace v8::internal |
| 403 | 410 |
| 404 #endif // V8_SERIALIZE_H_ | 411 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |