Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1161)

Side by Side Diff: runtime/vm/snapshot.cc

Issue 1016503005: Rename NoGCScope -> NoSafepointScope. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/service.cc ('k') | runtime/vm/stack_frame.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 RawApiError* error = VerifyVersion(); 489 RawApiError* error = VerifyVersion();
490 if (error != ApiError::null()) { 490 if (error != ApiError::null()) {
491 return error; 491 return error;
492 } 492 }
493 493
494 // The version string matches. Read the rest of the snapshot. 494 // The version string matches. Read the rest of the snapshot.
495 495
496 // TODO(asiva): Add a check here to ensure we have the right heap 496 // TODO(asiva): Add a check here to ensure we have the right heap
497 // size for the full snapshot being read. 497 // size for the full snapshot being read.
498 { 498 {
499 NoGCScope no_gc; 499 NoSafepointScope no_safepoint;
500 HeapLocker hl(isolate, old_space()); 500 HeapLocker hl(isolate, old_space());
501 501
502 // Read in all the objects stored in the object store. 502 // Read in all the objects stored in the object store.
503 intptr_t num_flds = (object_store->to() - object_store->from()); 503 intptr_t num_flds = (object_store->to() - object_store->from());
504 for (intptr_t i = 0; i <= num_flds; i++) { 504 for (intptr_t i = 0; i <= num_flds; i++) {
505 *(object_store->from() + i) = ReadObjectImpl(); 505 *(object_store->from() + i) = ReadObjectImpl();
506 } 506 }
507 for (intptr_t i = 0; i < backward_references_.length(); i++) { 507 for (intptr_t i = 0; i < backward_references_.length(); i++) {
508 if (!backward_references_[i].is_deserialized()) { 508 if (!backward_references_[i].is_deserialized()) {
509 ReadObjectImpl(); 509 ReadObjectImpl();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 const String& msg = String::Handle(String::New(message_buffer)); 584 const String& msg = String::Handle(String::New(message_buffer));
585 return ApiError::New(msg); 585 return ApiError::New(msg);
586 } 586 }
587 Advance(version_len); 587 Advance(version_len);
588 return ApiError::null(); 588 return ApiError::null();
589 } 589 }
590 590
591 591
592 #define ALLOC_NEW_OBJECT_WITH_LEN(type, length) \ 592 #define ALLOC_NEW_OBJECT_WITH_LEN(type, length) \
593 ASSERT(kind_ == Snapshot::kFull); \ 593 ASSERT(kind_ == Snapshot::kFull); \
594 ASSERT(isolate()->no_gc_scope_depth() != 0); \ 594 ASSERT(isolate()->no_safepoint_scope_depth() != 0); \
595 Raw##type* obj = reinterpret_cast<Raw##type*>( \ 595 Raw##type* obj = reinterpret_cast<Raw##type*>( \
596 AllocateUninitialized(k##type##Cid, type::InstanceSize(length))); \ 596 AllocateUninitialized(k##type##Cid, type::InstanceSize(length))); \
597 obj->StoreSmi(&(obj->ptr()->length_), Smi::New(length)); \ 597 obj->StoreSmi(&(obj->ptr()->length_), Smi::New(length)); \
598 return obj; \ 598 return obj; \
599 599
600 600
601 RawArray* SnapshotReader::NewArray(intptr_t len) { 601 RawArray* SnapshotReader::NewArray(intptr_t len) {
602 ALLOC_NEW_OBJECT_WITH_LEN(Array, len); 602 ALLOC_NEW_OBJECT_WITH_LEN(Array, len);
603 } 603 }
604 604
(...skipping 13 matching lines...) Expand all
618 } 618 }
619 619
620 620
621 RawTypeArguments* SnapshotReader::NewTypeArguments(intptr_t len) { 621 RawTypeArguments* SnapshotReader::NewTypeArguments(intptr_t len) {
622 ALLOC_NEW_OBJECT_WITH_LEN(TypeArguments, len); 622 ALLOC_NEW_OBJECT_WITH_LEN(TypeArguments, len);
623 } 623 }
624 624
625 625
626 RawTokenStream* SnapshotReader::NewTokenStream(intptr_t len) { 626 RawTokenStream* SnapshotReader::NewTokenStream(intptr_t len) {
627 ASSERT(kind_ == Snapshot::kFull); 627 ASSERT(kind_ == Snapshot::kFull);
628 ASSERT(isolate()->no_gc_scope_depth() != 0); 628 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
629 stream_ = reinterpret_cast<RawTokenStream*>( 629 stream_ = reinterpret_cast<RawTokenStream*>(
630 AllocateUninitialized(kTokenStreamCid, TokenStream::InstanceSize())); 630 AllocateUninitialized(kTokenStreamCid, TokenStream::InstanceSize()));
631 uint8_t* array = const_cast<uint8_t*>(CurrentBufferAddress()); 631 uint8_t* array = const_cast<uint8_t*>(CurrentBufferAddress());
632 ASSERT(array != NULL); 632 ASSERT(array != NULL);
633 Advance(len); 633 Advance(len);
634 data_ = reinterpret_cast<RawExternalTypedData*>( 634 data_ = reinterpret_cast<RawExternalTypedData*>(
635 AllocateUninitialized(kExternalTypedDataUint8ArrayCid, 635 AllocateUninitialized(kExternalTypedDataUint8ArrayCid,
636 ExternalTypedData::InstanceSize())); 636 ExternalTypedData::InstanceSize()));
637 data_.SetData(array); 637 data_.SetData(array);
638 data_.SetLength(len); 638 data_.SetLength(len);
639 stream_.SetStream(data_); 639 stream_.SetStream(data_);
640 return stream_.raw(); 640 return stream_.raw();
641 } 641 }
642 642
643 643
644 RawContext* SnapshotReader::NewContext(intptr_t num_variables) { 644 RawContext* SnapshotReader::NewContext(intptr_t num_variables) {
645 ASSERT(kind_ == Snapshot::kFull); 645 ASSERT(kind_ == Snapshot::kFull);
646 ASSERT(isolate()->no_gc_scope_depth() != 0); 646 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
647 RawContext* obj = reinterpret_cast<RawContext*>( 647 RawContext* obj = reinterpret_cast<RawContext*>(
648 AllocateUninitialized(kContextCid, Context::InstanceSize(num_variables))); 648 AllocateUninitialized(kContextCid, Context::InstanceSize(num_variables)));
649 obj->ptr()->num_variables_ = num_variables; 649 obj->ptr()->num_variables_ = num_variables;
650 return obj; 650 return obj;
651 } 651 }
652 652
653 653
654 RawClass* SnapshotReader::NewClass(intptr_t class_id) { 654 RawClass* SnapshotReader::NewClass(intptr_t class_id) {
655 ASSERT(kind_ == Snapshot::kFull); 655 ASSERT(kind_ == Snapshot::kFull);
656 ASSERT(isolate()->no_gc_scope_depth() != 0); 656 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
657 if (class_id < kNumPredefinedCids) { 657 if (class_id < kNumPredefinedCids) {
658 ASSERT((class_id >= kInstanceCid) && 658 ASSERT((class_id >= kInstanceCid) &&
659 (class_id <= kNullCid)); 659 (class_id <= kNullCid));
660 return isolate()->class_table()->At(class_id); 660 return isolate()->class_table()->At(class_id);
661 } 661 }
662 RawClass* obj = reinterpret_cast<RawClass*>( 662 RawClass* obj = reinterpret_cast<RawClass*>(
663 AllocateUninitialized(kClassCid, Class::InstanceSize())); 663 AllocateUninitialized(kClassCid, Class::InstanceSize()));
664 Instance fake; 664 Instance fake;
665 obj->ptr()->handle_vtable_ = fake.vtable(); 665 obj->ptr()->handle_vtable_ = fake.vtable();
666 cls_ = obj; 666 cls_ = obj;
667 cls_.set_id(class_id); 667 cls_.set_id(class_id);
668 isolate()->RegisterClassAt(class_id, cls_); 668 isolate()->RegisterClassAt(class_id, cls_);
669 return cls_.raw(); 669 return cls_.raw();
670 } 670 }
671 671
672 672
673 RawInstance* SnapshotReader::NewInstance() { 673 RawInstance* SnapshotReader::NewInstance() {
674 ASSERT(kind_ == Snapshot::kFull); 674 ASSERT(kind_ == Snapshot::kFull);
675 ASSERT(isolate()->no_gc_scope_depth() != 0); 675 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
676 RawInstance* obj = reinterpret_cast<RawInstance*>( 676 RawInstance* obj = reinterpret_cast<RawInstance*>(
677 AllocateUninitialized(kObjectCid, Instance::InstanceSize())); 677 AllocateUninitialized(kObjectCid, Instance::InstanceSize()));
678 return obj; 678 return obj;
679 } 679 }
680 680
681 681
682 RawMint* SnapshotReader::NewMint(int64_t value) { 682 RawMint* SnapshotReader::NewMint(int64_t value) {
683 ASSERT(kind_ == Snapshot::kFull); 683 ASSERT(kind_ == Snapshot::kFull);
684 ASSERT(isolate()->no_gc_scope_depth() != 0); 684 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
685 RawMint* obj = reinterpret_cast<RawMint*>( 685 RawMint* obj = reinterpret_cast<RawMint*>(
686 AllocateUninitialized(kMintCid, Mint::InstanceSize())); 686 AllocateUninitialized(kMintCid, Mint::InstanceSize()));
687 obj->ptr()->value_ = value; 687 obj->ptr()->value_ = value;
688 return obj; 688 return obj;
689 } 689 }
690 690
691 691
692 RawDouble* SnapshotReader::NewDouble(double value) { 692 RawDouble* SnapshotReader::NewDouble(double value) {
693 ASSERT(kind_ == Snapshot::kFull); 693 ASSERT(kind_ == Snapshot::kFull);
694 ASSERT(isolate()->no_gc_scope_depth() != 0); 694 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
695 RawDouble* obj = reinterpret_cast<RawDouble*>( 695 RawDouble* obj = reinterpret_cast<RawDouble*>(
696 AllocateUninitialized(kDoubleCid, Double::InstanceSize())); 696 AllocateUninitialized(kDoubleCid, Double::InstanceSize()));
697 obj->ptr()->value_ = value; 697 obj->ptr()->value_ = value;
698 return obj; 698 return obj;
699 } 699 }
700 700
701 701
702 RawTypedData* SnapshotReader::NewTypedData(intptr_t class_id, intptr_t len) { 702 RawTypedData* SnapshotReader::NewTypedData(intptr_t class_id, intptr_t len) {
703 ASSERT(kind_ == Snapshot::kFull); 703 ASSERT(kind_ == Snapshot::kFull);
704 ASSERT(isolate()->no_gc_scope_depth() != 0); 704 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
705 const intptr_t lengthInBytes = len * TypedData::ElementSizeInBytes(class_id); 705 const intptr_t lengthInBytes = len * TypedData::ElementSizeInBytes(class_id);
706 RawTypedData* obj = reinterpret_cast<RawTypedData*>( 706 RawTypedData* obj = reinterpret_cast<RawTypedData*>(
707 AllocateUninitialized(class_id, TypedData::InstanceSize(lengthInBytes))); 707 AllocateUninitialized(class_id, TypedData::InstanceSize(lengthInBytes)));
708 obj->StoreSmi(&(obj->ptr()->length_), Smi::New(len)); 708 obj->StoreSmi(&(obj->ptr()->length_), Smi::New(len));
709 return obj; 709 return obj;
710 } 710 }
711 711
712 712
713 #define ALLOC_NEW_OBJECT(type) \ 713 #define ALLOC_NEW_OBJECT(type) \
714 ASSERT(kind_ == Snapshot::kFull); \ 714 ASSERT(kind_ == Snapshot::kFull); \
715 ASSERT(isolate()->no_gc_scope_depth() != 0); \ 715 ASSERT(isolate()->no_safepoint_scope_depth() != 0); \
716 return reinterpret_cast<Raw##type*>( \ 716 return reinterpret_cast<Raw##type*>( \
717 AllocateUninitialized(k##type##Cid, type::InstanceSize())); \ 717 AllocateUninitialized(k##type##Cid, type::InstanceSize())); \
718 718
719 719
720 RawBigint* SnapshotReader::NewBigint() { 720 RawBigint* SnapshotReader::NewBigint() {
721 ALLOC_NEW_OBJECT(Bigint); 721 ALLOC_NEW_OBJECT(Bigint);
722 } 722 }
723 723
724 724
725 RawUnresolvedClass* SnapshotReader::NewUnresolvedClass() { 725 RawUnresolvedClass* SnapshotReader::NewUnresolvedClass() {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 803
804 804
805 RawGrowableObjectArray* SnapshotReader::NewGrowableObjectArray() { 805 RawGrowableObjectArray* SnapshotReader::NewGrowableObjectArray() {
806 ALLOC_NEW_OBJECT(GrowableObjectArray); 806 ALLOC_NEW_OBJECT(GrowableObjectArray);
807 } 807 }
808 808
809 809
810 RawFloat32x4* SnapshotReader::NewFloat32x4(float v0, float v1, float v2, 810 RawFloat32x4* SnapshotReader::NewFloat32x4(float v0, float v1, float v2,
811 float v3) { 811 float v3) {
812 ASSERT(kind_ == Snapshot::kFull); 812 ASSERT(kind_ == Snapshot::kFull);
813 ASSERT(isolate()->no_gc_scope_depth() != 0); 813 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
814 RawFloat32x4* obj = reinterpret_cast<RawFloat32x4*>( 814 RawFloat32x4* obj = reinterpret_cast<RawFloat32x4*>(
815 AllocateUninitialized(kFloat32x4Cid, Float32x4::InstanceSize())); 815 AllocateUninitialized(kFloat32x4Cid, Float32x4::InstanceSize()));
816 obj->ptr()->value_[0] = v0; 816 obj->ptr()->value_[0] = v0;
817 obj->ptr()->value_[1] = v1; 817 obj->ptr()->value_[1] = v1;
818 obj->ptr()->value_[2] = v2; 818 obj->ptr()->value_[2] = v2;
819 obj->ptr()->value_[3] = v3; 819 obj->ptr()->value_[3] = v3;
820 return obj; 820 return obj;
821 } 821 }
822 822
823 823
824 RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2, 824 RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2,
825 uint32_t v3) { 825 uint32_t v3) {
826 ASSERT(kind_ == Snapshot::kFull); 826 ASSERT(kind_ == Snapshot::kFull);
827 ASSERT(isolate()->no_gc_scope_depth() != 0); 827 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
828 RawInt32x4* obj = reinterpret_cast<RawInt32x4*>( 828 RawInt32x4* obj = reinterpret_cast<RawInt32x4*>(
829 AllocateUninitialized(kInt32x4Cid, Int32x4::InstanceSize())); 829 AllocateUninitialized(kInt32x4Cid, Int32x4::InstanceSize()));
830 obj->ptr()->value_[0] = v0; 830 obj->ptr()->value_[0] = v0;
831 obj->ptr()->value_[1] = v1; 831 obj->ptr()->value_[1] = v1;
832 obj->ptr()->value_[2] = v2; 832 obj->ptr()->value_[2] = v2;
833 obj->ptr()->value_[3] = v3; 833 obj->ptr()->value_[3] = v3;
834 return obj; 834 return obj;
835 } 835 }
836 836
837 837
838 RawFloat64x2* SnapshotReader::NewFloat64x2(double v0, double v1) { 838 RawFloat64x2* SnapshotReader::NewFloat64x2(double v0, double v1) {
839 ASSERT(kind_ == Snapshot::kFull); 839 ASSERT(kind_ == Snapshot::kFull);
840 ASSERT(isolate()->no_gc_scope_depth() != 0); 840 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
841 RawFloat64x2* obj = reinterpret_cast<RawFloat64x2*>( 841 RawFloat64x2* obj = reinterpret_cast<RawFloat64x2*>(
842 AllocateUninitialized(kFloat64x2Cid, Float64x2::InstanceSize())); 842 AllocateUninitialized(kFloat64x2Cid, Float64x2::InstanceSize()));
843 obj->ptr()->value_[0] = v0; 843 obj->ptr()->value_[0] = v0;
844 obj->ptr()->value_[1] = v1; 844 obj->ptr()->value_[1] = v1;
845 return obj; 845 return obj;
846 } 846 }
847 847
848 848
849 RawApiError* SnapshotReader::NewApiError() { 849 RawApiError* SnapshotReader::NewApiError() {
850 ALLOC_NEW_OBJECT(ApiError); 850 ALLOC_NEW_OBJECT(ApiError);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 } 889 }
890 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId); 890 ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId);
891 intptr_t class_id = SerializedHeaderData::decode(class_header); 891 intptr_t class_id = SerializedHeaderData::decode(class_header);
892 ASSERT(IsObjectStoreClassId(class_id)); 892 ASSERT(IsObjectStoreClassId(class_id));
893 return class_id; 893 return class_id;
894 } 894 }
895 895
896 896
897 RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id, 897 RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id,
898 intptr_t size) { 898 intptr_t size) {
899 ASSERT(isolate()->no_gc_scope_depth() != 0); 899 ASSERT(isolate()->no_safepoint_scope_depth() != 0);
900 ASSERT(Utils::IsAligned(size, kObjectAlignment)); 900 ASSERT(Utils::IsAligned(size, kObjectAlignment));
901 901
902 // Allocate memory where all words look like smis. This is currently 902 // Allocate memory where all words look like smis. This is currently
903 // only needed for DEBUG-mode validation in StorePointer/StoreSmi, but will 903 // only needed for DEBUG-mode validation in StorePointer/StoreSmi, but will
904 // be essential with the upcoming deletion barrier. 904 // be essential with the upcoming deletion barrier.
905 uword address = 905 uword address =
906 old_space()->TryAllocateSmiInitializedLocked(size, 906 old_space()->TryAllocateSmiInitializedLocked(size,
907 PageSpace::kForceGrowth); 907 PageSpace::kForceGrowth);
908 if (address == 0) { 908 if (address == 0) {
909 // Use the preallocated out of memory exception to avoid calling 909 // Use the preallocated out of memory exception to avoid calling
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 UNREACHABLE(); 1213 UNREACHABLE();
1214 } 1214 }
1215 1215
1216 1216
1217 void SnapshotWriter::WriteObjectRef(RawObject* raw) { 1217 void SnapshotWriter::WriteObjectRef(RawObject* raw) {
1218 // First check if object can be written as a simple predefined type. 1218 // First check if object can be written as a simple predefined type.
1219 if (CheckAndWritePredefinedObject(raw)) { 1219 if (CheckAndWritePredefinedObject(raw)) {
1220 return; 1220 return;
1221 } 1221 }
1222 1222
1223 NoGCScope no_gc; 1223 NoSafepointScope no_safepoint;
1224 RawClass* cls = class_table_->At(raw->GetClassId()); 1224 RawClass* cls = class_table_->At(raw->GetClassId());
1225 intptr_t class_id = cls->ptr()->id_; 1225 intptr_t class_id = cls->ptr()->id_;
1226 ASSERT(class_id == raw->GetClassId()); 1226 ASSERT(class_id == raw->GetClassId());
1227 if (class_id >= kNumPredefinedCids) { 1227 if (class_id >= kNumPredefinedCids) {
1228 WriteInstanceRef(raw, cls); 1228 WriteInstanceRef(raw, cls);
1229 return; 1229 return;
1230 } 1230 }
1231 if (class_id == kArrayCid) { 1231 if (class_id == kArrayCid) {
1232 // Object is being referenced, add it to the forward ref list and mark 1232 // Object is being referenced, add it to the forward ref list and mark
1233 // it so that future references to this object in the snapshot will use 1233 // it so that future references to this object in the snapshot will use
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 LongJumpScope jump; 1328 LongJumpScope jump;
1329 if (setjmp(*jump.Set()) == 0) { 1329 if (setjmp(*jump.Set()) == 0) {
1330 // Reserve space in the output buffer for a snapshot header. 1330 // Reserve space in the output buffer for a snapshot header.
1331 ReserveHeader(); 1331 ReserveHeader();
1332 1332
1333 // Write out the version string. 1333 // Write out the version string.
1334 WriteVersion(); 1334 WriteVersion();
1335 1335
1336 // Write out the full snapshot. 1336 // Write out the full snapshot.
1337 { 1337 {
1338 NoGCScope no_gc; 1338 NoSafepointScope no_safepoint;
1339 1339
1340 // Write out all the objects in the object store of the isolate which 1340 // Write out all the objects in the object store of the isolate which
1341 // is the root set for all dart allocated objects at this point. 1341 // is the root set for all dart allocated objects at this point.
1342 SnapshotWriterVisitor visitor(this, false); 1342 SnapshotWriterVisitor visitor(this, false);
1343 object_store->VisitObjectPointers(&visitor); 1343 object_store->VisitObjectPointers(&visitor);
1344 1344
1345 // Write out all forwarded objects. 1345 // Write out all forwarded objects.
1346 WriteForwardedObjects(); 1346 WriteForwardedObjects();
1347 1347
1348 FillHeader(kind()); 1348 FillHeader(kind());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 ForwardList::~ForwardList() { 1383 ForwardList::~ForwardList() {
1384 PageSpace* page_space = Isolate::Current()->heap()->old_space(); 1384 PageSpace* page_space = Isolate::Current()->heap()->old_space();
1385 MonitorLocker ml(page_space->tasks_lock()); 1385 MonitorLocker ml(page_space->tasks_lock());
1386 ASSERT(page_space->tasks() == 1); 1386 ASSERT(page_space->tasks() == 1);
1387 page_space->set_tasks(0); 1387 page_space->set_tasks(0);
1388 ml.Notify(); 1388 ml.Notify();
1389 } 1389 }
1390 1390
1391 1391
1392 intptr_t ForwardList::MarkAndAddObject(RawObject* raw, SerializeState state) { 1392 intptr_t ForwardList::MarkAndAddObject(RawObject* raw, SerializeState state) {
1393 NoGCScope no_gc; 1393 NoSafepointScope no_safepoint;
1394 intptr_t object_id = next_object_id(); 1394 intptr_t object_id = next_object_id();
1395 ASSERT(object_id <= kMaxObjectId); 1395 ASSERT(object_id <= kMaxObjectId);
1396 uword value = 0; 1396 uword value = 0;
1397 value = SerializedHeaderTag::update(kObjectId, value); 1397 value = SerializedHeaderTag::update(kObjectId, value);
1398 value = SerializedHeaderData::update(object_id, value); 1398 value = SerializedHeaderData::update(object_id, value);
1399 uword tags = raw->ptr()->tags_; 1399 uword tags = raw->ptr()->tags_;
1400 ASSERT(SerializedHeaderTag::decode(tags) != kObjectId); 1400 ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
1401 raw->ptr()->tags_ = value; 1401 raw->ptr()->tags_ = value;
1402 Node* node = new Node(raw, tags, state); 1402 Node* node = new Node(raw, tags, state);
1403 ASSERT(node != NULL); 1403 ASSERT(node != NULL);
1404 nodes_.Add(node); 1404 nodes_.Add(node);
1405 return object_id; 1405 return object_id;
1406 } 1406 }
1407 1407
1408 1408
1409 void ForwardList::UnmarkAll() const { 1409 void ForwardList::UnmarkAll() const {
1410 NoGCScope no_gc; 1410 NoSafepointScope no_safepoint;
1411 for (intptr_t id = first_object_id(); id < next_object_id(); ++id) { 1411 for (intptr_t id = first_object_id(); id < next_object_id(); ++id) {
1412 const Node* node = NodeForObjectId(id); 1412 const Node* node = NodeForObjectId(id);
1413 RawObject* raw = node->raw(); 1413 RawObject* raw = node->raw();
1414 raw->ptr()->tags_ = node->tags(); // Restore original tags. 1414 raw->ptr()->tags_ = node->tags(); // Restore original tags.
1415 } 1415 }
1416 } 1416 }
1417 1417
1418 1418
1419 bool SnapshotWriter::CheckAndWritePredefinedObject(RawObject* rawobj) { 1419 bool SnapshotWriter::CheckAndWritePredefinedObject(RawObject* rawobj) {
1420 // Check if object can be written in one of the following ways: 1420 // Check if object can be written in one of the following ways:
1421 // - Smi: the Smi value is written as is (last bit is not tagged). 1421 // - Smi: the Smi value is written as is (last bit is not tagged).
1422 // - VM internal class (from VM isolate): (index of class in vm isolate | 0x3) 1422 // - VM internal class (from VM isolate): (index of class in vm isolate | 0x3)
1423 // - Object that has already been written: (negative id in stream | 0x3) 1423 // - Object that has already been written: (negative id in stream | 0x3)
1424 1424
1425 NoGCScope no_gc; 1425 NoSafepointScope no_safepoint;
1426 1426
1427 // First check if it is a Smi (i.e not a heap object). 1427 // First check if it is a Smi (i.e not a heap object).
1428 if (!rawobj->IsHeapObject()) { 1428 if (!rawobj->IsHeapObject()) {
1429 Write<int64_t>(reinterpret_cast<intptr_t>(rawobj)); 1429 Write<int64_t>(reinterpret_cast<intptr_t>(rawobj));
1430 return true; 1430 return true;
1431 } 1431 }
1432 1432
1433 intptr_t cid = rawobj->GetClassId(); 1433 intptr_t cid = rawobj->GetClassId();
1434 1434
1435 if ((kind_ == Snapshot::kMessage) && (cid == kDoubleCid)) { 1435 if ((kind_ == Snapshot::kMessage) && (cid == kDoubleCid)) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1517 WriteInlinedObject(raw); 1517 WriteInlinedObject(raw);
1518 } 1518 }
1519 1519
1520 1520
1521 void SnapshotWriter::WriteInlinedObject(RawObject* raw) { 1521 void SnapshotWriter::WriteInlinedObject(RawObject* raw) {
1522 // Now write the object out inline in the stream as follows: 1522 // Now write the object out inline in the stream as follows:
1523 // - Object is seen for the first time (inlined as follows): 1523 // - Object is seen for the first time (inlined as follows):
1524 // (object size in multiples of kObjectAlignment | 0x1) 1524 // (object size in multiples of kObjectAlignment | 0x1)
1525 // serialized fields of the object 1525 // serialized fields of the object
1526 // ...... 1526 // ......
1527 NoGCScope no_gc; 1527 NoSafepointScope no_safepoint;
1528 uword tags = raw->ptr()->tags_; 1528 uword tags = raw->ptr()->tags_;
1529 ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); 1529 ASSERT(SerializedHeaderTag::decode(tags) == kObjectId);
1530 intptr_t object_id = SerializedHeaderData::decode(tags); 1530 intptr_t object_id = SerializedHeaderData::decode(tags);
1531 tags = forward_list_.NodeForObjectId(object_id)->tags(); 1531 tags = forward_list_.NodeForObjectId(object_id)->tags();
1532 RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags)); 1532 RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags));
1533 intptr_t class_id = cls->ptr()->id_; 1533 intptr_t class_id = cls->ptr()->id_;
1534 1534
1535 if (!IsSplitClassId(class_id)) { 1535 if (!IsSplitClassId(class_id)) {
1536 object_id = kOmittedObjectId; 1536 object_id = kOmittedObjectId;
1537 } 1537 }
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1908 LongJumpScope jump; 1908 LongJumpScope jump;
1909 if (setjmp(*jump.Set()) == 0) { 1909 if (setjmp(*jump.Set()) == 0) {
1910 // Reserve space in the output buffer for a snapshot header. 1910 // Reserve space in the output buffer for a snapshot header.
1911 ReserveHeader(); 1911 ReserveHeader();
1912 1912
1913 // Write out the version string. 1913 // Write out the version string.
1914 WriteVersion(); 1914 WriteVersion();
1915 1915
1916 // Write out the library object. 1916 // Write out the library object.
1917 { 1917 {
1918 NoGCScope no_gc; 1918 NoSafepointScope no_safepoint;
1919 1919
1920 // Write out the library object. 1920 // Write out the library object.
1921 WriteObject(lib.raw()); 1921 WriteObject(lib.raw());
1922 1922
1923 FillHeader(kind()); 1923 FillHeader(kind());
1924 UnmarkAll(); 1924 UnmarkAll();
1925 } 1925 }
1926 } else { 1926 } else {
1927 ThrowException(exception_type(), exception_msg()); 1927 ThrowException(exception_type(), exception_msg());
1928 } 1928 }
(...skipping 13 matching lines...) Expand all
1942 1942
1943 1943
1944 void MessageWriter::WriteMessage(const Object& obj) { 1944 void MessageWriter::WriteMessage(const Object& obj) {
1945 ASSERT(kind() == Snapshot::kMessage); 1945 ASSERT(kind() == Snapshot::kMessage);
1946 ASSERT(isolate() != NULL); 1946 ASSERT(isolate() != NULL);
1947 1947
1948 // Setup for long jump in case there is an exception while writing 1948 // Setup for long jump in case there is an exception while writing
1949 // the message. 1949 // the message.
1950 LongJumpScope jump; 1950 LongJumpScope jump;
1951 if (setjmp(*jump.Set()) == 0) { 1951 if (setjmp(*jump.Set()) == 0) {
1952 NoGCScope no_gc; 1952 NoSafepointScope no_safepoint;
1953 WriteObject(obj.raw()); 1953 WriteObject(obj.raw());
1954 UnmarkAll(); 1954 UnmarkAll();
1955 } else { 1955 } else {
1956 ThrowException(exception_type(), exception_msg()); 1956 ThrowException(exception_type(), exception_msg());
1957 } 1957 }
1958 } 1958 }
1959 1959
1960 1960
1961 } // namespace dart 1961 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/service.cc ('k') | runtime/vm/stack_frame.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698