| 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 #include "vm/snapshot.h" | 5 #include "vm/snapshot.h" |
| 6 | 6 |
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/bootstrap.h" | 8 #include "vm/bootstrap.h" |
| 9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
| 10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 | 159 |
| 160 | 160 |
| 161 intptr_t BaseReader::ReadSmiValue() { | 161 intptr_t BaseReader::ReadSmiValue() { |
| 162 return Smi::Value(ReadAsSmi()); | 162 return Smi::Value(ReadAsSmi()); |
| 163 } | 163 } |
| 164 | 164 |
| 165 | 165 |
| 166 SnapshotReader::SnapshotReader( | 166 SnapshotReader::SnapshotReader( |
| 167 const uint8_t* buffer, | 167 const uint8_t* buffer, |
| 168 intptr_t size, | 168 intptr_t size, |
| 169 const uint8_t* instructions_buffer, | |
| 170 const uint8_t* data_buffer, | |
| 171 Snapshot::Kind kind, | 169 Snapshot::Kind kind, |
| 172 ZoneGrowableArray<BackRefNode>* backward_refs, | 170 ZoneGrowableArray<BackRefNode>* backward_refs, |
| 173 Thread* thread) | 171 Thread* thread) |
| 174 : BaseReader(buffer, size), | 172 : BaseReader(buffer, size), |
| 175 instructions_buffer_(instructions_buffer), | |
| 176 data_buffer_(data_buffer), | |
| 177 kind_(kind), | 173 kind_(kind), |
| 178 thread_(thread), | 174 thread_(thread), |
| 179 zone_(thread->zone()), | 175 zone_(thread->zone()), |
| 180 heap_(isolate()->heap()), | 176 heap_(isolate()->heap()), |
| 181 old_space_(thread_->isolate()->heap()->old_space()), | 177 old_space_(thread_->isolate()->heap()->old_space()), |
| 182 cls_(Class::Handle(zone_)), | 178 cls_(Class::Handle(zone_)), |
| 183 obj_(Object::Handle(zone_)), | 179 obj_(Object::Handle(zone_)), |
| 184 pobj_(PassiveObject::Handle(zone_)), | 180 pobj_(PassiveObject::Handle(zone_)), |
| 185 array_(Array::Handle(zone_)), | 181 array_(Array::Handle(zone_)), |
| 186 field_(Field::Handle(zone_)), | 182 field_(Field::Handle(zone_)), |
| 187 str_(String::Handle(zone_)), | 183 str_(String::Handle(zone_)), |
| 188 library_(Library::Handle(zone_)), | 184 library_(Library::Handle(zone_)), |
| 189 type_(AbstractType::Handle(zone_)), | 185 type_(AbstractType::Handle(zone_)), |
| 190 type_arguments_(TypeArguments::Handle(zone_)), | 186 type_arguments_(TypeArguments::Handle(zone_)), |
| 191 tokens_(GrowableObjectArray::Handle(zone_)), | 187 tokens_(GrowableObjectArray::Handle(zone_)), |
| 192 stream_(TokenStream::Handle(zone_)), | 188 stream_(TokenStream::Handle(zone_)), |
| 193 data_(ExternalTypedData::Handle(zone_)), | 189 data_(ExternalTypedData::Handle(zone_)), |
| 194 typed_data_(TypedData::Handle(zone_)), | 190 typed_data_(TypedData::Handle(zone_)), |
| 195 code_(Code::Handle(zone_)), | |
| 196 function_(Function::Handle(zone_)), | 191 function_(Function::Handle(zone_)), |
| 197 megamorphic_cache_(MegamorphicCache::Handle(zone_)), | |
| 198 error_(UnhandledException::Handle(zone_)), | 192 error_(UnhandledException::Handle(zone_)), |
| 199 max_vm_isolate_object_id_( | 193 max_vm_isolate_object_id_( |
| 200 (Snapshot::IsFull(kind)) ? | 194 (Snapshot::IsFull(kind)) ? |
| 201 Object::vm_isolate_snapshot_object_table().Length() : 0), | 195 Object::vm_isolate_snapshot_object_table().Length() : 0), |
| 202 backward_references_(backward_refs), | 196 backward_references_(backward_refs) { |
| 203 instructions_reader_(NULL) { | |
| 204 if (instructions_buffer != NULL) { | |
| 205 instructions_reader_ = | |
| 206 new InstructionsReader(instructions_buffer, data_buffer); | |
| 207 } | |
| 208 } | 197 } |
| 209 | 198 |
| 210 | 199 |
| 211 RawObject* SnapshotReader::ReadObject() { | 200 RawObject* SnapshotReader::ReadObject() { |
| 212 // Setup for long jump in case there is an exception while reading. | 201 // Setup for long jump in case there is an exception while reading. |
| 213 LongJumpScope jump; | 202 LongJumpScope jump; |
| 214 if (setjmp(*jump.Set()) == 0) { | 203 if (setjmp(*jump.Set()) == 0) { |
| 215 PassiveObject& obj = | 204 PassiveObject& obj = |
| 216 PassiveObject::Handle(zone(), ReadObjectImpl(kAsInlinedObject)); | 205 PassiveObject::Handle(zone(), ReadObjectImpl(kAsInlinedObject)); |
| 217 for (intptr_t i = 0; i < backward_references_->length(); i++) { | 206 for (intptr_t i = 0; i < backward_references_->length(); i++) { |
| 218 if (!(*backward_references_)[i].is_deserialized()) { | 207 if (!(*backward_references_)[i].is_deserialized()) { |
| 219 ReadObjectImpl(kAsInlinedObject); | 208 ReadObjectImpl(kAsInlinedObject); |
| 220 (*backward_references_)[i].set_state(kIsDeserialized); | 209 (*backward_references_)[i].set_state(kIsDeserialized); |
| 221 } | 210 } |
| 222 } | 211 } |
| 223 if (!Snapshot::IsFull(kind())) { | 212 ProcessDeferredCanonicalizations(); |
| 224 ProcessDeferredCanonicalizations(); | |
| 225 } | |
| 226 return obj.raw(); | 213 return obj.raw(); |
| 227 } else { | 214 } else { |
| 228 // An error occurred while reading, return the error object. | 215 // An error occurred while reading, return the error object. |
| 229 const Error& err = Error::Handle(thread()->sticky_error()); | 216 const Error& err = Error::Handle(thread()->sticky_error()); |
| 230 thread()->clear_sticky_error(); | 217 thread()->clear_sticky_error(); |
| 231 return err.raw(); | 218 return err.raw(); |
| 232 } | 219 } |
| 233 } | 220 } |
| 234 | 221 |
| 235 | 222 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 if (result == NULL) { | 460 if (result == NULL) { |
| 474 result = &(Instance::ZoneHandle(zone(), Instance::null())); | 461 result = &(Instance::ZoneHandle(zone(), Instance::null())); |
| 475 AddBackRef(object_id, result, state); | 462 AddBackRef(object_id, result, state); |
| 476 cls_ ^= ReadObjectImpl(kAsInlinedObject); | 463 cls_ ^= ReadObjectImpl(kAsInlinedObject); |
| 477 ASSERT(!cls_.IsNull()); | 464 ASSERT(!cls_.IsNull()); |
| 478 // Closure instances are handled by Closure::ReadFrom(). | 465 // Closure instances are handled by Closure::ReadFrom(). |
| 479 ASSERT(!cls_.IsClosureClass()); | 466 ASSERT(!cls_.IsClosureClass()); |
| 480 instance_size = cls_.instance_size(); | 467 instance_size = cls_.instance_size(); |
| 481 ASSERT(instance_size > 0); | 468 ASSERT(instance_size > 0); |
| 482 // Allocate the instance and read in all the fields for the object. | 469 // Allocate the instance and read in all the fields for the object. |
| 483 if (Snapshot::IsFull(kind_)) { | 470 *result ^= Object::Allocate(cls_.id(), instance_size, HEAP_SPACE(kind_)); |
| 484 *result ^= AllocateUninitialized(cls_.id(), instance_size); | |
| 485 } else { | |
| 486 *result ^= Object::Allocate(cls_.id(), instance_size, HEAP_SPACE(kind_)); | |
| 487 } | |
| 488 } else { | 471 } else { |
| 489 cls_ ^= ReadObjectImpl(kAsInlinedObject); | 472 cls_ ^= ReadObjectImpl(kAsInlinedObject); |
| 490 ASSERT(!cls_.IsNull()); | 473 ASSERT(!cls_.IsNull()); |
| 491 instance_size = cls_.instance_size(); | 474 instance_size = cls_.instance_size(); |
| 492 } | 475 } |
| 493 if (!as_reference) { | 476 if (!as_reference) { |
| 494 // Read all the individual fields for inlined objects. | 477 // Read all the individual fields for inlined objects. |
| 495 intptr_t next_field_offset = cls_.next_field_offset(); | 478 intptr_t next_field_offset = cls_.next_field_offset(); |
| 496 | 479 |
| 497 intptr_t type_argument_field_offset = cls_.type_arguments_field_offset(); | 480 intptr_t type_argument_field_offset = cls_.type_arguments_field_offset(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 515 field_ ^= array_.At(offset >> kWordSizeLog2); | 498 field_ ^= array_.At(offset >> kWordSizeLog2); |
| 516 ASSERT(!field_.IsNull()); | 499 ASSERT(!field_.IsNull()); |
| 517 ASSERT(field_.Offset() == offset); | 500 ASSERT(field_.Offset() == offset); |
| 518 obj_ = pobj_.raw(); | 501 obj_ = pobj_.raw(); |
| 519 field_.RecordStore(obj_); | 502 field_.RecordStore(obj_); |
| 520 } | 503 } |
| 521 // TODO(fschneider): Verify the guarded cid and length for other kinds of | 504 // TODO(fschneider): Verify the guarded cid and length for other kinds of |
| 522 // snapshot (kFull, kScript) with asserts. | 505 // snapshot (kFull, kScript) with asserts. |
| 523 offset += kWordSize; | 506 offset += kWordSize; |
| 524 } | 507 } |
| 525 if (Snapshot::IsFull(kind_)) { | |
| 526 // We create an uninitialized object in the case of full snapshots, so | |
| 527 // we need to initialize any remaining padding area with the Null object. | |
| 528 while (offset < instance_size) { | |
| 529 result->SetFieldAtOffset(offset, Object::null_object()); | |
| 530 offset += kWordSize; | |
| 531 } | |
| 532 } | |
| 533 if (RawObject::IsCanonical(tags)) { | 508 if (RawObject::IsCanonical(tags)) { |
| 534 if (Snapshot::IsFull(kind_)) { | 509 *result = result->CheckAndCanonicalize(thread(), NULL); |
| 535 result->SetCanonical(); | 510 ASSERT(!result->IsNull()); |
| 536 } else { | |
| 537 *result = result->CheckAndCanonicalize(thread(), NULL); | |
| 538 ASSERT(!result->IsNull()); | |
| 539 } | |
| 540 } | 511 } |
| 541 } | 512 } |
| 542 return result->raw(); | 513 return result->raw(); |
| 543 } | 514 } |
| 544 | 515 |
| 545 | 516 |
| 546 void SnapshotReader::AddBackRef(intptr_t id, | 517 void SnapshotReader::AddBackRef(intptr_t id, |
| 547 Object* obj, | 518 Object* obj, |
| 548 DeserializeState state, | 519 DeserializeState state, |
| 549 bool defer_canonicalization) { | 520 bool defer_canonicalization) { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 // allocate the error message in old space. | 645 // allocate the error message in old space. |
| 675 const String& msg = String::Handle(String::New(message_buffer, Heap::kOld)); | 646 const String& msg = String::Handle(String::New(message_buffer, Heap::kOld)); |
| 676 return ApiError::New(msg, Heap::kOld); | 647 return ApiError::New(msg, Heap::kOld); |
| 677 } | 648 } |
| 678 free(const_cast<char*>(expected_features)); | 649 free(const_cast<char*>(expected_features)); |
| 679 Advance(expected_len + 1); | 650 Advance(expected_len + 1); |
| 680 return ApiError::null(); | 651 return ApiError::null(); |
| 681 } | 652 } |
| 682 | 653 |
| 683 | 654 |
| 684 #define ALLOC_NEW_OBJECT_WITH_LEN(type, length) \ | |
| 685 ASSERT(Snapshot::IsFull(kind_)); \ | |
| 686 ASSERT_NO_SAFEPOINT_SCOPE(); \ | |
| 687 Raw##type* obj = reinterpret_cast<Raw##type*>( \ | |
| 688 AllocateUninitialized(k##type##Cid, type::InstanceSize(length))); \ | |
| 689 obj->StoreSmi(&(obj->ptr()->length_), Smi::New(length)); \ | |
| 690 return obj; \ | |
| 691 | |
| 692 | |
| 693 RawArray* SnapshotReader::NewArray(intptr_t len) { | |
| 694 ALLOC_NEW_OBJECT_WITH_LEN(Array, len); | |
| 695 } | |
| 696 | |
| 697 | |
| 698 RawImmutableArray* SnapshotReader::NewImmutableArray(intptr_t len) { | |
| 699 ALLOC_NEW_OBJECT_WITH_LEN(ImmutableArray, len); | |
| 700 } | |
| 701 | |
| 702 | |
| 703 RawOneByteString* SnapshotReader::NewOneByteString(intptr_t len) { | |
| 704 ALLOC_NEW_OBJECT_WITH_LEN(OneByteString, len); | |
| 705 } | |
| 706 | |
| 707 | |
| 708 RawTwoByteString* SnapshotReader::NewTwoByteString(intptr_t len) { | |
| 709 ALLOC_NEW_OBJECT_WITH_LEN(TwoByteString, len); | |
| 710 } | |
| 711 | |
| 712 | |
| 713 RawTypeArguments* SnapshotReader::NewTypeArguments(intptr_t len) { | |
| 714 ALLOC_NEW_OBJECT_WITH_LEN(TypeArguments, len); | |
| 715 } | |
| 716 | |
| 717 | |
| 718 RawObjectPool* SnapshotReader::NewObjectPool(intptr_t len) { | |
| 719 ASSERT(Snapshot::IsFull(kind_)); | |
| 720 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 721 RawObjectPool* obj = reinterpret_cast<RawObjectPool*>( | |
| 722 AllocateUninitialized(kObjectPoolCid, ObjectPool::InstanceSize(len))); | |
| 723 obj->ptr()->length_ = len; | |
| 724 return obj; | |
| 725 } | |
| 726 | |
| 727 | |
| 728 RawLocalVarDescriptors* SnapshotReader::NewLocalVarDescriptors( | |
| 729 intptr_t num_entries) { | |
| 730 ASSERT(Snapshot::IsFull(kind_)); | |
| 731 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 732 RawLocalVarDescriptors* obj = reinterpret_cast<RawLocalVarDescriptors*>( | |
| 733 AllocateUninitialized(kLocalVarDescriptorsCid, | |
| 734 LocalVarDescriptors::InstanceSize(num_entries))); | |
| 735 obj->ptr()->num_entries_ = num_entries; | |
| 736 return obj; | |
| 737 } | |
| 738 | |
| 739 | |
| 740 RawExceptionHandlers* SnapshotReader::NewExceptionHandlers( | |
| 741 intptr_t num_entries) { | |
| 742 ASSERT(Snapshot::IsFull(kind_)); | |
| 743 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 744 RawExceptionHandlers* obj = reinterpret_cast<RawExceptionHandlers*>( | |
| 745 AllocateUninitialized(kExceptionHandlersCid, | |
| 746 ExceptionHandlers::InstanceSize(num_entries))); | |
| 747 obj->ptr()->num_entries_ = num_entries; | |
| 748 return obj; | |
| 749 } | |
| 750 | |
| 751 | |
| 752 RawPcDescriptors* SnapshotReader::NewPcDescriptors(intptr_t len) { | |
| 753 ASSERT(Snapshot::IsFull(kind_)); | |
| 754 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 755 RawPcDescriptors* obj = reinterpret_cast<RawPcDescriptors*>( | |
| 756 AllocateUninitialized(kPcDescriptorsCid, | |
| 757 PcDescriptors::InstanceSize(len))); | |
| 758 obj->ptr()->length_ = len; | |
| 759 return obj; | |
| 760 } | |
| 761 | |
| 762 | |
| 763 RawCodeSourceMap* SnapshotReader::NewCodeSourceMap(intptr_t len) { | |
| 764 ASSERT(Snapshot::IsFull(kind_)); | |
| 765 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 766 RawCodeSourceMap* obj = reinterpret_cast<RawCodeSourceMap*>( | |
| 767 AllocateUninitialized(kCodeSourceMapCid, | |
| 768 CodeSourceMap::InstanceSize(len))); | |
| 769 obj->ptr()->length_ = len; | |
| 770 return obj; | |
| 771 } | |
| 772 | |
| 773 | |
| 774 RawStackmap* SnapshotReader::NewStackmap(intptr_t len) { | |
| 775 ASSERT(Snapshot::IsFull(kind_)); | |
| 776 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 777 RawStackmap* obj = reinterpret_cast<RawStackmap*>( | |
| 778 AllocateUninitialized(kStackmapCid, Stackmap::InstanceSize(len))); | |
| 779 obj->ptr()->length_ = len; | |
| 780 return obj; | |
| 781 } | |
| 782 | |
| 783 | |
| 784 RawContextScope* SnapshotReader::NewContextScope(intptr_t num_variables) { | |
| 785 ASSERT(Snapshot::IsFull(kind_)); | |
| 786 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 787 RawContextScope* obj = reinterpret_cast<RawContextScope*>( | |
| 788 AllocateUninitialized(kContextScopeCid, | |
| 789 ContextScope::InstanceSize(num_variables))); | |
| 790 obj->ptr()->num_variables_ = num_variables; | |
| 791 return obj; | |
| 792 } | |
| 793 | |
| 794 | |
| 795 RawCode* SnapshotReader::NewCode(intptr_t pointer_offsets_length) { | |
| 796 ASSERT(pointer_offsets_length == 0); | |
| 797 ASSERT(Snapshot::IsFull(kind_)); | |
| 798 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 799 RawCode* obj = reinterpret_cast<RawCode*>( | |
| 800 AllocateUninitialized(kCodeCid, Code::InstanceSize(0))); | |
| 801 return obj; | |
| 802 } | |
| 803 | |
| 804 | |
| 805 RawTokenStream* SnapshotReader::NewTokenStream(intptr_t len) { | |
| 806 ASSERT(Snapshot::IsFull(kind_)); | |
| 807 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 808 stream_ = reinterpret_cast<RawTokenStream*>( | |
| 809 AllocateUninitialized(kTokenStreamCid, TokenStream::InstanceSize())); | |
| 810 uint8_t* array = const_cast<uint8_t*>(CurrentBufferAddress()); | |
| 811 ASSERT(array != NULL); | |
| 812 Advance(len); | |
| 813 data_ = reinterpret_cast<RawExternalTypedData*>( | |
| 814 AllocateUninitialized(kExternalTypedDataUint8ArrayCid, | |
| 815 ExternalTypedData::InstanceSize())); | |
| 816 data_.SetData(array); | |
| 817 data_.SetLength(len); | |
| 818 stream_.SetStream(data_); | |
| 819 return stream_.raw(); | |
| 820 } | |
| 821 | |
| 822 | |
| 823 RawContext* SnapshotReader::NewContext(intptr_t num_variables) { | |
| 824 ASSERT(Snapshot::IsFull(kind_)); | |
| 825 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 826 RawContext* obj = reinterpret_cast<RawContext*>( | |
| 827 AllocateUninitialized(kContextCid, Context::InstanceSize(num_variables))); | |
| 828 obj->ptr()->num_variables_ = num_variables; | |
| 829 return obj; | |
| 830 } | |
| 831 | |
| 832 | |
| 833 RawClass* SnapshotReader::NewClass(intptr_t class_id) { | |
| 834 ASSERT(Snapshot::IsFull(kind_)); | |
| 835 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 836 if (class_id < kNumPredefinedCids) { | |
| 837 ASSERT((class_id >= kInstanceCid) && | |
| 838 (class_id <= kNullCid)); | |
| 839 return isolate()->class_table()->At(class_id); | |
| 840 } | |
| 841 RawClass* obj = reinterpret_cast<RawClass*>( | |
| 842 AllocateUninitialized(kClassCid, Class::InstanceSize())); | |
| 843 Instance fake; | |
| 844 obj->ptr()->handle_vtable_ = fake.vtable(); | |
| 845 cls_ = obj; | |
| 846 cls_.set_id(class_id); | |
| 847 isolate()->RegisterClassAt(class_id, cls_); | |
| 848 return cls_.raw(); | |
| 849 } | |
| 850 | |
| 851 | |
| 852 RawInstance* SnapshotReader::NewInstance() { | |
| 853 ASSERT(Snapshot::IsFull(kind_)); | |
| 854 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 855 RawInstance* obj = reinterpret_cast<RawInstance*>( | |
| 856 AllocateUninitialized(kInstanceCid, Instance::InstanceSize())); | |
| 857 return obj; | |
| 858 } | |
| 859 | |
| 860 | |
| 861 RawMint* SnapshotReader::NewMint(int64_t value) { | |
| 862 ASSERT(Snapshot::IsFull(kind_)); | |
| 863 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 864 RawMint* obj = reinterpret_cast<RawMint*>( | |
| 865 AllocateUninitialized(kMintCid, Mint::InstanceSize())); | |
| 866 obj->ptr()->value_ = value; | |
| 867 return obj; | |
| 868 } | |
| 869 | |
| 870 | |
| 871 RawDouble* SnapshotReader::NewDouble(double value) { | |
| 872 ASSERT(Snapshot::IsFull(kind_)); | |
| 873 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 874 RawDouble* obj = reinterpret_cast<RawDouble*>( | |
| 875 AllocateUninitialized(kDoubleCid, Double::InstanceSize())); | |
| 876 obj->ptr()->value_ = value; | |
| 877 return obj; | |
| 878 } | |
| 879 | |
| 880 | |
| 881 RawTypedData* SnapshotReader::NewTypedData(intptr_t class_id, intptr_t len) { | |
| 882 ASSERT(Snapshot::IsFull(kind_)); | |
| 883 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 884 const intptr_t lengthInBytes = len * TypedData::ElementSizeInBytes(class_id); | |
| 885 RawTypedData* obj = reinterpret_cast<RawTypedData*>( | |
| 886 AllocateUninitialized(class_id, TypedData::InstanceSize(lengthInBytes))); | |
| 887 obj->StoreSmi(&(obj->ptr()->length_), Smi::New(len)); | |
| 888 return obj; | |
| 889 } | |
| 890 | |
| 891 | |
| 892 #define ALLOC_NEW_OBJECT(type) \ | |
| 893 ASSERT(Snapshot::IsFull(kind_)); \ | |
| 894 ASSERT_NO_SAFEPOINT_SCOPE(); \ | |
| 895 return reinterpret_cast<Raw##type*>( \ | |
| 896 AllocateUninitialized(k##type##Cid, type::InstanceSize())); \ | |
| 897 | |
| 898 | |
| 899 RawBigint* SnapshotReader::NewBigint() { | |
| 900 ALLOC_NEW_OBJECT(Bigint); | |
| 901 } | |
| 902 | |
| 903 | |
| 904 RawUnresolvedClass* SnapshotReader::NewUnresolvedClass() { | |
| 905 ALLOC_NEW_OBJECT(UnresolvedClass); | |
| 906 } | |
| 907 | |
| 908 | |
| 909 RawType* SnapshotReader::NewType() { | |
| 910 ALLOC_NEW_OBJECT(Type); | |
| 911 } | |
| 912 | |
| 913 | |
| 914 RawTypeRef* SnapshotReader::NewTypeRef() { | |
| 915 ALLOC_NEW_OBJECT(TypeRef); | |
| 916 } | |
| 917 | |
| 918 | |
| 919 RawTypeParameter* SnapshotReader::NewTypeParameter() { | |
| 920 ALLOC_NEW_OBJECT(TypeParameter); | |
| 921 } | |
| 922 | |
| 923 | |
| 924 RawBoundedType* SnapshotReader::NewBoundedType() { | |
| 925 ALLOC_NEW_OBJECT(BoundedType); | |
| 926 } | |
| 927 | |
| 928 | |
| 929 RawMixinAppType* SnapshotReader::NewMixinAppType() { | |
| 930 ALLOC_NEW_OBJECT(MixinAppType); | |
| 931 } | |
| 932 | |
| 933 | |
| 934 RawPatchClass* SnapshotReader::NewPatchClass() { | |
| 935 ALLOC_NEW_OBJECT(PatchClass); | |
| 936 } | |
| 937 | |
| 938 | |
| 939 RawClosure* SnapshotReader::NewClosure() { | |
| 940 ALLOC_NEW_OBJECT(Closure); | |
| 941 } | |
| 942 | |
| 943 | |
| 944 RawClosureData* SnapshotReader::NewClosureData() { | |
| 945 ALLOC_NEW_OBJECT(ClosureData); | |
| 946 } | |
| 947 | |
| 948 | |
| 949 RawRedirectionData* SnapshotReader::NewRedirectionData() { | |
| 950 ALLOC_NEW_OBJECT(RedirectionData); | |
| 951 } | |
| 952 | |
| 953 | |
| 954 RawFunction* SnapshotReader::NewFunction() { | |
| 955 ALLOC_NEW_OBJECT(Function); | |
| 956 } | |
| 957 | |
| 958 | |
| 959 RawICData* SnapshotReader::NewICData() { | |
| 960 ALLOC_NEW_OBJECT(ICData); | |
| 961 } | |
| 962 | |
| 963 | |
| 964 RawLinkedHashMap* SnapshotReader::NewLinkedHashMap() { | |
| 965 ALLOC_NEW_OBJECT(LinkedHashMap); | |
| 966 } | |
| 967 | |
| 968 | |
| 969 RawMegamorphicCache* SnapshotReader::NewMegamorphicCache() { | |
| 970 ALLOC_NEW_OBJECT(MegamorphicCache); | |
| 971 } | |
| 972 | |
| 973 | |
| 974 RawSubtypeTestCache* SnapshotReader::NewSubtypeTestCache() { | |
| 975 ALLOC_NEW_OBJECT(SubtypeTestCache); | |
| 976 } | |
| 977 | |
| 978 | |
| 979 RawField* SnapshotReader::NewField() { | |
| 980 ALLOC_NEW_OBJECT(Field); | |
| 981 } | |
| 982 | |
| 983 | |
| 984 RawLibrary* SnapshotReader::NewLibrary() { | |
| 985 ALLOC_NEW_OBJECT(Library); | |
| 986 } | |
| 987 | |
| 988 | |
| 989 RawLibraryPrefix* SnapshotReader::NewLibraryPrefix() { | |
| 990 ALLOC_NEW_OBJECT(LibraryPrefix); | |
| 991 } | |
| 992 | |
| 993 | |
| 994 RawNamespace* SnapshotReader::NewNamespace() { | |
| 995 ALLOC_NEW_OBJECT(Namespace); | |
| 996 } | |
| 997 | |
| 998 | |
| 999 RawScript* SnapshotReader::NewScript() { | |
| 1000 ALLOC_NEW_OBJECT(Script); | |
| 1001 } | |
| 1002 | |
| 1003 | |
| 1004 RawLiteralToken* SnapshotReader::NewLiteralToken() { | |
| 1005 ALLOC_NEW_OBJECT(LiteralToken); | |
| 1006 } | |
| 1007 | |
| 1008 | |
| 1009 RawGrowableObjectArray* SnapshotReader::NewGrowableObjectArray() { | |
| 1010 ALLOC_NEW_OBJECT(GrowableObjectArray); | |
| 1011 } | |
| 1012 | |
| 1013 | |
| 1014 RawWeakProperty* SnapshotReader::NewWeakProperty() { | |
| 1015 ALLOC_NEW_OBJECT(WeakProperty); | |
| 1016 } | |
| 1017 | |
| 1018 | |
| 1019 RawRegExp* SnapshotReader::NewRegExp() { | |
| 1020 ALLOC_NEW_OBJECT(RegExp); | |
| 1021 } | |
| 1022 | |
| 1023 | |
| 1024 RawFloat32x4* SnapshotReader::NewFloat32x4(float v0, float v1, float v2, | |
| 1025 float v3) { | |
| 1026 ASSERT(Snapshot::IsFull(kind_)); | |
| 1027 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 1028 RawFloat32x4* obj = reinterpret_cast<RawFloat32x4*>( | |
| 1029 AllocateUninitialized(kFloat32x4Cid, Float32x4::InstanceSize())); | |
| 1030 obj->ptr()->value_[0] = v0; | |
| 1031 obj->ptr()->value_[1] = v1; | |
| 1032 obj->ptr()->value_[2] = v2; | |
| 1033 obj->ptr()->value_[3] = v3; | |
| 1034 return obj; | |
| 1035 } | |
| 1036 | |
| 1037 | |
| 1038 RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2, | |
| 1039 uint32_t v3) { | |
| 1040 ASSERT(Snapshot::IsFull(kind_)); | |
| 1041 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 1042 RawInt32x4* obj = reinterpret_cast<RawInt32x4*>( | |
| 1043 AllocateUninitialized(kInt32x4Cid, Int32x4::InstanceSize())); | |
| 1044 obj->ptr()->value_[0] = v0; | |
| 1045 obj->ptr()->value_[1] = v1; | |
| 1046 obj->ptr()->value_[2] = v2; | |
| 1047 obj->ptr()->value_[3] = v3; | |
| 1048 return obj; | |
| 1049 } | |
| 1050 | |
| 1051 | |
| 1052 RawFloat64x2* SnapshotReader::NewFloat64x2(double v0, double v1) { | |
| 1053 ASSERT(Snapshot::IsFull(kind_)); | |
| 1054 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 1055 RawFloat64x2* obj = reinterpret_cast<RawFloat64x2*>( | |
| 1056 AllocateUninitialized(kFloat64x2Cid, Float64x2::InstanceSize())); | |
| 1057 obj->ptr()->value_[0] = v0; | |
| 1058 obj->ptr()->value_[1] = v1; | |
| 1059 return obj; | |
| 1060 } | |
| 1061 | |
| 1062 | |
| 1063 RawApiError* SnapshotReader::NewApiError() { | |
| 1064 ALLOC_NEW_OBJECT(ApiError); | |
| 1065 } | |
| 1066 | |
| 1067 | |
| 1068 RawLanguageError* SnapshotReader::NewLanguageError() { | |
| 1069 ALLOC_NEW_OBJECT(LanguageError); | |
| 1070 } | |
| 1071 | |
| 1072 | |
| 1073 RawUnhandledException* SnapshotReader::NewUnhandledException() { | |
| 1074 ALLOC_NEW_OBJECT(UnhandledException); | |
| 1075 } | |
| 1076 | |
| 1077 | |
| 1078 RawObject* SnapshotReader::NewInteger(int64_t value) { | 655 RawObject* SnapshotReader::NewInteger(int64_t value) { |
| 1079 ASSERT((value & kSmiTagMask) == kSmiTag); | 656 ASSERT((value & kSmiTagMask) == kSmiTag); |
| 1080 value = value >> kSmiTagShift; | 657 value = value >> kSmiTagShift; |
| 1081 if (Smi::IsValid(value)) { | 658 if (Smi::IsValid(value)) { |
| 1082 return Smi::New(static_cast<intptr_t>(value)); | 659 return Smi::New(static_cast<intptr_t>(value)); |
| 1083 } | 660 } |
| 1084 if (Snapshot::IsFull(kind_)) { | |
| 1085 return NewMint(value); | |
| 1086 } | |
| 1087 return Mint::NewCanonical(value); | 661 return Mint::NewCanonical(value); |
| 1088 } | 662 } |
| 1089 | 663 |
| 1090 | 664 |
| 1091 RawStacktrace* SnapshotReader::NewStacktrace() { | |
| 1092 ALLOC_NEW_OBJECT(Stacktrace); | |
| 1093 } | |
| 1094 | |
| 1095 | |
| 1096 int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions, | 665 int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions, |
| 1097 RawCode* code) { | 666 RawCode* code) { |
| 1098 #if defined(PRODUCT) | 667 #if defined(PRODUCT) |
| 1099 // Instructions are only dedup in product mode because it obfuscates profiler | 668 // Instructions are only dedup in product mode because it obfuscates profiler |
| 1100 // results. | 669 // results. |
| 1101 for (intptr_t i = 0; i < instructions_.length(); i++) { | 670 for (intptr_t i = 0; i < instructions_.length(); i++) { |
| 1102 if (instructions_[i].raw_insns_ == instructions) { | 671 if (instructions_[i].raw_insns_ == instructions) { |
| 1103 return instructions_[i].offset_; | 672 return instructions_[i].offset_; |
| 1104 } | 673 } |
| 1105 } | 674 } |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1415 ASSERT(IsSingletonClassId(class_id)); | 984 ASSERT(IsSingletonClassId(class_id)); |
| 1416 return class_id; | 985 return class_id; |
| 1417 } | 986 } |
| 1418 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId); | 987 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId); |
| 1419 intptr_t class_id = SerializedHeaderData::decode(class_header); | 988 intptr_t class_id = SerializedHeaderData::decode(class_header); |
| 1420 ASSERT(IsObjectStoreClassId(class_id) || IsSingletonClassId(class_id)); | 989 ASSERT(IsObjectStoreClassId(class_id) || IsSingletonClassId(class_id)); |
| 1421 return class_id; | 990 return class_id; |
| 1422 } | 991 } |
| 1423 | 992 |
| 1424 | 993 |
| 1425 RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id, | |
| 1426 intptr_t size) { | |
| 1427 ASSERT_NO_SAFEPOINT_SCOPE(); | |
| 1428 ASSERT(Utils::IsAligned(size, kObjectAlignment)); | |
| 1429 | |
| 1430 uword address = | |
| 1431 old_space()->TryAllocateDataBumpLocked(size, PageSpace::kForceGrowth); | |
| 1432 if (address == 0) { | |
| 1433 // Use the preallocated out of memory exception to avoid calling | |
| 1434 // into dart code or allocating any code. | |
| 1435 // We do a longjmp at this point to unwind out of the entire | |
| 1436 // read part and return the error object back. | |
| 1437 const UnhandledException& error = UnhandledException::Handle( | |
| 1438 object_store()->preallocated_unhandled_exception()); | |
| 1439 thread()->long_jump_base()->Jump(1, error); | |
| 1440 } | |
| 1441 | |
| 1442 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | |
| 1443 uword tags = 0; | |
| 1444 ASSERT(class_id != kIllegalCid); | |
| 1445 tags = RawObject::ClassIdTag::update(class_id, tags); | |
| 1446 tags = RawObject::SizeTag::update(size, tags); | |
| 1447 tags = RawObject::VMHeapObjectTag::update(is_vm_isolate(), tags); | |
| 1448 raw_obj->ptr()->tags_ = tags; | |
| 1449 return raw_obj; | |
| 1450 } | |
| 1451 | |
| 1452 | |
| 1453 #define READ_VM_SINGLETON_OBJ(id, obj) \ | 994 #define READ_VM_SINGLETON_OBJ(id, obj) \ |
| 1454 if (object_id == id) { \ | 995 if (object_id == id) { \ |
| 1455 return obj; \ | 996 return obj; \ |
| 1456 } \ | 997 } \ |
| 1457 | 998 |
| 1458 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) { | 999 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) { |
| 1459 intptr_t object_id = GetVMIsolateObjectId(header_value); | 1000 intptr_t object_id = GetVMIsolateObjectId(header_value); |
| 1460 | 1001 |
| 1461 // First check if it is one of the singleton objects. | 1002 // First check if it is one of the singleton objects. |
| 1462 READ_VM_SINGLETON_OBJ(kNullObject, Object::null()); | 1003 READ_VM_SINGLETON_OBJ(kNullObject, Object::null()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1513 } | 1054 } |
| 1514 | 1055 |
| 1515 | 1056 |
| 1516 RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id, | 1057 RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id, |
| 1517 intptr_t patch_object_id, | 1058 intptr_t patch_object_id, |
| 1518 intptr_t patch_offset) { | 1059 intptr_t patch_offset) { |
| 1519 intptr_t class_id = ClassIdFromObjectId(object_id); | 1060 intptr_t class_id = ClassIdFromObjectId(object_id); |
| 1520 if (IsObjectStoreClassId(class_id)) { | 1061 if (IsObjectStoreClassId(class_id)) { |
| 1521 return isolate()->class_table()->At(class_id); // get singleton class. | 1062 return isolate()->class_table()->At(class_id); // get singleton class. |
| 1522 } | 1063 } |
| 1523 if (!Snapshot::IsFull(kind_)) { | 1064 if (IsObjectStoreTypeId(object_id)) { |
| 1524 if (IsObjectStoreTypeId(object_id)) { | 1065 return GetType(object_store(), object_id); // return type obj. |
| 1525 return GetType(object_store(), object_id); // return type obj. | |
| 1526 } | |
| 1527 } | 1066 } |
| 1528 ASSERT(object_id >= kMaxPredefinedObjectIds); | 1067 ASSERT(object_id >= kMaxPredefinedObjectIds); |
| 1529 intptr_t index = (object_id - kMaxPredefinedObjectIds); | 1068 intptr_t index = (object_id - kMaxPredefinedObjectIds); |
| 1530 if (index < max_vm_isolate_object_id_) { | 1069 if (index < max_vm_isolate_object_id_) { |
| 1531 return VmIsolateSnapshotObject(index); | 1070 return VmIsolateSnapshotObject(index); |
| 1532 } | 1071 } |
| 1533 AddPatchRecord(object_id, patch_object_id, patch_offset); | 1072 AddPatchRecord(object_id, patch_object_id, patch_offset); |
| 1534 return GetBackRef(object_id)->raw(); | 1073 return GetBackRef(object_id)->raw(); |
| 1535 } | 1074 } |
| 1536 | 1075 |
| 1537 | 1076 |
| 1538 void SnapshotReader::AddPatchRecord(intptr_t object_id, | 1077 void SnapshotReader::AddPatchRecord(intptr_t object_id, |
| 1539 intptr_t patch_object_id, | 1078 intptr_t patch_object_id, |
| 1540 intptr_t patch_offset) { | 1079 intptr_t patch_offset) { |
| 1541 if (patch_object_id != kInvalidPatchIndex && !Snapshot::IsFull(kind())) { | 1080 if (patch_object_id != kInvalidPatchIndex) { |
| 1542 ASSERT(object_id >= kMaxPredefinedObjectIds); | 1081 ASSERT(object_id >= kMaxPredefinedObjectIds); |
| 1543 intptr_t index = (object_id - kMaxPredefinedObjectIds); | 1082 intptr_t index = (object_id - kMaxPredefinedObjectIds); |
| 1544 ASSERT(index >= max_vm_isolate_object_id_); | 1083 ASSERT(index >= max_vm_isolate_object_id_); |
| 1545 index -= max_vm_isolate_object_id_; | 1084 index -= max_vm_isolate_object_id_; |
| 1546 ASSERT(index < backward_references_->length()); | 1085 ASSERT(index < backward_references_->length()); |
| 1547 BackRefNode& ref = (*backward_references_)[index]; | 1086 BackRefNode& ref = (*backward_references_)[index]; |
| 1548 ref.AddPatchRecord(patch_object_id, patch_offset); | 1087 ref.AddPatchRecord(patch_object_id, patch_offset); |
| 1549 } | 1088 } |
| 1550 } | 1089 } |
| 1551 | 1090 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 result.SetAt(i, *PassiveObjectHandle()); | 1155 result.SetAt(i, *PassiveObjectHandle()); |
| 1617 } | 1156 } |
| 1618 } | 1157 } |
| 1619 | 1158 |
| 1620 | 1159 |
| 1621 ScriptSnapshotReader::ScriptSnapshotReader(const uint8_t* buffer, | 1160 ScriptSnapshotReader::ScriptSnapshotReader(const uint8_t* buffer, |
| 1622 intptr_t size, | 1161 intptr_t size, |
| 1623 Thread* thread) | 1162 Thread* thread) |
| 1624 : SnapshotReader(buffer, | 1163 : SnapshotReader(buffer, |
| 1625 size, | 1164 size, |
| 1626 NULL, /* instructions_buffer */ | |
| 1627 NULL, /* data_buffer */ | |
| 1628 Snapshot::kScript, | 1165 Snapshot::kScript, |
| 1629 new ZoneGrowableArray<BackRefNode>(kNumInitialReferences), | 1166 new ZoneGrowableArray<BackRefNode>(kNumInitialReferences), |
| 1630 thread) { | 1167 thread) { |
| 1631 } | 1168 } |
| 1632 | 1169 |
| 1633 | 1170 |
| 1634 ScriptSnapshotReader::~ScriptSnapshotReader() { | 1171 ScriptSnapshotReader::~ScriptSnapshotReader() { |
| 1635 ResetBackwardReferenceTable(); | 1172 ResetBackwardReferenceTable(); |
| 1636 } | 1173 } |
| 1637 | 1174 |
| 1638 | 1175 |
| 1639 MessageSnapshotReader::MessageSnapshotReader(const uint8_t* buffer, | 1176 MessageSnapshotReader::MessageSnapshotReader(const uint8_t* buffer, |
| 1640 intptr_t size, | 1177 intptr_t size, |
| 1641 Thread* thread) | 1178 Thread* thread) |
| 1642 : SnapshotReader(buffer, | 1179 : SnapshotReader(buffer, |
| 1643 size, | 1180 size, |
| 1644 NULL, /* instructions_buffer */ | |
| 1645 NULL, /* data_buffer */ | |
| 1646 Snapshot::kMessage, | 1181 Snapshot::kMessage, |
| 1647 new ZoneGrowableArray<BackRefNode>(kNumInitialReferences), | 1182 new ZoneGrowableArray<BackRefNode>(kNumInitialReferences), |
| 1648 thread) { | 1183 thread) { |
| 1649 } | 1184 } |
| 1650 | 1185 |
| 1651 | 1186 |
| 1652 MessageSnapshotReader::~MessageSnapshotReader() { | 1187 MessageSnapshotReader::~MessageSnapshotReader() { |
| 1653 ResetBackwardReferenceTable(); | 1188 ResetBackwardReferenceTable(); |
| 1654 } | 1189 } |
| 1655 | 1190 |
| 1656 | 1191 |
| 1657 SnapshotWriter::SnapshotWriter(Thread* thread, | 1192 SnapshotWriter::SnapshotWriter(Thread* thread, |
| 1658 Snapshot::Kind kind, | 1193 Snapshot::Kind kind, |
| 1659 uint8_t** buffer, | 1194 uint8_t** buffer, |
| 1660 ReAlloc alloc, | 1195 ReAlloc alloc, |
| 1661 intptr_t initial_size, | 1196 intptr_t initial_size, |
| 1662 ForwardList* forward_list, | 1197 ForwardList* forward_list, |
| 1663 InstructionsWriter* instructions_writer, | 1198 bool can_send_any_object) |
| 1664 bool can_send_any_object, | |
| 1665 bool writing_vm_isolate) | |
| 1666 : BaseWriter(buffer, alloc, initial_size), | 1199 : BaseWriter(buffer, alloc, initial_size), |
| 1667 thread_(thread), | 1200 thread_(thread), |
| 1668 kind_(kind), | 1201 kind_(kind), |
| 1669 object_store_(isolate()->object_store()), | 1202 object_store_(isolate()->object_store()), |
| 1670 class_table_(isolate()->class_table()), | 1203 class_table_(isolate()->class_table()), |
| 1671 forward_list_(forward_list), | 1204 forward_list_(forward_list), |
| 1672 instructions_writer_(instructions_writer), | |
| 1673 exception_type_(Exceptions::kNone), | 1205 exception_type_(Exceptions::kNone), |
| 1674 exception_msg_(NULL), | 1206 exception_msg_(NULL), |
| 1675 unmarked_objects_(false), | 1207 can_send_any_object_(can_send_any_object) { |
| 1676 can_send_any_object_(can_send_any_object), | |
| 1677 writing_vm_isolate_(writing_vm_isolate) { | |
| 1678 ASSERT(forward_list_ != NULL); | 1208 ASSERT(forward_list_ != NULL); |
| 1679 } | 1209 } |
| 1680 | 1210 |
| 1681 | 1211 |
| 1682 void SnapshotWriter::WriteObject(RawObject* rawobj) { | 1212 void SnapshotWriter::WriteObject(RawObject* rawobj) { |
| 1683 WriteObjectImpl(rawobj, kAsInlinedObject); | 1213 WriteObjectImpl(rawobj, kAsInlinedObject); |
| 1684 WriteForwardedObjects(); | 1214 WriteForwardedObjects(); |
| 1685 } | 1215 } |
| 1686 | 1216 |
| 1687 | 1217 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1759 } | 1289 } |
| 1760 | 1290 |
| 1761 // Check if it is a singleton ICData array object. | 1291 // Check if it is a singleton ICData array object. |
| 1762 for (intptr_t i = 0; i < ICData::kCachedICDataArrayCount; i++) { | 1292 for (intptr_t i = 0; i < ICData::kCachedICDataArrayCount; i++) { |
| 1763 if (rawobj == ICData::cached_icdata_arrays_[i]) { | 1293 if (rawobj == ICData::cached_icdata_arrays_[i]) { |
| 1764 WriteVMIsolateObject(kCachedICDataArray0 + i); | 1294 WriteVMIsolateObject(kCachedICDataArray0 + i); |
| 1765 return true; | 1295 return true; |
| 1766 } | 1296 } |
| 1767 } | 1297 } |
| 1768 | 1298 |
| 1769 if (writing_vm_isolate_) { | 1299 // In the case of script snapshots or for messages we do not use |
| 1770 // When we are writing the VM isolate snapshot, write out the object | 1300 // the index into the vm isolate snapshot object table, instead we |
| 1771 // itself instead of a VM object id. | 1301 // explicitly write the object out. |
| 1772 return false; | 1302 intptr_t object_id = forward_list_->FindObject(rawobj); |
| 1773 } | 1303 if (object_id != -1) { |
| 1774 | 1304 WriteIndexedObject(object_id); |
| 1775 if (Snapshot::IsFull(kind())) { | 1305 return true; |
| 1776 // Check it is a predefined symbol in the VM isolate. | |
| 1777 id = Symbols::LookupPredefinedSymbol(rawobj); | |
| 1778 if (id != kInvalidIndex) { | |
| 1779 WriteVMIsolateObject(id); | |
| 1780 return true; | |
| 1781 } | |
| 1782 | |
| 1783 // Check if it is an object from the vm isolate snapshot object table. | |
| 1784 id = FindVmSnapshotObject(rawobj); | |
| 1785 if (id != kInvalidIndex) { | |
| 1786 WriteIndexedObject(id); | |
| 1787 return true; | |
| 1788 } | |
| 1789 } else { | 1306 } else { |
| 1790 // In the case of script snapshots or for messages we do not use | 1307 switch (id) { |
| 1791 // the index into the vm isolate snapshot object table, instead we | 1308 VM_OBJECT_CLASS_LIST(VM_OBJECT_WRITE) |
| 1792 // explicitly write the object out. | 1309 case kTypedDataUint32ArrayCid: { |
| 1793 intptr_t object_id = forward_list_->FindObject(rawobj); | 1310 object_id = forward_list_->AddObject(zone(), rawobj, kIsSerialized); |
| 1794 if (object_id != -1) { | 1311 RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(rawobj); |
| 1795 WriteIndexedObject(object_id); | 1312 raw_obj->WriteTo(this, object_id, kind(), false); |
| 1796 return true; | 1313 return true; |
| 1797 } else { | |
| 1798 switch (id) { | |
| 1799 VM_OBJECT_CLASS_LIST(VM_OBJECT_WRITE) | |
| 1800 case kTypedDataUint32ArrayCid: { | |
| 1801 object_id = forward_list_->AddObject(zone(), rawobj, kIsSerialized); | |
| 1802 RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(rawobj); | |
| 1803 raw_obj->WriteTo(this, object_id, kind(), false); | |
| 1804 return true; | |
| 1805 } | |
| 1806 default: | |
| 1807 OS::Print("class id = %" Pd "\n", id); | |
| 1808 break; | |
| 1809 } | 1314 } |
| 1315 default: |
| 1316 OS::Print("class id = %" Pd "\n", id); |
| 1317 break; |
| 1810 } | 1318 } |
| 1811 } | 1319 } |
| 1812 | 1320 |
| 1813 const Object& obj = Object::Handle(rawobj); | 1321 const Object& obj = Object::Handle(rawobj); |
| 1814 FATAL1("Unexpected reference to object in VM isolate: %s\n", obj.ToCString()); | 1322 FATAL1("Unexpected reference to object in VM isolate: %s\n", obj.ToCString()); |
| 1815 return false; | 1323 return false; |
| 1816 } | 1324 } |
| 1817 | 1325 |
| 1818 #undef VM_OBJECT_WRITE | 1326 #undef VM_OBJECT_WRITE |
| 1819 | 1327 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1923 } | 1431 } |
| 1924 | 1432 |
| 1925 // Now check if it is an object from the VM isolate. These objects are shared | 1433 // Now check if it is an object from the VM isolate. These objects are shared |
| 1926 // by all isolates. | 1434 // by all isolates. |
| 1927 if (rawobj->IsVMHeapObject() && HandleVMIsolateObject(rawobj)) { | 1435 if (rawobj->IsVMHeapObject() && HandleVMIsolateObject(rawobj)) { |
| 1928 return true; | 1436 return true; |
| 1929 } | 1437 } |
| 1930 | 1438 |
| 1931 // Check if it is a code object in that case just write a Null object | 1439 // Check if it is a code object in that case just write a Null object |
| 1932 // as we do not want code objects in the snapshot. | 1440 // as we do not want code objects in the snapshot. |
| 1933 if (cid == kCodeCid && !Snapshot::IncludesCode(kind_)) { | 1441 if (cid == kCodeCid) { |
| 1934 WriteVMIsolateObject(kNullObject); | 1442 WriteVMIsolateObject(kNullObject); |
| 1935 return true; | 1443 return true; |
| 1936 } | 1444 } |
| 1937 | 1445 |
| 1938 // Check if classes are not being serialized and it is preinitialized type | 1446 // Check if classes are not being serialized and it is preinitialized type |
| 1939 // or a predefined internal VM class in the object store. | 1447 // or a predefined internal VM class in the object store. |
| 1940 if (!Snapshot::IsFull(kind_)) { | 1448 // Check if it is an internal VM class which is in the object store. |
| 1941 // Check if it is an internal VM class which is in the object store. | 1449 if (cid == kClassCid) { |
| 1942 if (cid == kClassCid) { | 1450 RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj); |
| 1943 RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj); | 1451 intptr_t class_id = raw_class->ptr()->id_; |
| 1944 intptr_t class_id = raw_class->ptr()->id_; | 1452 if (IsObjectStoreClassId(class_id)) { |
| 1945 if (IsObjectStoreClassId(class_id)) { | 1453 intptr_t object_id = ObjectIdFromClassId(class_id); |
| 1946 intptr_t object_id = ObjectIdFromClassId(class_id); | 1454 WriteIndexedObject(object_id); |
| 1947 WriteIndexedObject(object_id); | |
| 1948 return true; | |
| 1949 } | |
| 1950 } | |
| 1951 | |
| 1952 // Now check it is a preinitialized type object. | |
| 1953 RawType* raw_type = reinterpret_cast<RawType*>(rawobj); | |
| 1954 intptr_t index = GetTypeIndex(object_store(), raw_type); | |
| 1955 if (index != kInvalidIndex) { | |
| 1956 WriteIndexedObject(index); | |
| 1957 return true; | 1455 return true; |
| 1958 } | 1456 } |
| 1959 } | 1457 } |
| 1960 | 1458 |
| 1459 // Now check it is a preinitialized type object. |
| 1460 RawType* raw_type = reinterpret_cast<RawType*>(rawobj); |
| 1461 intptr_t index = GetTypeIndex(object_store(), raw_type); |
| 1462 if (index != kInvalidIndex) { |
| 1463 WriteIndexedObject(index); |
| 1464 return true; |
| 1465 } |
| 1466 |
| 1961 return false; | 1467 return false; |
| 1962 } | 1468 } |
| 1963 | 1469 |
| 1964 | 1470 |
| 1965 void SnapshotWriter::WriteObjectImpl(RawObject* raw, bool as_reference) { | 1471 void SnapshotWriter::WriteObjectImpl(RawObject* raw, bool as_reference) { |
| 1966 // First check if object can be written as a simple predefined type. | 1472 // First check if object can be written as a simple predefined type. |
| 1967 if (CheckAndWritePredefinedObject(raw)) { | 1473 if (CheckAndWritePredefinedObject(raw)) { |
| 1968 return; | 1474 return; |
| 1969 } | 1475 } |
| 1970 | 1476 |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2351 | 1857 |
| 2352 | 1858 |
| 2353 ScriptSnapshotWriter::ScriptSnapshotWriter(uint8_t** buffer, | 1859 ScriptSnapshotWriter::ScriptSnapshotWriter(uint8_t** buffer, |
| 2354 ReAlloc alloc) | 1860 ReAlloc alloc) |
| 2355 : SnapshotWriter(Thread::Current(), | 1861 : SnapshotWriter(Thread::Current(), |
| 2356 Snapshot::kScript, | 1862 Snapshot::kScript, |
| 2357 buffer, | 1863 buffer, |
| 2358 alloc, | 1864 alloc, |
| 2359 kInitialSize, | 1865 kInitialSize, |
| 2360 &forward_list_, | 1866 &forward_list_, |
| 2361 NULL, /* instructions_writer */ | 1867 true /* can_send_any_object */), |
| 2362 true, /* can_send_any_object */ | |
| 2363 false /* writing_vm_isolate */), | |
| 2364 forward_list_(thread(), kMaxPredefinedObjectIds) { | 1868 forward_list_(thread(), kMaxPredefinedObjectIds) { |
| 2365 ASSERT(buffer != NULL); | 1869 ASSERT(buffer != NULL); |
| 2366 ASSERT(alloc != NULL); | 1870 ASSERT(alloc != NULL); |
| 2367 } | 1871 } |
| 2368 | 1872 |
| 2369 | 1873 |
| 2370 void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) { | 1874 void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) { |
| 2371 ASSERT(kind() == Snapshot::kScript); | 1875 ASSERT(kind() == Snapshot::kScript); |
| 2372 ASSERT(isolate() != NULL); | 1876 ASSERT(isolate() != NULL); |
| 2373 ASSERT(ClassFinalizer::AllClassesFinalized()); | 1877 ASSERT(ClassFinalizer::AllClassesFinalized()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2407 | 1911 |
| 2408 MessageWriter::MessageWriter(uint8_t** buffer, | 1912 MessageWriter::MessageWriter(uint8_t** buffer, |
| 2409 ReAlloc alloc, | 1913 ReAlloc alloc, |
| 2410 bool can_send_any_object) | 1914 bool can_send_any_object) |
| 2411 : SnapshotWriter(Thread::Current(), | 1915 : SnapshotWriter(Thread::Current(), |
| 2412 Snapshot::kMessage, | 1916 Snapshot::kMessage, |
| 2413 buffer, | 1917 buffer, |
| 2414 alloc, | 1918 alloc, |
| 2415 kInitialSize, | 1919 kInitialSize, |
| 2416 &forward_list_, | 1920 &forward_list_, |
| 2417 NULL, /* instructions_writer */ | 1921 can_send_any_object), |
| 2418 can_send_any_object, | |
| 2419 false /* writing_vm_isolate */), | |
| 2420 forward_list_(thread(), kMaxPredefinedObjectIds) { | 1922 forward_list_(thread(), kMaxPredefinedObjectIds) { |
| 2421 ASSERT(buffer != NULL); | 1923 ASSERT(buffer != NULL); |
| 2422 ASSERT(alloc != NULL); | 1924 ASSERT(alloc != NULL); |
| 2423 } | 1925 } |
| 2424 | 1926 |
| 2425 | 1927 |
| 2426 void MessageWriter::WriteMessage(const Object& obj) { | 1928 void MessageWriter::WriteMessage(const Object& obj) { |
| 2427 ASSERT(kind() == Snapshot::kMessage); | 1929 ASSERT(kind() == Snapshot::kMessage); |
| 2428 ASSERT(isolate() != NULL); | 1930 ASSERT(isolate() != NULL); |
| 2429 | 1931 |
| 2430 // Setup for long jump in case there is an exception while writing | 1932 // Setup for long jump in case there is an exception while writing |
| 2431 // the message. | 1933 // the message. |
| 2432 LongJumpScope jump; | 1934 LongJumpScope jump; |
| 2433 if (setjmp(*jump.Set()) == 0) { | 1935 if (setjmp(*jump.Set()) == 0) { |
| 2434 NoSafepointScope no_safepoint; | 1936 NoSafepointScope no_safepoint; |
| 2435 WriteObject(obj.raw()); | 1937 WriteObject(obj.raw()); |
| 2436 } else { | 1938 } else { |
| 2437 ThrowException(exception_type(), exception_msg()); | 1939 ThrowException(exception_type(), exception_msg()); |
| 2438 } | 1940 } |
| 2439 } | 1941 } |
| 2440 | 1942 |
| 2441 | 1943 |
| 2442 } // namespace dart | 1944 } // namespace dart |
| OLD | NEW |