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