| 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/bigint_operations.h" | 8 #include "vm/bigint_operations.h" |
| 9 #include "vm/bootstrap.h" | 9 #include "vm/bootstrap.h" |
| 10 #include "vm/exceptions.h" | 10 #include "vm/exceptions.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 ASSERT((value & kSmiTagMask) == 0); | 138 ASSERT((value & kSmiTagMask) == 0); |
| 139 return reinterpret_cast<RawSmi*>(value); | 139 return reinterpret_cast<RawSmi*>(value); |
| 140 } | 140 } |
| 141 | 141 |
| 142 | 142 |
| 143 intptr_t BaseReader::ReadSmiValue() { | 143 intptr_t BaseReader::ReadSmiValue() { |
| 144 return Smi::Value(ReadAsSmi()); | 144 return Smi::Value(ReadAsSmi()); |
| 145 } | 145 } |
| 146 | 146 |
| 147 | 147 |
| 148 SnapshotReader::SnapshotReader(const Snapshot* snapshot, Isolate* isolate) | 148 SnapshotReader::SnapshotReader(const uint8_t* buffer, |
| 149 : BaseReader(snapshot->content(), snapshot->length()), | 149 intptr_t size, |
| 150 kind_(snapshot->kind()), | 150 Snapshot::Kind kind, |
| 151 Isolate* isolate) |
| 152 : BaseReader(buffer, size), |
| 153 kind_(kind), |
| 151 isolate_(isolate), | 154 isolate_(isolate), |
| 152 cls_(Class::Handle()), | 155 cls_(Class::Handle()), |
| 153 obj_(Object::Handle()), | 156 obj_(Object::Handle()), |
| 154 str_(String::Handle()), | 157 str_(String::Handle()), |
| 155 library_(Library::Handle()), | 158 library_(Library::Handle()), |
| 156 type_(AbstractType::Handle()), | 159 type_(AbstractType::Handle()), |
| 157 type_arguments_(AbstractTypeArguments::Handle()), | 160 type_arguments_(AbstractTypeArguments::Handle()), |
| 158 tokens_(Array::Handle()), | 161 tokens_(Array::Handle()), |
| 159 backward_references_((snapshot->kind() == Snapshot::kFull) ? | 162 backward_references_((kind == Snapshot::kFull) ? |
| 160 kNumInitialReferencesInFullSnapshot : | 163 kNumInitialReferencesInFullSnapshot : |
| 161 kNumInitialReferences) { | 164 kNumInitialReferences) { |
| 162 } | 165 } |
| 163 | 166 |
| 164 | 167 |
| 165 RawObject* SnapshotReader::ReadObject() { | 168 RawObject* SnapshotReader::ReadObject() { |
| 166 Object& obj = Object::Handle(ReadObjectImpl()); | 169 Object& obj = Object::Handle(ReadObjectImpl()); |
| 167 for (intptr_t i = 0; i < backward_references_.length(); i++) { | 170 for (intptr_t i = 0; i < backward_references_.length(); i++) { |
| 168 if (!backward_references_[i]->is_deserialized()) { | 171 if (!backward_references_[i]->is_deserialized()) { |
| 169 ReadObjectImpl(); | 172 ReadObjectImpl(); |
| (...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 } \ | 853 } \ |
| 851 | 854 |
| 852 CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) | 855 CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) |
| 853 #undef SNAPSHOT_WRITE | 856 #undef SNAPSHOT_WRITE |
| 854 default: break; | 857 default: break; |
| 855 } | 858 } |
| 856 UNREACHABLE(); | 859 UNREACHABLE(); |
| 857 } | 860 } |
| 858 | 861 |
| 859 | 862 |
| 860 void SnapshotWriter::WriteFullSnapshot() { | 863 void FullSnapshotWriter::WriteFullSnapshot() { |
| 861 ASSERT(kind_ == Snapshot::kFull); | |
| 862 Isolate* isolate = Isolate::Current(); | 864 Isolate* isolate = Isolate::Current(); |
| 863 ASSERT(isolate != NULL); | 865 ASSERT(isolate != NULL); |
| 864 ObjectStore* object_store = isolate->object_store(); | 866 ObjectStore* object_store = isolate->object_store(); |
| 865 ASSERT(object_store != NULL); | 867 ASSERT(object_store != NULL); |
| 866 | 868 |
| 869 // Reserve space in the output buffer for a snapshot header. |
| 870 ReserveHeader(); |
| 871 |
| 867 // Write out all the objects in the object store of the isolate which | 872 // Write out all the objects in the object store of the isolate which |
| 868 // is the root set for all dart allocated objects at this point. | 873 // is the root set for all dart allocated objects at this point. |
| 869 SnapshotWriterVisitor visitor(this, false); | 874 SnapshotWriterVisitor visitor(this, false); |
| 870 object_store->VisitObjectPointers(&visitor); | 875 object_store->VisitObjectPointers(&visitor); |
| 871 | 876 |
| 872 // Write out all forwarded objects. | 877 // Write out all forwarded objects. |
| 873 WriteForwardedObjects(); | 878 WriteForwardedObjects(); |
| 874 | 879 |
| 875 // Finalize the snapshot buffer. | 880 FillHeader(kind()); |
| 876 FinalizeBuffer(); | 881 UnmarkAll(); |
| 877 } | 882 } |
| 878 | 883 |
| 879 | 884 |
| 880 uword SnapshotWriter::GetObjectTags(RawObject* raw) { | 885 uword SnapshotWriter::GetObjectTags(RawObject* raw) { |
| 881 uword tags = raw->ptr()->tags_; | 886 uword tags = raw->ptr()->tags_; |
| 882 if (SerializedHeaderTag::decode(tags) == kObjectId) { | 887 if (SerializedHeaderTag::decode(tags) == kObjectId) { |
| 883 intptr_t id = SerializedHeaderData::decode(tags); | 888 intptr_t id = SerializedHeaderData::decode(tags); |
| 884 return forward_list_[id - kMaxPredefinedObjectIds]->tags(); | 889 return forward_list_[id - kMaxPredefinedObjectIds]->tags(); |
| 885 } else { | 890 } else { |
| 886 return tags; | 891 return tags; |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 for (intptr_t i = 0; i < len; i++) { | 1126 for (intptr_t i = 0; i < len; i++) { |
| 1122 WriteObjectRef(data[i]); | 1127 WriteObjectRef(data[i]); |
| 1123 } | 1128 } |
| 1124 } | 1129 } |
| 1125 | 1130 |
| 1126 | 1131 |
| 1127 void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) { | 1132 void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) { |
| 1128 ASSERT(kind() == Snapshot::kScript); | 1133 ASSERT(kind() == Snapshot::kScript); |
| 1129 | 1134 |
| 1130 // Write out the library object. | 1135 // Write out the library object. |
| 1136 ReserveHeader(); |
| 1131 WriteObject(lib.raw()); | 1137 WriteObject(lib.raw()); |
| 1132 | 1138 FillHeader(kind()); |
| 1133 // Finalize the snapshot buffer. | 1139 UnmarkAll(); |
| 1134 FinalizeBuffer(); | |
| 1135 } | 1140 } |
| 1136 | 1141 |
| 1137 | 1142 |
| 1138 void SnapshotWriterVisitor::VisitPointers(RawObject** first, RawObject** last) { | 1143 void SnapshotWriterVisitor::VisitPointers(RawObject** first, RawObject** last) { |
| 1139 for (RawObject** current = first; current <= last; current++) { | 1144 for (RawObject** current = first; current <= last; current++) { |
| 1140 RawObject* raw_obj = *current; | 1145 RawObject* raw_obj = *current; |
| 1141 if (as_references_) { | 1146 if (as_references_) { |
| 1142 writer_->WriteObjectRef(raw_obj); | 1147 writer_->WriteObjectRef(raw_obj); |
| 1143 } else { | 1148 } else { |
| 1144 writer_->WriteObjectImpl(raw_obj); | 1149 writer_->WriteObjectImpl(raw_obj); |
| 1145 } | 1150 } |
| 1146 } | 1151 } |
| 1147 } | 1152 } |
| 1148 | 1153 |
| 1154 |
| 1155 void MessageWriter::WriteMessage(const Object& obj) { |
| 1156 ASSERT(kind() == Snapshot::kMessage); |
| 1157 WriteObject(obj.raw()); |
| 1158 UnmarkAll(); |
| 1159 } |
| 1160 |
| 1161 |
| 1149 } // namespace dart | 1162 } // namespace dart |
| OLD | NEW |