| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 88ebd0e8e941309c6b21a740741755ce938ac85a..4351b1de8550367d85468b233b91bf0471998692 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -399,7 +399,7 @@ void Object::InitNull(Isolate* isolate) {
|
| uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld);
|
| null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag);
|
| // The call below is using 'null_' to initialize itself.
|
| - InitializeObject(address, kNullCid, Instance::InstanceSize());
|
| + InitializeObject(address, kNullCid, Instance::InstanceSize(), true);
|
| }
|
| }
|
|
|
| @@ -462,7 +462,7 @@ void Object::InitOnce(Isolate* isolate) {
|
| intptr_t size = Class::InstanceSize();
|
| uword address = heap->Allocate(size, Heap::kOld);
|
| class_class_ = reinterpret_cast<RawClass*>(address + kHeapObjectTag);
|
| - InitializeObject(address, Class::kClassId, size);
|
| + InitializeObject(address, Class::kClassId, size, true);
|
|
|
| Class fake;
|
| // Initialization from Class::New<Class>.
|
| @@ -635,7 +635,7 @@ void Object::InitOnce(Isolate* isolate) {
|
| // Allocate and initialize the empty_array instance.
|
| {
|
| uword address = heap->Allocate(Array::InstanceSize(0), Heap::kOld);
|
| - InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0));
|
| + InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0), true);
|
| Array::initializeHandle(
|
| empty_array_,
|
| reinterpret_cast<RawArray*>(address + kHeapObjectTag));
|
| @@ -646,7 +646,7 @@ void Object::InitOnce(Isolate* isolate) {
|
| // Allocate and initialize the zero_array instance.
|
| {
|
| uword address = heap->Allocate(Array::InstanceSize(1), Heap::kOld);
|
| - InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1));
|
| + InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1), true);
|
| Array::initializeHandle(
|
| zero_array_,
|
| reinterpret_cast<RawArray*>(address + kHeapObjectTag));
|
| @@ -661,7 +661,8 @@ void Object::InitOnce(Isolate* isolate) {
|
| heap->Allocate(ObjectPool::InstanceSize(0), Heap::kOld);
|
| InitializeObject(address,
|
| kObjectPoolCid,
|
| - ObjectPool::InstanceSize(0));
|
| + ObjectPool::InstanceSize(0),
|
| + true);
|
| ObjectPool::initializeHandle(
|
| empty_object_pool_,
|
| reinterpret_cast<RawObjectPool*>(address + kHeapObjectTag));
|
| @@ -673,7 +674,8 @@ void Object::InitOnce(Isolate* isolate) {
|
| {
|
| uword address = heap->Allocate(PcDescriptors::InstanceSize(0), Heap::kOld);
|
| InitializeObject(address, kPcDescriptorsCid,
|
| - PcDescriptors::InstanceSize(0));
|
| + PcDescriptors::InstanceSize(0),
|
| + true);
|
| PcDescriptors::initializeHandle(
|
| empty_descriptors_,
|
| reinterpret_cast<RawPcDescriptors*>(address + kHeapObjectTag));
|
| @@ -687,7 +689,8 @@ void Object::InitOnce(Isolate* isolate) {
|
| heap->Allocate(LocalVarDescriptors::InstanceSize(0), Heap::kOld);
|
| InitializeObject(address,
|
| kLocalVarDescriptorsCid,
|
| - LocalVarDescriptors::InstanceSize(0));
|
| + LocalVarDescriptors::InstanceSize(0),
|
| + true);
|
| LocalVarDescriptors::initializeHandle(
|
| empty_var_descriptors_,
|
| reinterpret_cast<RawLocalVarDescriptors*>(address + kHeapObjectTag));
|
| @@ -703,7 +706,8 @@ void Object::InitOnce(Isolate* isolate) {
|
| heap->Allocate(ExceptionHandlers::InstanceSize(0), Heap::kOld);
|
| InitializeObject(address,
|
| kExceptionHandlersCid,
|
| - ExceptionHandlers::InstanceSize(0));
|
| + ExceptionHandlers::InstanceSize(0),
|
| + true);
|
| ExceptionHandlers::initializeHandle(
|
| empty_exception_handlers_,
|
| reinterpret_cast<RawExceptionHandlers*>(address + kHeapObjectTag));
|
| @@ -809,6 +813,7 @@ class PremarkingVisitor : public ObjectVisitor {
|
| ASSERT(!obj->IsMarked());
|
| // Free list elements should never be marked.
|
| if (!obj->IsFreeListElement()) {
|
| + ASSERT(obj->IsVMHeapObject());
|
| obj->SetMarkBitUnsynchronized();
|
| }
|
| }
|
| @@ -1674,7 +1679,10 @@ RawString* Object::DictionaryName() const {
|
| }
|
|
|
|
|
| -void Object::InitializeObject(uword address, intptr_t class_id, intptr_t size) {
|
| +void Object::InitializeObject(uword address,
|
| + intptr_t class_id,
|
| + intptr_t size,
|
| + bool is_vm_object) {
|
| // TODO(iposva): Get a proper halt instruction from the assembler which
|
| // would be needed here for code objects.
|
| uword initial_value = reinterpret_cast<uword>(null_);
|
| @@ -1688,7 +1696,9 @@ void Object::InitializeObject(uword address, intptr_t class_id, intptr_t size) {
|
| ASSERT(class_id != kIllegalCid);
|
| tags = RawObject::ClassIdTag::update(class_id, tags);
|
| tags = RawObject::SizeTag::update(size, tags);
|
| + tags = RawObject::VMHeapObjectTag::update(is_vm_object, tags);
|
| reinterpret_cast<RawObject*>(address)->tags_ = tags;
|
| + ASSERT(is_vm_object == RawObject::IsVMHeapObject(tags));
|
| VerifiedMemory::Accept(address, size);
|
| }
|
|
|
| @@ -1746,7 +1756,7 @@ RawObject* Object::Allocate(intptr_t cls_id,
|
| Profiler::RecordAllocation(isolate, cls_id);
|
| }
|
| NoSafepointScope no_safepoint;
|
| - InitializeObject(address, cls_id, size);
|
| + InitializeObject(address, cls_id, size, (isolate == Dart::vm_isolate()));
|
| RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag);
|
| ASSERT(cls_id == RawObject::ClassIdTag::decode(raw_obj->ptr()->tags_));
|
| return raw_obj;
|
| @@ -1840,6 +1850,12 @@ RawString* Class::UserVisibleName() const {
|
| }
|
|
|
|
|
| +bool Class::IsInFullSnapshot() const {
|
| + NoSafepointScope no_safepoint;
|
| + return raw_ptr()->library_->ptr()->is_in_fullsnapshot_;
|
| +}
|
| +
|
| +
|
| RawType* Class::SignatureType() const {
|
| ASSERT(IsSignatureClass());
|
| const Function& function = Function::Handle(signature_function());
|
| @@ -9826,6 +9842,7 @@ RawLibrary* Library::NewLibraryHelper(const String& url,
|
| result.StorePointer(&result.raw_ptr()->load_error_, Instance::null());
|
| result.set_native_entry_resolver(NULL);
|
| result.set_native_entry_symbol_resolver(NULL);
|
| + result.set_is_in_fullsnapshot(false);
|
| result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true);
|
| result.set_debuggable(false);
|
| result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme()));
|
| @@ -15258,6 +15275,7 @@ RawType* Type::NewNonParameterizedType(const Class& type_class) {
|
| void Type::SetIsFinalized() const {
|
| ASSERT(!IsFinalized());
|
| if (IsInstantiated()) {
|
| + ASSERT(HasResolvedTypeClass());
|
| set_type_state(RawType::kFinalizedInstantiated);
|
| } else {
|
| set_type_state(RawType::kFinalizedUninstantiated);
|
|
|