OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_SNAPSHOT_H_ | 5 #ifndef VM_SNAPSHOT_H_ |
6 #define VM_SNAPSHOT_H_ | 6 #define VM_SNAPSHOT_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
10 #include "vm/bitfield.h" | 10 #include "vm/bitfield.h" |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 | 561 |
562 DISALLOW_COPY_AND_ASSIGN(ForwardList); | 562 DISALLOW_COPY_AND_ASSIGN(ForwardList); |
563 }; | 563 }; |
564 | 564 |
565 | 565 |
566 class SnapshotWriter : public BaseWriter { | 566 class SnapshotWriter : public BaseWriter { |
567 protected: | 567 protected: |
568 SnapshotWriter(Snapshot::Kind kind, | 568 SnapshotWriter(Snapshot::Kind kind, |
569 uint8_t** buffer, | 569 uint8_t** buffer, |
570 ReAlloc alloc, | 570 ReAlloc alloc, |
571 intptr_t initial_size); | 571 intptr_t initial_size, |
| 572 bool can_send_any_object); |
572 | 573 |
573 public: | 574 public: |
574 // Snapshot kind. | 575 // Snapshot kind. |
575 Snapshot::Kind kind() const { return kind_; } | 576 Snapshot::Kind kind() const { return kind_; } |
576 | 577 |
577 // Serialize an object into the buffer. | 578 // Serialize an object into the buffer. |
578 void WriteObject(RawObject* raw); | 579 void WriteObject(RawObject* raw); |
579 | 580 |
580 uword GetObjectTags(RawObject* raw); | 581 uword GetObjectTags(RawObject* raw); |
581 | 582 |
582 Exceptions::ExceptionType exception_type() const { | 583 Exceptions::ExceptionType exception_type() const { |
583 return exception_type_; | 584 return exception_type_; |
584 } | 585 } |
585 void set_exception_type(Exceptions::ExceptionType type) { | 586 void set_exception_type(Exceptions::ExceptionType type) { |
586 exception_type_ = type; | 587 exception_type_ = type; |
587 } | 588 } |
588 const char* exception_msg() const { return exception_msg_; } | 589 const char* exception_msg() const { return exception_msg_; } |
589 void set_exception_msg(const char* msg) { | 590 void set_exception_msg(const char* msg) { |
590 exception_msg_ = msg; | 591 exception_msg_ = msg; |
591 } | 592 } |
| 593 bool can_send_any_object() const { return can_send_any_object_; } |
592 void ThrowException(Exceptions::ExceptionType type, const char* msg); | 594 void ThrowException(Exceptions::ExceptionType type, const char* msg); |
593 | 595 |
594 // Write a version string for the snapshot. | 596 // Write a version string for the snapshot. |
595 void WriteVersion(); | 597 void WriteVersion(); |
596 | 598 |
597 protected: | 599 protected: |
598 void UnmarkAll() { | 600 void UnmarkAll() { |
599 if (!unmarked_objects_) { | 601 if (!unmarked_objects_) { |
600 forward_list_.UnmarkAll(); | 602 forward_list_.UnmarkAll(); |
601 unmarked_objects_ = true; | 603 unmarked_objects_ = true; |
(...skipping 14 matching lines...) Expand all Loading... |
616 RawSmi* length, | 618 RawSmi* length, |
617 RawTypeArguments* type_arguments, | 619 RawTypeArguments* type_arguments, |
618 RawObject* data[]); | 620 RawObject* data[]); |
619 void CheckIfSerializable(RawClass* cls); | 621 void CheckIfSerializable(RawClass* cls); |
620 void SetWriteException(Exceptions::ExceptionType type, const char* msg); | 622 void SetWriteException(Exceptions::ExceptionType type, const char* msg); |
621 void WriteInstance(intptr_t object_id, | 623 void WriteInstance(intptr_t object_id, |
622 RawObject* raw, | 624 RawObject* raw, |
623 RawClass* cls, | 625 RawClass* cls, |
624 intptr_t tags); | 626 intptr_t tags); |
625 void WriteInstanceRef(RawObject* raw, RawClass* cls); | 627 void WriteInstanceRef(RawObject* raw, RawClass* cls); |
| 628 bool AllowObjectsInDartLibrary(RawLibrary* library); |
626 | 629 |
627 Isolate* isolate() const { return isolate_; } | 630 Isolate* isolate() const { return isolate_; } |
628 ObjectStore* object_store() const { return object_store_; } | 631 ObjectStore* object_store() const { return object_store_; } |
629 | 632 |
630 private: | 633 private: |
631 Snapshot::Kind kind_; | 634 Snapshot::Kind kind_; |
632 Isolate* isolate_; | 635 Isolate* isolate_; |
633 ObjectStore* object_store_; // Object store for common classes. | 636 ObjectStore* object_store_; // Object store for common classes. |
634 ClassTable* class_table_; // Class table for the class index to class lookup. | 637 ClassTable* class_table_; // Class table for the class index to class lookup. |
635 ForwardList forward_list_; | 638 ForwardList forward_list_; |
636 Exceptions::ExceptionType exception_type_; // Exception type. | 639 Exceptions::ExceptionType exception_type_; // Exception type. |
637 const char* exception_msg_; // Message associated with exception. | 640 const char* exception_msg_; // Message associated with exception. |
638 bool unmarked_objects_; // True if marked objects have been unmarked. | 641 bool unmarked_objects_; // True if marked objects have been unmarked. |
| 642 bool can_send_any_object_; // True if any Dart instance can be sent. |
639 | 643 |
640 friend class RawArray; | 644 friend class RawArray; |
641 friend class RawClass; | 645 friend class RawClass; |
642 friend class RawClosureData; | 646 friend class RawClosureData; |
643 friend class RawGrowableObjectArray; | 647 friend class RawGrowableObjectArray; |
644 friend class RawLinkedHashMap; | 648 friend class RawLinkedHashMap; |
645 friend class RawImmutableArray; | 649 friend class RawImmutableArray; |
646 friend class RawJSRegExp; | 650 friend class RawJSRegExp; |
647 friend class RawLibrary; | 651 friend class RawLibrary; |
648 friend class RawLiteralToken; | 652 friend class RawLiteralToken; |
649 friend class RawMirrorReference; | 653 friend class RawMirrorReference; |
650 friend class RawReceivePort; | 654 friend class RawReceivePort; |
651 friend class RawScript; | 655 friend class RawScript; |
652 friend class RawStacktrace; | 656 friend class RawStacktrace; |
653 friend class RawTokenStream; | 657 friend class RawTokenStream; |
654 friend class RawTypeArguments; | 658 friend class RawTypeArguments; |
655 friend class RawUserTag; | 659 friend class RawUserTag; |
656 friend class SnapshotWriterVisitor; | 660 friend class SnapshotWriterVisitor; |
657 friend class WriteInlinedObjectVisitor; | 661 friend class WriteInlinedObjectVisitor; |
658 DISALLOW_COPY_AND_ASSIGN(SnapshotWriter); | 662 DISALLOW_COPY_AND_ASSIGN(SnapshotWriter); |
659 }; | 663 }; |
660 | 664 |
661 | 665 |
662 class FullSnapshotWriter : public SnapshotWriter { | 666 class FullSnapshotWriter : public SnapshotWriter { |
663 public: | 667 public: |
664 static const intptr_t kInitialSize = 64 * KB; | 668 static const intptr_t kInitialSize = 64 * KB; |
665 FullSnapshotWriter(uint8_t** buffer, ReAlloc alloc) | 669 FullSnapshotWriter(uint8_t** buffer, ReAlloc alloc) |
666 : SnapshotWriter(Snapshot::kFull, buffer, alloc, kInitialSize) { | 670 : SnapshotWriter(Snapshot::kFull, buffer, alloc, kInitialSize, true) { |
667 ASSERT(buffer != NULL); | 671 ASSERT(buffer != NULL); |
668 ASSERT(alloc != NULL); | 672 ASSERT(alloc != NULL); |
669 } | 673 } |
670 ~FullSnapshotWriter() { } | 674 ~FullSnapshotWriter() { } |
671 | 675 |
672 // Writes a full snapshot of the Isolate. | 676 // Writes a full snapshot of the Isolate. |
673 void WriteFullSnapshot(); | 677 void WriteFullSnapshot(); |
674 | 678 |
675 private: | 679 private: |
676 DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter); | 680 DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter); |
677 }; | 681 }; |
678 | 682 |
679 | 683 |
680 class ScriptSnapshotWriter : public SnapshotWriter { | 684 class ScriptSnapshotWriter : public SnapshotWriter { |
681 public: | 685 public: |
682 static const intptr_t kInitialSize = 64 * KB; | 686 static const intptr_t kInitialSize = 64 * KB; |
683 ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc) | 687 ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc) |
684 : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize) { | 688 : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize, true) { |
685 ASSERT(buffer != NULL); | 689 ASSERT(buffer != NULL); |
686 ASSERT(alloc != NULL); | 690 ASSERT(alloc != NULL); |
687 } | 691 } |
688 ~ScriptSnapshotWriter() { } | 692 ~ScriptSnapshotWriter() { } |
689 | 693 |
690 // Writes a partial snapshot of the script. | 694 // Writes a partial snapshot of the script. |
691 void WriteScriptSnapshot(const Library& lib); | 695 void WriteScriptSnapshot(const Library& lib); |
692 | 696 |
693 private: | 697 private: |
694 DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter); | 698 DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter); |
695 }; | 699 }; |
696 | 700 |
697 | 701 |
698 class MessageWriter : public SnapshotWriter { | 702 class MessageWriter : public SnapshotWriter { |
699 public: | 703 public: |
700 static const intptr_t kInitialSize = 512; | 704 static const intptr_t kInitialSize = 512; |
701 MessageWriter(uint8_t** buffer, ReAlloc alloc) | 705 MessageWriter(uint8_t** buffer, ReAlloc alloc, bool can_send_any_object) |
702 : SnapshotWriter(Snapshot::kMessage, buffer, alloc, kInitialSize) { | 706 : SnapshotWriter(Snapshot::kMessage, |
| 707 buffer, |
| 708 alloc, |
| 709 kInitialSize, |
| 710 can_send_any_object) { |
703 ASSERT(buffer != NULL); | 711 ASSERT(buffer != NULL); |
704 ASSERT(alloc != NULL); | 712 ASSERT(alloc != NULL); |
705 } | 713 } |
706 ~MessageWriter() { } | 714 ~MessageWriter() { } |
707 | 715 |
708 void WriteMessage(const Object& obj); | 716 void WriteMessage(const Object& obj); |
709 | 717 |
710 private: | 718 private: |
711 DISALLOW_COPY_AND_ASSIGN(MessageWriter); | 719 DISALLOW_COPY_AND_ASSIGN(MessageWriter); |
712 }; | 720 }; |
(...skipping 18 matching lines...) Expand all Loading... |
731 private: | 739 private: |
732 SnapshotWriter* writer_; | 740 SnapshotWriter* writer_; |
733 bool as_references_; | 741 bool as_references_; |
734 | 742 |
735 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); | 743 DISALLOW_COPY_AND_ASSIGN(SnapshotWriterVisitor); |
736 }; | 744 }; |
737 | 745 |
738 } // namespace dart | 746 } // namespace dart |
739 | 747 |
740 #endif // VM_SNAPSHOT_H_ | 748 #endif // VM_SNAPSHOT_H_ |
OLD | NEW |