| 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 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 external_reference_decoder_(NULL), | 511 external_reference_decoder_(NULL), |
| 512 deserialized_large_objects_(0) { | 512 deserialized_large_objects_(0) { |
| 513 DecodeReservation(data->Reservations()); | 513 DecodeReservation(data->Reservations()); |
| 514 } | 514 } |
| 515 | 515 |
| 516 virtual ~Deserializer(); | 516 virtual ~Deserializer(); |
| 517 | 517 |
| 518 // Deserialize the snapshot into an empty heap. | 518 // Deserialize the snapshot into an empty heap. |
| 519 void Deserialize(Isolate* isolate); | 519 void Deserialize(Isolate* isolate); |
| 520 | 520 |
| 521 enum OnOOM { FATAL_ON_OOM, NULL_ON_OOM }; | |
| 522 | |
| 523 // Deserialize a single object and the objects reachable from it. | 521 // Deserialize a single object and the objects reachable from it. |
| 524 // We may want to abort gracefully even if deserialization fails. | 522 // We may want to abort gracefully even if deserialization fails. |
| 525 void DeserializePartial(Isolate* isolate, Object** root, | 523 MaybeHandle<Object> DeserializePartial( |
| 526 OnOOM on_oom = FATAL_ON_OOM); | 524 Isolate* isolate, Handle<FixedArray>* outdated_contexts_out); |
| 525 |
| 526 MaybeHandle<SharedFunctionInfo> DeserializeCode(Isolate* isolate); |
| 527 | 527 |
| 528 void FlushICacheForNewCodeObjects(); | 528 void FlushICacheForNewCodeObjects(); |
| 529 | 529 |
| 530 // Serialized user code reference certain objects that are provided in a list | 530 // Serialized user code reference certain objects that are provided in a list |
| 531 // By calling this method, we assume that we are deserializing user code. | 531 // By calling this method, we assume that we are deserializing user code. |
| 532 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) { | 532 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) { |
| 533 attached_objects_ = attached_objects; | 533 attached_objects_ = attached_objects; |
| 534 } | 534 } |
| 535 | 535 |
| 536 bool deserializing_user_code() { return attached_objects_ != NULL; } | 536 bool deserializing_user_code() { return attached_objects_ != NULL; } |
| 537 | 537 |
| 538 private: | 538 private: |
| 539 virtual void VisitPointers(Object** start, Object** end); | 539 virtual void VisitPointers(Object** start, Object** end); |
| 540 | 540 |
| 541 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { | 541 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { |
| 542 UNREACHABLE(); | 542 UNREACHABLE(); |
| 543 } | 543 } |
| 544 | 544 |
| 545 void Initialize(Isolate* isolate); |
| 546 |
| 545 void DecodeReservation(Vector<const SerializedData::Reservation> res); | 547 void DecodeReservation(Vector<const SerializedData::Reservation> res); |
| 546 | 548 |
| 547 bool ReserveSpace(); | 549 bool ReserveSpace(); |
| 548 | 550 |
| 549 void UnalignedCopy(Object** dest, Object** src) { | 551 void UnalignedCopy(Object** dest, Object** src) { |
| 550 memcpy(dest, src, sizeof(*src)); | 552 memcpy(dest, src, sizeof(*src)); |
| 551 } | 553 } |
| 552 | 554 |
| 553 // Allocation sites are present in the snapshot, and must be linked into | 555 // Allocation sites are present in the snapshot, and must be linked into |
| 554 // a list at deserialization time. | 556 // a list at deserialization time. |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 // We map serialized large objects to indexes for back-referencing. | 733 // We map serialized large objects to indexes for back-referencing. |
| 732 uint32_t large_objects_total_size_; | 734 uint32_t large_objects_total_size_; |
| 733 uint32_t seen_large_objects_index_; | 735 uint32_t seen_large_objects_index_; |
| 734 | 736 |
| 735 DISALLOW_COPY_AND_ASSIGN(Serializer); | 737 DISALLOW_COPY_AND_ASSIGN(Serializer); |
| 736 }; | 738 }; |
| 737 | 739 |
| 738 | 740 |
| 739 class PartialSerializer : public Serializer { | 741 class PartialSerializer : public Serializer { |
| 740 public: | 742 public: |
| 741 PartialSerializer(Isolate* isolate, | 743 PartialSerializer(Isolate* isolate, Serializer* startup_snapshot_serializer, |
| 742 Serializer* startup_snapshot_serializer, | |
| 743 SnapshotByteSink* sink) | 744 SnapshotByteSink* sink) |
| 744 : Serializer(isolate, sink), | 745 : Serializer(isolate, sink), |
| 745 startup_serializer_(startup_snapshot_serializer) { | 746 startup_serializer_(startup_snapshot_serializer), |
| 747 outdated_contexts_(0), |
| 748 global_object_(NULL) { |
| 746 InitializeCodeAddressMap(); | 749 InitializeCodeAddressMap(); |
| 747 } | 750 } |
| 748 | 751 |
| 749 // Serialize the objects reachable from a single object pointer. | 752 // Serialize the objects reachable from a single object pointer. |
| 750 void Serialize(Object** o); | 753 void Serialize(Object** o); |
| 751 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, | 754 virtual void SerializeObject(HeapObject* o, HowToCode how_to_code, |
| 752 WhereToPoint where_to_point, int skip) OVERRIDE; | 755 WhereToPoint where_to_point, int skip) OVERRIDE; |
| 753 | 756 |
| 754 private: | 757 private: |
| 755 int PartialSnapshotCacheIndex(HeapObject* o); | 758 int PartialSnapshotCacheIndex(HeapObject* o); |
| 756 bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { | 759 bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { |
| 757 // Scripts should be referred only through shared function infos. We can't | 760 // Scripts should be referred only through shared function infos. We can't |
| 758 // allow them to be part of the partial snapshot because they contain a | 761 // allow them to be part of the partial snapshot because they contain a |
| 759 // unique ID, and deserializing several partial snapshots containing script | 762 // unique ID, and deserializing several partial snapshots containing script |
| 760 // would cause dupes. | 763 // would cause dupes. |
| 761 DCHECK(!o->IsScript()); | 764 DCHECK(!o->IsScript()); |
| 762 return o->IsName() || o->IsSharedFunctionInfo() || | 765 return o->IsName() || o->IsSharedFunctionInfo() || |
| 763 o->IsHeapNumber() || o->IsCode() || | 766 o->IsHeapNumber() || o->IsCode() || |
| 764 o->IsScopeInfo() || | 767 o->IsScopeInfo() || |
| 765 o->map() == | 768 o->map() == |
| 766 startup_serializer_->isolate()->heap()->fixed_cow_array_map(); | 769 startup_serializer_->isolate()->heap()->fixed_cow_array_map(); |
| 767 } | 770 } |
| 768 | 771 |
| 772 void SerializeOutdatedContextsAsFixedArray(); |
| 769 | 773 |
| 770 Serializer* startup_serializer_; | 774 Serializer* startup_serializer_; |
| 775 List<BackReference> outdated_contexts_; |
| 776 Object* global_object_; |
| 771 DISALLOW_COPY_AND_ASSIGN(PartialSerializer); | 777 DISALLOW_COPY_AND_ASSIGN(PartialSerializer); |
| 772 }; | 778 }; |
| 773 | 779 |
| 774 | 780 |
| 775 class StartupSerializer : public Serializer { | 781 class StartupSerializer : public Serializer { |
| 776 public: | 782 public: |
| 777 StartupSerializer(Isolate* isolate, SnapshotByteSink* sink) | 783 StartupSerializer(Isolate* isolate, SnapshotByteSink* sink) |
| 778 : Serializer(isolate, sink), root_index_wave_front_(0) { | 784 : Serializer(isolate, sink), root_index_wave_front_(0) { |
| 779 // Clear the cache of objects used by the partial snapshot. After the | 785 // Clear the cache of objects used by the partial snapshot. After the |
| 780 // strong roots have been serialized we can create a partial snapshot | 786 // strong roots have been serialized we can create a partial snapshot |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 static const int kCheckSumOffset = 0; | 945 static const int kCheckSumOffset = 0; |
| 940 static const int kNumInternalizedStringsOffset = 1; | 946 static const int kNumInternalizedStringsOffset = 1; |
| 941 static const int kReservationsOffset = 2; | 947 static const int kReservationsOffset = 2; |
| 942 static const int kNumCodeStubKeysOffset = 3; | 948 static const int kNumCodeStubKeysOffset = 3; |
| 943 static const int kPayloadLengthOffset = 4; | 949 static const int kPayloadLengthOffset = 4; |
| 944 static const int kHeaderSize = (kPayloadLengthOffset + 1) * kIntSize; | 950 static const int kHeaderSize = (kPayloadLengthOffset + 1) * kIntSize; |
| 945 }; | 951 }; |
| 946 } } // namespace v8::internal | 952 } } // namespace v8::internal |
| 947 | 953 |
| 948 #endif // V8_SERIALIZE_H_ | 954 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |