| 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_SNAPSHOT_SERIALIZE_H_ | 5 #ifndef V8_SNAPSHOT_SERIALIZE_H_ |
| 6 #define V8_SNAPSHOT_SERIALIZE_H_ | 6 #define V8_SNAPSHOT_SERIALIZE_H_ |
| 7 | 7 |
| 8 #include "src/hashmap.h" | 8 #include "src/hashmap.h" |
| 9 #include "src/heap-profiler.h" | 9 #include "src/heap-profiler.h" |
| 10 #include "src/isolate.h" | 10 #include "src/isolate.h" |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 // changed. If that happens, update the bytecode ranges in the comments below. | 317 // changed. If that happens, update the bytecode ranges in the comments below. |
| 318 STATIC_ASSERT(5 == kNumberOfSpaces); | 318 STATIC_ASSERT(5 == kNumberOfSpaces); |
| 319 enum Where { | 319 enum Where { |
| 320 // 0x00..0x04 Allocate new object, in specified space. | 320 // 0x00..0x04 Allocate new object, in specified space. |
| 321 kNewObject = 0, | 321 kNewObject = 0, |
| 322 // 0x05 Unused (including 0x25, 0x45, 0x65). | 322 // 0x05 Unused (including 0x25, 0x45, 0x65). |
| 323 // 0x06 Unused (including 0x26, 0x46, 0x66). | 323 // 0x06 Unused (including 0x26, 0x46, 0x66). |
| 324 // 0x07 Unused (including 0x27, 0x47, 0x67). | 324 // 0x07 Unused (including 0x27, 0x47, 0x67). |
| 325 // 0x08..0x0c Reference to previous object from space. | 325 // 0x08..0x0c Reference to previous object from space. |
| 326 kBackref = 0x08, | 326 kBackref = 0x08, |
| 327 // 0x0d Unused (including 0x2d, 0x4d, 0x6d). |
| 327 // 0x0e Unused (including 0x2e, 0x4e, 0x6e). | 328 // 0x0e Unused (including 0x2e, 0x4e, 0x6e). |
| 328 // 0x0f Unused (including 0x2f, 0x4f, 0x6f). | 329 // 0x0f Unused (including 0x2f, 0x4f, 0x6f). |
| 329 // 0x10..0x14 Reference to previous object from space after skip. | 330 // 0x10..0x14 Reference to previous object from space after skip. |
| 330 kBackrefWithSkip = 0x10, | 331 kBackrefWithSkip = 0x10, |
| 332 // 0x15 Unused (including 0x35, 0x55, 0x75). |
| 331 // 0x16 Unused (including 0x36, 0x56, 0x76). | 333 // 0x16 Unused (including 0x36, 0x56, 0x76). |
| 332 // 0x17 Unused (including 0x37, 0x57, 0x77). | 334 // 0x17 Misc (including 0x37, 0x57, 0x77). |
| 333 // 0x18 Root array item. | 335 // 0x18 Root array item. |
| 334 kRootArray = 0x18, | 336 kRootArray = 0x18, |
| 335 // 0x19 Object in the partial snapshot cache. | 337 // 0x19 Object in the partial snapshot cache. |
| 336 kPartialSnapshotCache = 0x19, | 338 kPartialSnapshotCache = 0x19, |
| 337 // 0x1a External reference referenced by id. | 339 // 0x1a External reference referenced by id. |
| 338 kExternalReference = 0x1a, | 340 kExternalReference = 0x1a, |
| 339 // 0x1b Object provided in the attached list. | 341 // 0x1b Object provided in the attached list. |
| 340 kAttachedReference = 0x1b, | 342 kAttachedReference = 0x1b, |
| 341 // 0x1c Builtin code referenced by index. | 343 // 0x1c Builtin code referenced by index. |
| 342 kBuiltin = 0x1c | 344 kBuiltin = 0x1c |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 static const int kNop = 0x3d; | 379 static const int kNop = 0x3d; |
| 378 // Move to next reserved chunk. | 380 // Move to next reserved chunk. |
| 379 static const int kNextChunk = 0x3e; | 381 static const int kNextChunk = 0x3e; |
| 380 // Deferring object content. | 382 // Deferring object content. |
| 381 static const int kDeferred = 0x3f; | 383 static const int kDeferred = 0x3f; |
| 382 // A tag emitted at strategic points in the snapshot to delineate sections. | 384 // A tag emitted at strategic points in the snapshot to delineate sections. |
| 383 // If the deserializer does not find these at the expected moments then it | 385 // If the deserializer does not find these at the expected moments then it |
| 384 // is an indication that the snapshot and the VM do not fit together. | 386 // is an indication that the snapshot and the VM do not fit together. |
| 385 // Examine the build process for architecture, version or configuration | 387 // Examine the build process for architecture, version or configuration |
| 386 // mismatches. | 388 // mismatches. |
| 387 static const int kSynchronize = 0x5d; | 389 static const int kSynchronize = 0x17; |
| 388 // Used for the source code of the natives, which is in the executable, but | 390 // Used for the source code of the natives, which is in the executable, but |
| 389 // is referred to from external strings in the snapshot. | 391 // is referred to from external strings in the snapshot. |
| 390 static const int kNativesStringResource = 0x5e; | 392 static const int kNativesStringResource = 0x37; |
| 391 // Raw data of variable length. | 393 // Raw data of variable length. |
| 392 static const int kVariableRawData = 0x7d; | 394 static const int kVariableRawData = 0x57; |
| 393 // Repeats of variable length. | 395 // Repeats of variable length. |
| 394 static const int kVariableRepeat = 0x7e; | 396 static const int kVariableRepeat = 0x77; |
| 397 // Alignment prefixes 0x7d..0x7f |
| 398 static const int kAlignmentPrefix = 0x7d; |
| 399 |
| 400 // 0x5d..0x5f unused |
| 395 | 401 |
| 396 // ---------- byte code range 0x80..0xff ---------- | 402 // ---------- byte code range 0x80..0xff ---------- |
| 397 // First 32 root array items. | 403 // First 32 root array items. |
| 398 static const int kNumberOfRootArrayConstants = 0x20; | 404 static const int kNumberOfRootArrayConstants = 0x20; |
| 399 // 0x80..0x9f | 405 // 0x80..0x9f |
| 400 static const int kRootArrayConstants = 0x80; | 406 static const int kRootArrayConstants = 0x80; |
| 401 // 0xa0..0xbf | 407 // 0xa0..0xbf |
| 402 static const int kRootArrayConstantsWithSkip = 0xa0; | 408 static const int kRootArrayConstantsWithSkip = 0xa0; |
| 403 static const int kRootArrayConstantsMask = 0x1f; | 409 static const int kRootArrayConstantsMask = 0x1f; |
| 404 | 410 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 class Deserializer: public SerializerDeserializer { | 514 class Deserializer: public SerializerDeserializer { |
| 509 public: | 515 public: |
| 510 // Create a deserializer from a snapshot byte source. | 516 // Create a deserializer from a snapshot byte source. |
| 511 template <class Data> | 517 template <class Data> |
| 512 explicit Deserializer(Data* data) | 518 explicit Deserializer(Data* data) |
| 513 : isolate_(NULL), | 519 : isolate_(NULL), |
| 514 source_(data->Payload()), | 520 source_(data->Payload()), |
| 515 magic_number_(data->GetMagicNumber()), | 521 magic_number_(data->GetMagicNumber()), |
| 516 external_reference_table_(NULL), | 522 external_reference_table_(NULL), |
| 517 deserialized_large_objects_(0), | 523 deserialized_large_objects_(0), |
| 518 deserializing_user_code_(false) { | 524 deserializing_user_code_(false), |
| 525 next_alignment_(kWordAligned) { |
| 519 DecodeReservation(data->Reservations()); | 526 DecodeReservation(data->Reservations()); |
| 520 } | 527 } |
| 521 | 528 |
| 522 virtual ~Deserializer(); | 529 virtual ~Deserializer(); |
| 523 | 530 |
| 524 // Deserialize the snapshot into an empty heap. | 531 // Deserialize the snapshot into an empty heap. |
| 525 void Deserialize(Isolate* isolate); | 532 void Deserialize(Isolate* isolate); |
| 526 | 533 |
| 527 // Deserialize a single object and the objects reachable from it. | 534 // Deserialize a single object and the objects reachable from it. |
| 528 MaybeHandle<Object> DeserializePartial( | 535 MaybeHandle<Object> DeserializePartial( |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 uint32_t current_chunk_[kNumberOfPreallocatedSpaces]; | 602 uint32_t current_chunk_[kNumberOfPreallocatedSpaces]; |
| 596 Address high_water_[kNumberOfPreallocatedSpaces]; | 603 Address high_water_[kNumberOfPreallocatedSpaces]; |
| 597 | 604 |
| 598 ExternalReferenceTable* external_reference_table_; | 605 ExternalReferenceTable* external_reference_table_; |
| 599 | 606 |
| 600 List<HeapObject*> deserialized_large_objects_; | 607 List<HeapObject*> deserialized_large_objects_; |
| 601 List<Code*> new_code_objects_; | 608 List<Code*> new_code_objects_; |
| 602 | 609 |
| 603 bool deserializing_user_code_; | 610 bool deserializing_user_code_; |
| 604 | 611 |
| 612 AllocationAlignment next_alignment_; |
| 613 |
| 605 DISALLOW_COPY_AND_ASSIGN(Deserializer); | 614 DISALLOW_COPY_AND_ASSIGN(Deserializer); |
| 606 }; | 615 }; |
| 607 | 616 |
| 608 | 617 |
| 609 class CodeAddressMap; | 618 class CodeAddressMap; |
| 610 | 619 |
| 611 // There can be only one serializer per V8 process. | 620 // There can be only one serializer per V8 process. |
| 612 class Serializer : public SerializerDeserializer { | 621 class Serializer : public SerializerDeserializer { |
| 613 public: | 622 public: |
| 614 Serializer(Isolate* isolate, SnapshotByteSink* sink); | 623 Serializer(Isolate* isolate, SnapshotByteSink* sink); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 }; | 708 }; |
| 700 | 709 |
| 701 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, | 710 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, |
| 702 WhereToPoint where_to_point, int skip) = 0; | 711 WhereToPoint where_to_point, int skip) = 0; |
| 703 | 712 |
| 704 void PutRoot(int index, HeapObject* object, HowToCode how, WhereToPoint where, | 713 void PutRoot(int index, HeapObject* object, HowToCode how, WhereToPoint where, |
| 705 int skip); | 714 int skip); |
| 706 | 715 |
| 707 void PutBackReference(HeapObject* object, BackReference reference); | 716 void PutBackReference(HeapObject* object, BackReference reference); |
| 708 | 717 |
| 718 // Emit alignment prefix if necessary, return required padding space in bytes. |
| 719 int PutAlignmentPrefix(HeapObject* object); |
| 720 |
| 709 // Returns true if the object was successfully serialized. | 721 // Returns true if the object was successfully serialized. |
| 710 bool SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, | 722 bool SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, |
| 711 WhereToPoint where_to_point, int skip); | 723 WhereToPoint where_to_point, int skip); |
| 712 | 724 |
| 713 inline void FlushSkip(int skip) { | 725 inline void FlushSkip(int skip) { |
| 714 if (skip != 0) { | 726 if (skip != 0) { |
| 715 sink_->Put(kSkip, "SkipFromSerializeObject"); | 727 sink_->Put(kSkip, "SkipFromSerializeObject"); |
| 716 sink_->PutInt(skip, "SkipDistanceFromSerializeObject"); | 728 sink_->PutInt(skip, "SkipDistanceFromSerializeObject"); |
| 717 } | 729 } |
| 718 } | 730 } |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 kNumInternalizedStringsOffset + kInt32Size; | 1042 kNumInternalizedStringsOffset + kInt32Size; |
| 1031 static const int kNumCodeStubKeysOffset = kNumReservationsOffset + kInt32Size; | 1043 static const int kNumCodeStubKeysOffset = kNumReservationsOffset + kInt32Size; |
| 1032 static const int kPayloadLengthOffset = kNumCodeStubKeysOffset + kInt32Size; | 1044 static const int kPayloadLengthOffset = kNumCodeStubKeysOffset + kInt32Size; |
| 1033 static const int kChecksum1Offset = kPayloadLengthOffset + kInt32Size; | 1045 static const int kChecksum1Offset = kPayloadLengthOffset + kInt32Size; |
| 1034 static const int kChecksum2Offset = kChecksum1Offset + kInt32Size; | 1046 static const int kChecksum2Offset = kChecksum1Offset + kInt32Size; |
| 1035 static const int kHeaderSize = kChecksum2Offset + kInt32Size; | 1047 static const int kHeaderSize = kChecksum2Offset + kInt32Size; |
| 1036 }; | 1048 }; |
| 1037 } } // namespace v8::internal | 1049 } } // namespace v8::internal |
| 1038 | 1050 |
| 1039 #endif // V8_SNAPSHOT_SERIALIZE_H_ | 1051 #endif // V8_SNAPSHOT_SERIALIZE_H_ |
| OLD | NEW |