| 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 |