| 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 307 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 318       isolate, UnhandledException::New(Instance::Cast(result), stacktrace)); | 318       isolate, UnhandledException::New(Instance::Cast(result), stacktrace)); | 
| 319   isolate->long_jump_base()->Jump(1, error); | 319   isolate->long_jump_base()->Jump(1, error); | 
| 320 } | 320 } | 
| 321 | 321 | 
| 322 | 322 | 
| 323 RawObject* SnapshotReader::VmIsolateSnapshotObject(intptr_t index) const { | 323 RawObject* SnapshotReader::VmIsolateSnapshotObject(intptr_t index) const { | 
| 324   return Object::vm_isolate_snapshot_object_table().At(index); | 324   return Object::vm_isolate_snapshot_object_table().At(index); | 
| 325 } | 325 } | 
| 326 | 326 | 
| 327 | 327 | 
|  | 328 bool SnapshotReader::is_vm_isolate() const { | 
|  | 329   return isolate_ == Dart::vm_isolate(); | 
|  | 330 } | 
|  | 331 | 
|  | 332 | 
| 328 RawObject* SnapshotReader::ReadObjectImpl(bool as_reference, | 333 RawObject* SnapshotReader::ReadObjectImpl(bool as_reference, | 
| 329                                           intptr_t patch_object_id, | 334                                           intptr_t patch_object_id, | 
| 330                                           intptr_t patch_offset) { | 335                                           intptr_t patch_offset) { | 
| 331   int64_t header_value = Read<int64_t>(); | 336   int64_t header_value = Read<int64_t>(); | 
| 332   if ((header_value & kSmiTagMask) == kSmiTag) { | 337   if ((header_value & kSmiTagMask) == kSmiTag) { | 
| 333     return NewInteger(header_value); | 338     return NewInteger(header_value); | 
| 334   } | 339   } | 
| 335   ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin)); | 340   ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin)); | 
| 336   return ReadObjectImpl(static_cast<intptr_t>(header_value), | 341   return ReadObjectImpl(static_cast<intptr_t>(header_value), | 
| 337                         as_reference, | 342                         as_reference, | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 456     case kExternalTypedData##clazz##Cid:                                       \ | 461     case kExternalTypedData##clazz##Cid:                                       \ | 
| 457 | 462 | 
| 458     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 463     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 
| 459       tags = RawObject::ClassIdTag::update(class_id, tags); | 464       tags = RawObject::ClassIdTag::update(class_id, tags); | 
| 460       pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_); | 465       pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_); | 
| 461       break; | 466       break; | 
| 462     } | 467     } | 
| 463 #undef SNAPSHOT_READ | 468 #undef SNAPSHOT_READ | 
| 464     default: UNREACHABLE(); break; | 469     default: UNREACHABLE(); break; | 
| 465   } | 470   } | 
| 466   if (kind_ == Snapshot::kFull) { |  | 
| 467     pobj_.SetCreatedFromSnapshot(); |  | 
| 468   } |  | 
| 469   return pobj_.raw(); | 471   return pobj_.raw(); | 
| 470 } | 472 } | 
| 471 | 473 | 
| 472 | 474 | 
| 473 RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id, | 475 RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id, | 
| 474                                              intptr_t class_header, | 476                                              intptr_t class_header, | 
| 475                                              intptr_t tags, | 477                                              intptr_t tags, | 
| 476                                              intptr_t patch_object_id, | 478                                              intptr_t patch_object_id, | 
| 477                                              intptr_t patch_offset) { | 479                                              intptr_t patch_offset) { | 
| 478   // Lookup the class based on the class header information. | 480   // Lookup the class based on the class header information. | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 529       // snapshot (kFull, kScript) with asserts. | 531       // snapshot (kFull, kScript) with asserts. | 
| 530       offset += kWordSize; | 532       offset += kWordSize; | 
| 531     } | 533     } | 
| 532     if (kind_ == Snapshot::kFull) { | 534     if (kind_ == Snapshot::kFull) { | 
| 533       // We create an uninitialized object in the case of full snapshots, so | 535       // We create an uninitialized object in the case of full snapshots, so | 
| 534       // we need to initialize any remaining padding area with the Null object. | 536       // we need to initialize any remaining padding area with the Null object. | 
| 535       while (offset < instance_size) { | 537       while (offset < instance_size) { | 
| 536         result->SetFieldAtOffset(offset, Object::null_object()); | 538         result->SetFieldAtOffset(offset, Object::null_object()); | 
| 537         offset += kWordSize; | 539         offset += kWordSize; | 
| 538       } | 540       } | 
| 539       result->SetCreatedFromSnapshot(); | 541     } | 
| 540     } else if (RawObject::IsCanonical(tags)) { | 542     if (RawObject::IsCanonical(tags)) { | 
| 541       *result = result->CheckAndCanonicalize(NULL); | 543       if (kind_ == Snapshot::kFull) { | 
| 542       ASSERT(!result->IsNull()); | 544         result->SetCanonical(); | 
|  | 545       } else { | 
|  | 546         *result = result->CheckAndCanonicalize(NULL); | 
|  | 547         ASSERT(!result->IsNull()); | 
|  | 548       } | 
| 543     } | 549     } | 
| 544     return result->raw(); | 550     return result->raw(); | 
| 545   } else if (header_id == kStaticImplicitClosureObjectId) { | 551   } else if (header_id == kStaticImplicitClosureObjectId) { | 
| 546     // We do not use the tags as the implicit static closure | 552     // We do not use the tags as the implicit static closure | 
| 547     // is going to be created in this isolate or the canonical | 553     // is going to be created in this isolate or the canonical | 
| 548     // version already created in the isolate will be used. | 554     // version already created in the isolate will be used. | 
| 549     return ReadStaticImplicitClosure(object_id, class_header); | 555     return ReadStaticImplicitClosure(object_id, class_header); | 
| 550   } | 556   } | 
| 551   ASSERT((class_header & kSmiTagMask) != kSmiTag); | 557   ASSERT((class_header & kSmiTagMask) != kSmiTag); | 
| 552   intptr_t class_id = LookupInternalClass(class_header); | 558   intptr_t class_id = LookupInternalClass(class_header); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 571     case kExternalTypedData##clazz##Cid:                                       \ | 577     case kExternalTypedData##clazz##Cid:                                       \ | 
| 572 | 578 | 
| 573     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 579     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) { | 
| 574       tags = RawObject::ClassIdTag::update(class_id, tags); | 580       tags = RawObject::ClassIdTag::update(class_id, tags); | 
| 575       pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_); | 581       pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_); | 
| 576       break; | 582       break; | 
| 577     } | 583     } | 
| 578 #undef SNAPSHOT_READ | 584 #undef SNAPSHOT_READ | 
| 579     default: UNREACHABLE(); break; | 585     default: UNREACHABLE(); break; | 
| 580   } | 586   } | 
| 581   if (kind_ == Snapshot::kFull) { |  | 
| 582     pobj_.SetCreatedFromSnapshot(); |  | 
| 583   } |  | 
| 584   AddPatchRecord(object_id, patch_object_id, patch_offset); | 587   AddPatchRecord(object_id, patch_object_id, patch_offset); | 
| 585   return pobj_.raw(); | 588   return pobj_.raw(); | 
| 586 } | 589 } | 
| 587 | 590 | 
| 588 | 591 | 
| 589 void SnapshotReader::AddBackRef(intptr_t id, | 592 void SnapshotReader::AddBackRef(intptr_t id, | 
| 590                                 Object* obj, | 593                                 Object* obj, | 
| 591                                 DeserializeState state, | 594                                 DeserializeState state, | 
| 592                                 bool defer_canonicalization) { | 595                                 bool defer_canonicalization) { | 
| 593   intptr_t index = (id - kMaxPredefinedObjectIds); | 596   intptr_t index = (id - kMaxPredefinedObjectIds); | 
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1064         object_store()->preallocated_unhandled_exception()); | 1067         object_store()->preallocated_unhandled_exception()); | 
| 1065     Isolate::Current()->long_jump_base()->Jump(1, error); | 1068     Isolate::Current()->long_jump_base()->Jump(1, error); | 
| 1066   } | 1069   } | 
| 1067   VerifiedMemory::Accept(address, size); | 1070   VerifiedMemory::Accept(address, size); | 
| 1068 | 1071 | 
| 1069   RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 1072   RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 
| 1070   uword tags = 0; | 1073   uword tags = 0; | 
| 1071   ASSERT(class_id != kIllegalCid); | 1074   ASSERT(class_id != kIllegalCid); | 
| 1072   tags = RawObject::ClassIdTag::update(class_id, tags); | 1075   tags = RawObject::ClassIdTag::update(class_id, tags); | 
| 1073   tags = RawObject::SizeTag::update(size, tags); | 1076   tags = RawObject::SizeTag::update(size, tags); | 
|  | 1077   tags = RawObject::VMHeapObjectTag::update(is_vm_isolate(), tags); | 
| 1074   raw_obj->ptr()->tags_ = tags; | 1078   raw_obj->ptr()->tags_ = tags; | 
| 1075   return raw_obj; | 1079   return raw_obj; | 
| 1076 } | 1080 } | 
| 1077 | 1081 | 
| 1078 | 1082 | 
| 1079 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) { | 1083 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) { | 
| 1080   intptr_t object_id = GetVMIsolateObjectId(header_value); | 1084   intptr_t object_id = GetVMIsolateObjectId(header_value); | 
| 1081   if (object_id == kNullObject) { | 1085   if (object_id == kNullObject) { | 
| 1082     // This is a singleton null object, return it. | 1086     // This is a singleton null object, return it. | 
| 1083     return Object::null(); | 1087     return Object::null(); | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1202       } | 1206       } | 
| 1203     } | 1207     } | 
| 1204   } | 1208   } | 
| 1205 } | 1209 } | 
| 1206 | 1210 | 
| 1207 | 1211 | 
| 1208 void SnapshotReader::ArrayReadFrom(intptr_t object_id, | 1212 void SnapshotReader::ArrayReadFrom(intptr_t object_id, | 
| 1209                                    const Array& result, | 1213                                    const Array& result, | 
| 1210                                    intptr_t len, | 1214                                    intptr_t len, | 
| 1211                                    intptr_t tags) { | 1215                                    intptr_t tags) { | 
| 1212   // Set the object tags. |  | 
| 1213   result.set_tags(tags); |  | 
| 1214 |  | 
| 1215   // Setup the object fields. | 1216   // Setup the object fields. | 
| 1216   const intptr_t typeargs_offset = | 1217   const intptr_t typeargs_offset = | 
| 1217       GrowableObjectArray::type_arguments_offset() / kWordSize; | 1218       GrowableObjectArray::type_arguments_offset() / kWordSize; | 
| 1218   *TypeArgumentsHandle() ^= ReadObjectImpl(kAsInlinedObject, | 1219   *TypeArgumentsHandle() ^= ReadObjectImpl(kAsInlinedObject, | 
| 1219                                            object_id, | 1220                                            object_id, | 
| 1220                                            typeargs_offset); | 1221                                            typeargs_offset); | 
| 1221   result.SetTypeArguments(*TypeArgumentsHandle()); | 1222   result.SetTypeArguments(*TypeArgumentsHandle()); | 
| 1222 | 1223 | 
| 1223   bool as_reference = RawObject::IsCanonical(tags) ? false : true; | 1224   bool as_reference = RawObject::IsCanonical(tags) ? false : true; | 
| 1224   intptr_t offset = result.raw_ptr()->data() - | 1225   intptr_t offset = result.raw_ptr()->data() - | 
| (...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2046     } | 2047     } | 
| 2047   } | 2048   } | 
| 2048   first_unprocessed_object_id_ = next_object_id(); | 2049   first_unprocessed_object_id_ = next_object_id(); | 
| 2049 } | 2050 } | 
| 2050 | 2051 | 
| 2051 | 2052 | 
| 2052 void SnapshotWriter::WriteClassId(RawClass* cls) { | 2053 void SnapshotWriter::WriteClassId(RawClass* cls) { | 
| 2053   ASSERT(kind_ != Snapshot::kFull); | 2054   ASSERT(kind_ != Snapshot::kFull); | 
| 2054   int class_id = cls->ptr()->id_; | 2055   int class_id = cls->ptr()->id_; | 
| 2055   ASSERT(!IsSingletonClassId(class_id) && !IsObjectStoreClassId(class_id)); | 2056   ASSERT(!IsSingletonClassId(class_id) && !IsObjectStoreClassId(class_id)); | 
| 2056   // TODO(5411462): Should restrict this to only core-lib classes in this |  | 
| 2057   // case. |  | 
| 2058   // Write out the class and tags information. |  | 
| 2059   WriteVMIsolateObject(kClassCid); |  | 
| 2060   WriteTags(GetObjectTags(cls)); |  | 
| 2061 | 2057 | 
| 2062   // Write out the library url and class name. | 2058   // Write out the library url and class name. | 
| 2063   RawLibrary* library = cls->ptr()->library_; | 2059   RawLibrary* library = cls->ptr()->library_; | 
| 2064   ASSERT(library != Library::null()); | 2060   ASSERT(library != Library::null()); | 
| 2065   WriteObjectImpl(library->ptr()->url_, kAsInlinedObject); | 2061   WriteObjectImpl(library->ptr()->url_, kAsInlinedObject); | 
| 2066   WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject); | 2062   WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject); | 
| 2067 } | 2063 } | 
| 2068 | 2064 | 
| 2069 | 2065 | 
| 2070 void SnapshotWriter::WriteStaticImplicitClosure(intptr_t object_id, | 2066 void SnapshotWriter::WriteStaticImplicitClosure(intptr_t object_id, | 
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2406     NoSafepointScope no_safepoint; | 2402     NoSafepointScope no_safepoint; | 
| 2407     WriteObject(obj.raw()); | 2403     WriteObject(obj.raw()); | 
| 2408     UnmarkAll(); | 2404     UnmarkAll(); | 
| 2409   } else { | 2405   } else { | 
| 2410     ThrowException(exception_type(), exception_msg()); | 2406     ThrowException(exception_type(), exception_msg()); | 
| 2411   } | 2407   } | 
| 2412 } | 2408 } | 
| 2413 | 2409 | 
| 2414 | 2410 | 
| 2415 }  // namespace dart | 2411 }  // namespace dart | 
| OLD | NEW | 
|---|