| 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/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/hashmap.h" | 9 #include "src/hashmap.h" |
| 10 #include "src/heap-profiler.h" | 10 #include "src/heap-profiler.h" |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 257 |
| 258 // Deserialize a single object and the objects reachable from it. | 258 // Deserialize a single object and the objects reachable from it. |
| 259 // We may want to abort gracefully even if deserialization fails. | 259 // We may want to abort gracefully even if deserialization fails. |
| 260 void DeserializePartial(Isolate* isolate, Object** root, | 260 void DeserializePartial(Isolate* isolate, Object** root, |
| 261 OnOOM on_oom = FATAL_ON_OOM); | 261 OnOOM on_oom = FATAL_ON_OOM); |
| 262 | 262 |
| 263 void AddReservation(int space, uint32_t chunk) { | 263 void AddReservation(int space, uint32_t chunk) { |
| 264 DCHECK(space >= 0); | 264 DCHECK(space >= 0); |
| 265 DCHECK(space < kNumberOfSpaces); | 265 DCHECK(space < kNumberOfSpaces); |
| 266 DCHECK(space == LO_SPACE || | 266 DCHECK(space == LO_SPACE || |
| 267 chunk < static_cast<uint32_t>(Page::kMaxRegularHeapObjectSize)); | 267 chunk <= static_cast<uint32_t>(Page::kMaxRegularHeapObjectSize)); |
| 268 reservations_[space].Add({chunk, NULL, NULL}); | 268 reservations_[space].Add({chunk, NULL, NULL}); |
| 269 } | 269 } |
| 270 | 270 |
| 271 void FlushICacheForNewCodeObjects(); | 271 void FlushICacheForNewCodeObjects(); |
| 272 | 272 |
| 273 // Serialized user code reference certain objects that are provided in a list | 273 // Serialized user code reference certain objects that are provided in a list |
| 274 // By calling this method, we assume that we are deserializing user code. | 274 // By calling this method, we assume that we are deserializing user code. |
| 275 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) { | 275 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) { |
| 276 attached_objects_ = attached_objects; | 276 attached_objects_ = attached_objects; |
| 277 } | 277 } |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 static ScriptData* Serialize(Isolate* isolate, | 612 static ScriptData* Serialize(Isolate* isolate, |
| 613 Handle<SharedFunctionInfo> info, | 613 Handle<SharedFunctionInfo> info, |
| 614 Handle<String> source); | 614 Handle<String> source); |
| 615 | 615 |
| 616 MUST_USE_RESULT static MaybeHandle<SharedFunctionInfo> Deserialize( | 616 MUST_USE_RESULT static MaybeHandle<SharedFunctionInfo> Deserialize( |
| 617 Isolate* isolate, ScriptData* data, Handle<String> source); | 617 Isolate* isolate, ScriptData* data, Handle<String> source); |
| 618 | 618 |
| 619 static const int kSourceObjectIndex = 0; | 619 static const int kSourceObjectIndex = 0; |
| 620 static const int kCodeStubsBaseIndex = 1; | 620 static const int kCodeStubsBaseIndex = 1; |
| 621 | 621 |
| 622 String* source() { | 622 String* source() const { |
| 623 DCHECK(!AllowHeapAllocation::IsAllowed()); | 623 DCHECK(!AllowHeapAllocation::IsAllowed()); |
| 624 return source_; | 624 return source_; |
| 625 } | 625 } |
| 626 | 626 |
| 627 List<uint32_t>* stub_keys() { return &stub_keys_; } | 627 List<uint32_t>* stub_keys() { return &stub_keys_; } |
| 628 int num_internalized_strings() const { return num_internalized_strings_; } |
| 628 | 629 |
| 629 private: | 630 private: |
| 630 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, | 631 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, |
| 631 Code* main_code) | 632 Code* main_code) |
| 632 : Serializer(isolate, sink), source_(source), main_code_(main_code) { | 633 : Serializer(isolate, sink), |
| 634 source_(source), |
| 635 main_code_(main_code), |
| 636 num_internalized_strings_(0) { |
| 633 set_root_index_wave_front(Heap::kStrongRootListLength); | 637 set_root_index_wave_front(Heap::kStrongRootListLength); |
| 634 InitializeCodeAddressMap(); | 638 InitializeCodeAddressMap(); |
| 635 } | 639 } |
| 636 | 640 |
| 637 virtual void SerializeObject(Object* o, HowToCode how_to_code, | 641 virtual void SerializeObject(Object* o, HowToCode how_to_code, |
| 638 WhereToPoint where_to_point, int skip); | 642 WhereToPoint where_to_point, int skip); |
| 639 | 643 |
| 640 void SerializeBuiltin(int builtin_index, HowToCode how_to_code, | 644 void SerializeBuiltin(int builtin_index, HowToCode how_to_code, |
| 641 WhereToPoint where_to_point); | 645 WhereToPoint where_to_point); |
| 642 void SerializeIC(Code* ic, HowToCode how_to_code, | 646 void SerializeIC(Code* ic, HowToCode how_to_code, |
| 643 WhereToPoint where_to_point); | 647 WhereToPoint where_to_point); |
| 644 void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, | 648 void SerializeCodeStub(uint32_t stub_key, HowToCode how_to_code, |
| 645 WhereToPoint where_to_point); | 649 WhereToPoint where_to_point); |
| 646 void SerializeSourceObject(HowToCode how_to_code, | 650 void SerializeSourceObject(HowToCode how_to_code, |
| 647 WhereToPoint where_to_point); | 651 WhereToPoint where_to_point); |
| 648 void SerializeHeapObject(HeapObject* heap_object, HowToCode how_to_code, | 652 void SerializeHeapObject(HeapObject* heap_object, HowToCode how_to_code, |
| 649 WhereToPoint where_to_point); | 653 WhereToPoint where_to_point); |
| 650 int AddCodeStubKey(uint32_t stub_key); | 654 int AddCodeStubKey(uint32_t stub_key); |
| 651 | 655 |
| 652 DisallowHeapAllocation no_gc_; | 656 DisallowHeapAllocation no_gc_; |
| 653 String* source_; | 657 String* source_; |
| 654 Code* main_code_; | 658 Code* main_code_; |
| 659 int num_internalized_strings_; |
| 655 List<uint32_t> stub_keys_; | 660 List<uint32_t> stub_keys_; |
| 656 DISALLOW_COPY_AND_ASSIGN(CodeSerializer); | 661 DISALLOW_COPY_AND_ASSIGN(CodeSerializer); |
| 657 }; | 662 }; |
| 658 | 663 |
| 659 | 664 |
| 660 // Wrapper around ScriptData to provide code-serializer-specific functionality. | 665 // Wrapper around ScriptData to provide code-serializer-specific functionality. |
| 661 class SerializedCodeData { | 666 class SerializedCodeData { |
| 662 public: | 667 public: |
| 663 // Used by when consuming. | 668 // Used by when consuming. |
| 664 explicit SerializedCodeData(ScriptData* data, String* source) | 669 explicit SerializedCodeData(ScriptData* data, String* source) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 687 public: | 692 public: |
| 688 uint32_t chunk_size() const { return ChunkSizeBits::decode(reservation); } | 693 uint32_t chunk_size() const { return ChunkSizeBits::decode(reservation); } |
| 689 bool is_last_chunk() const { return IsLastChunkBits::decode(reservation); } | 694 bool is_last_chunk() const { return IsLastChunkBits::decode(reservation); } |
| 690 | 695 |
| 691 private: | 696 private: |
| 692 uint32_t reservation; | 697 uint32_t reservation; |
| 693 | 698 |
| 694 DISALLOW_COPY_AND_ASSIGN(Reservation); | 699 DISALLOW_COPY_AND_ASSIGN(Reservation); |
| 695 }; | 700 }; |
| 696 | 701 |
| 702 int NumInternalizedStrings() const { |
| 703 return GetHeaderValue(kNumInternalizedStringsOffset); |
| 704 } |
| 705 |
| 697 Vector<const Reservation> Reservations() const { | 706 Vector<const Reservation> Reservations() const { |
| 698 return Vector<const Reservation>(reinterpret_cast<const Reservation*>( | 707 return Vector<const Reservation>(reinterpret_cast<const Reservation*>( |
| 699 script_data_->data() + kHeaderSize), | 708 script_data_->data() + kHeaderSize), |
| 700 GetHeaderValue(kReservationsOffset)); | 709 GetHeaderValue(kReservationsOffset)); |
| 701 } | 710 } |
| 702 | 711 |
| 703 Vector<const uint32_t> CodeStubKeys() const { | 712 Vector<const uint32_t> CodeStubKeys() const { |
| 704 int reservations_size = GetHeaderValue(kReservationsOffset) * kInt32Size; | 713 int reservations_size = GetHeaderValue(kReservationsOffset) * kInt32Size; |
| 705 const byte* start = script_data_->data() + kHeaderSize + reservations_size; | 714 const byte* start = script_data_->data() + kHeaderSize + reservations_size; |
| 706 return Vector<const uint32_t>(reinterpret_cast<const uint32_t*>(start), | 715 return Vector<const uint32_t>(reinterpret_cast<const uint32_t*>(start), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 730 int GetHeaderValue(int offset) const { | 739 int GetHeaderValue(int offset) const { |
| 731 return reinterpret_cast<const int*>(script_data_->data())[offset]; | 740 return reinterpret_cast<const int*>(script_data_->data())[offset]; |
| 732 } | 741 } |
| 733 | 742 |
| 734 bool IsSane(String* source); | 743 bool IsSane(String* source); |
| 735 | 744 |
| 736 int CheckSum(String* source); | 745 int CheckSum(String* source); |
| 737 | 746 |
| 738 // The data header consists of int-sized entries: | 747 // The data header consists of int-sized entries: |
| 739 // [0] version hash | 748 // [0] version hash |
| 740 // [1] number of code stub keys | 749 // [1] number of internalized strings |
| 741 // [2] payload length | 750 // [2] number of code stub keys |
| 742 // [3..9] reservation sizes for spaces from NEW_SPACE to PROPERTY_CELL_SPACE. | 751 // [3] payload length |
| 752 // [4..10] reservation sizes for spaces from NEW_SPACE to PROPERTY_CELL_SPACE. |
| 743 static const int kCheckSumOffset = 0; | 753 static const int kCheckSumOffset = 0; |
| 744 static const int kReservationsOffset = 1; | 754 static const int kNumInternalizedStringsOffset = 1; |
| 745 static const int kNumCodeStubKeysOffset = 2; | 755 static const int kReservationsOffset = 2; |
| 746 static const int kPayloadLengthOffset = 3; | 756 static const int kNumCodeStubKeysOffset = 3; |
| 757 static const int kPayloadLengthOffset = 4; |
| 747 static const int kHeaderSize = (kPayloadLengthOffset + 1) * kIntSize; | 758 static const int kHeaderSize = (kPayloadLengthOffset + 1) * kIntSize; |
| 748 | 759 |
| 749 class ChunkSizeBits : public BitField<uint32_t, 0, 31> {}; | 760 class ChunkSizeBits : public BitField<uint32_t, 0, 31> {}; |
| 750 class IsLastChunkBits : public BitField<bool, 31, 1> {}; | 761 class IsLastChunkBits : public BitField<bool, 31, 1> {}; |
| 751 | 762 |
| 752 // Following the header, we store, in sequential order | 763 // Following the header, we store, in sequential order |
| 753 // - code stub keys | 764 // - code stub keys |
| 754 // - serialization payload | 765 // - serialization payload |
| 755 | 766 |
| 756 ScriptData* script_data_; | 767 ScriptData* script_data_; |
| 757 bool owns_script_data_; | 768 bool owns_script_data_; |
| 758 }; | 769 }; |
| 759 } } // namespace v8::internal | 770 } } // namespace v8::internal |
| 760 | 771 |
| 761 #endif // V8_SERIALIZE_H_ | 772 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |