| 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/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 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 ~Serializer(); | 610 ~Serializer(); |
| 611 void VisitPointers(Object** start, Object** end) OVERRIDE; | 611 void VisitPointers(Object** start, Object** end) OVERRIDE; |
| 612 | 612 |
| 613 void EncodeReservations(List<SerializedData::Reservation>* out) const; | 613 void EncodeReservations(List<SerializedData::Reservation>* out) const; |
| 614 | 614 |
| 615 Isolate* isolate() const { return isolate_; } | 615 Isolate* isolate() const { return isolate_; } |
| 616 | 616 |
| 617 BackReferenceMap* back_reference_map() { return &back_reference_map_; } | 617 BackReferenceMap* back_reference_map() { return &back_reference_map_; } |
| 618 RootIndexMap* root_index_map() { return &root_index_map_; } | 618 RootIndexMap* root_index_map() { return &root_index_map_; } |
| 619 | 619 |
| 620 void CountInstanceType(InstanceType instance_type) { |
| 621 instance_type_count_[instance_type]++; |
| 622 } |
| 623 |
| 620 protected: | 624 protected: |
| 621 class ObjectSerializer : public ObjectVisitor { | 625 class ObjectSerializer : public ObjectVisitor { |
| 622 public: | 626 public: |
| 623 ObjectSerializer(Serializer* serializer, Object* o, SnapshotByteSink* sink, | 627 ObjectSerializer(Serializer* serializer, Object* o, SnapshotByteSink* sink, |
| 624 HowToCode how_to_code, WhereToPoint where_to_point) | 628 HowToCode how_to_code, WhereToPoint where_to_point) |
| 625 : serializer_(serializer), | 629 : serializer_(serializer), |
| 626 object_(HeapObject::cast(o)), | 630 object_(HeapObject::cast(o)), |
| 627 sink_(sink), | 631 sink_(sink), |
| 628 reference_representation_(how_to_code + where_to_point), | 632 reference_representation_(how_to_code + where_to_point), |
| 629 bytes_processed_so_far_(0), | 633 bytes_processed_so_far_(0), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 Code* CopyCode(Code* code); | 715 Code* CopyCode(Code* code); |
| 712 | 716 |
| 713 inline uint32_t max_chunk_size(int space) const { | 717 inline uint32_t max_chunk_size(int space) const { |
| 714 DCHECK_LE(0, space); | 718 DCHECK_LE(0, space); |
| 715 DCHECK_LT(space, kNumberOfSpaces); | 719 DCHECK_LT(space, kNumberOfSpaces); |
| 716 return max_chunk_size_[space]; | 720 return max_chunk_size_[space]; |
| 717 } | 721 } |
| 718 | 722 |
| 719 SnapshotByteSink* sink() const { return sink_; } | 723 SnapshotByteSink* sink() const { return sink_; } |
| 720 | 724 |
| 725 void OutputStatistics(const char* name); |
| 726 |
| 721 Isolate* isolate_; | 727 Isolate* isolate_; |
| 722 | 728 |
| 723 SnapshotByteSink* sink_; | 729 SnapshotByteSink* sink_; |
| 724 ExternalReferenceEncoder external_reference_encoder_; | 730 ExternalReferenceEncoder external_reference_encoder_; |
| 725 | 731 |
| 726 BackReferenceMap back_reference_map_; | 732 BackReferenceMap back_reference_map_; |
| 727 RootIndexMap root_index_map_; | 733 RootIndexMap root_index_map_; |
| 728 | 734 |
| 729 friend class Deserializer; | 735 friend class Deserializer; |
| 730 friend class ObjectSerializer; | 736 friend class ObjectSerializer; |
| 731 friend class SnapshotData; | 737 friend class SnapshotData; |
| 732 | 738 |
| 733 private: | 739 private: |
| 734 CodeAddressMap* code_address_map_; | 740 CodeAddressMap* code_address_map_; |
| 735 // Objects from the same space are put into chunks for bulk-allocation | 741 // Objects from the same space are put into chunks for bulk-allocation |
| 736 // when deserializing. We have to make sure that each chunk fits into a | 742 // when deserializing. We have to make sure that each chunk fits into a |
| 737 // page. So we track the chunk size in pending_chunk_ of a space, but | 743 // page. So we track the chunk size in pending_chunk_ of a space, but |
| 738 // when it exceeds a page, we complete the current chunk and start a new one. | 744 // when it exceeds a page, we complete the current chunk and start a new one. |
| 739 uint32_t pending_chunk_[kNumberOfPreallocatedSpaces]; | 745 uint32_t pending_chunk_[kNumberOfPreallocatedSpaces]; |
| 740 List<uint32_t> completed_chunks_[kNumberOfPreallocatedSpaces]; | 746 List<uint32_t> completed_chunks_[kNumberOfPreallocatedSpaces]; |
| 741 uint32_t max_chunk_size_[kNumberOfPreallocatedSpaces]; | 747 uint32_t max_chunk_size_[kNumberOfPreallocatedSpaces]; |
| 742 | 748 |
| 743 // We map serialized large objects to indexes for back-referencing. | 749 // We map serialized large objects to indexes for back-referencing. |
| 744 uint32_t large_objects_total_size_; | 750 uint32_t large_objects_total_size_; |
| 745 uint32_t seen_large_objects_index_; | 751 uint32_t seen_large_objects_index_; |
| 746 | 752 |
| 747 List<byte> code_buffer_; | 753 List<byte> code_buffer_; |
| 748 | 754 |
| 755 static const int kInstanceTypes = 256; |
| 756 int* instance_type_count_; |
| 757 |
| 749 DISALLOW_COPY_AND_ASSIGN(Serializer); | 758 DISALLOW_COPY_AND_ASSIGN(Serializer); |
| 750 }; | 759 }; |
| 751 | 760 |
| 752 | 761 |
| 753 class PartialSerializer : public Serializer { | 762 class PartialSerializer : public Serializer { |
| 754 public: | 763 public: |
| 755 PartialSerializer(Isolate* isolate, Serializer* startup_snapshot_serializer, | 764 PartialSerializer(Isolate* isolate, Serializer* startup_snapshot_serializer, |
| 756 SnapshotByteSink* sink) | 765 SnapshotByteSink* sink) |
| 757 : Serializer(isolate, sink), | 766 : Serializer(isolate, sink), |
| 758 startup_serializer_(startup_snapshot_serializer), | 767 startup_serializer_(startup_snapshot_serializer), |
| 759 outdated_contexts_(0), | 768 outdated_contexts_(0), |
| 760 global_object_(NULL) { | 769 global_object_(NULL) { |
| 761 InitializeCodeAddressMap(); | 770 InitializeCodeAddressMap(); |
| 762 } | 771 } |
| 763 | 772 |
| 773 ~PartialSerializer() { OutputStatistics("PartialSerializer"); } |
| 774 |
| 764 // Serialize the objects reachable from a single object pointer. | 775 // Serialize the objects reachable from a single object pointer. |
| 765 void Serialize(Object** o); | 776 void Serialize(Object** o); |
| 766 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, | 777 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, |
| 767 WhereToPoint where_to_point, int skip) OVERRIDE; | 778 WhereToPoint where_to_point, int skip) OVERRIDE; |
| 768 | 779 |
| 769 private: | 780 private: |
| 770 int PartialSnapshotCacheIndex(HeapObject* o); | 781 int PartialSnapshotCacheIndex(HeapObject* o); |
| 771 bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { | 782 bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { |
| 772 // Scripts should be referred only through shared function infos. We can't | 783 // Scripts should be referred only through shared function infos. We can't |
| 773 // allow them to be part of the partial snapshot because they contain a | 784 // allow them to be part of the partial snapshot because they contain a |
| (...skipping 22 matching lines...) Expand all Loading... |
| 796 StartupSerializer(Isolate* isolate, SnapshotByteSink* sink) | 807 StartupSerializer(Isolate* isolate, SnapshotByteSink* sink) |
| 797 : Serializer(isolate, sink), root_index_wave_front_(0) { | 808 : Serializer(isolate, sink), root_index_wave_front_(0) { |
| 798 // Clear the cache of objects used by the partial snapshot. After the | 809 // Clear the cache of objects used by the partial snapshot. After the |
| 799 // strong roots have been serialized we can create a partial snapshot | 810 // strong roots have been serialized we can create a partial snapshot |
| 800 // which will repopulate the cache with objects needed by that partial | 811 // which will repopulate the cache with objects needed by that partial |
| 801 // snapshot. | 812 // snapshot. |
| 802 isolate->partial_snapshot_cache()->Clear(); | 813 isolate->partial_snapshot_cache()->Clear(); |
| 803 InitializeCodeAddressMap(); | 814 InitializeCodeAddressMap(); |
| 804 } | 815 } |
| 805 | 816 |
| 817 ~StartupSerializer() { OutputStatistics("StartupSerializer"); } |
| 818 |
| 806 // The StartupSerializer has to serialize the root array, which is slightly | 819 // The StartupSerializer has to serialize the root array, which is slightly |
| 807 // different. | 820 // different. |
| 808 void VisitPointers(Object** start, Object** end) OVERRIDE; | 821 void VisitPointers(Object** start, Object** end) OVERRIDE; |
| 809 | 822 |
| 810 // Serialize the current state of the heap. The order is: | 823 // Serialize the current state of the heap. The order is: |
| 811 // 1) Strong references. | 824 // 1) Strong references. |
| 812 // 2) Partial snapshot cache. | 825 // 2) Partial snapshot cache. |
| 813 // 3) Weak references (e.g. the string table). | 826 // 3) Weak references (e.g. the string table). |
| 814 virtual void SerializeStrongReferences(); | 827 virtual void SerializeStrongReferences(); |
| 815 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, | 828 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 852 private: | 865 private: |
| 853 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, | 866 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, |
| 854 Code* main_code) | 867 Code* main_code) |
| 855 : Serializer(isolate, sink), | 868 : Serializer(isolate, sink), |
| 856 source_(source), | 869 source_(source), |
| 857 main_code_(main_code), | 870 main_code_(main_code), |
| 858 num_internalized_strings_(0) { | 871 num_internalized_strings_(0) { |
| 859 back_reference_map_.AddSourceString(source); | 872 back_reference_map_.AddSourceString(source); |
| 860 } | 873 } |
| 861 | 874 |
| 875 ~CodeSerializer() { OutputStatistics("CodeSerializer"); } |
| 876 |
| 862 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, | 877 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, |
| 863 WhereToPoint where_to_point, int skip) OVERRIDE; | 878 WhereToPoint where_to_point, int skip) OVERRIDE; |
| 864 | 879 |
| 865 void SerializeBuiltin(int builtin_index, HowToCode how_to_code, | 880 void SerializeBuiltin(int builtin_index, HowToCode how_to_code, |
| 866 WhereToPoint where_to_point); | 881 WhereToPoint where_to_point); |
| 867 void SerializeIC(Code* ic, HowToCode how_to_code, | 882 void SerializeIC(Code* ic, HowToCode how_to_code, |
| 868 WhereToPoint where_to_point); | 883 WhereToPoint where_to_point); |
| 869 void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, | 884 void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, |
| 870 WhereToPoint where_to_point); | 885 WhereToPoint where_to_point); |
| 871 void SerializeGeneric(HeapObject* heap_object, HowToCode how_to_code, | 886 void SerializeGeneric(HeapObject* heap_object, HowToCode how_to_code, |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 978 kNumInternalizedStringsOffset + kInt32Size; | 993 kNumInternalizedStringsOffset + kInt32Size; |
| 979 static const int kNumCodeStubKeysOffset = kNumReservationsOffset + kInt32Size; | 994 static const int kNumCodeStubKeysOffset = kNumReservationsOffset + kInt32Size; |
| 980 static const int kPayloadLengthOffset = kNumCodeStubKeysOffset + kInt32Size; | 995 static const int kPayloadLengthOffset = kNumCodeStubKeysOffset + kInt32Size; |
| 981 static const int kChecksum1Offset = kPayloadLengthOffset + kInt32Size; | 996 static const int kChecksum1Offset = kPayloadLengthOffset + kInt32Size; |
| 982 static const int kChecksum2Offset = kChecksum1Offset + kInt32Size; | 997 static const int kChecksum2Offset = kChecksum1Offset + kInt32Size; |
| 983 static const int kHeaderSize = kChecksum2Offset + kInt32Size; | 998 static const int kHeaderSize = kChecksum2Offset + kInt32Size; |
| 984 }; | 999 }; |
| 985 } } // namespace v8::internal | 1000 } } // namespace v8::internal |
| 986 | 1001 |
| 987 #endif // V8_SERIALIZE_H_ | 1002 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |