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" |
11 #include "vm/heap.h" | 11 #include "vm/heap.h" |
12 #include "vm/object.h" | 12 #include "vm/object.h" |
13 #include "vm/object_store.h" | 13 #include "vm/object_store.h" |
| 14 #include "vm/snapshot_ids.h" |
14 #include "vm/symbols.h" | 15 #include "vm/symbols.h" |
15 | 16 |
16 namespace dart { | 17 namespace dart { |
17 | 18 |
18 enum { | |
19 kInstanceId = ObjectStore::kMaxId, | |
20 kMaxPredefinedObjectIds, | |
21 }; | |
22 static const int kNumInitialReferencesInFullSnapshot = 160 * KB; | 19 static const int kNumInitialReferencesInFullSnapshot = 160 * KB; |
23 static const int kNumInitialReferences = 4; | 20 static const int kNumInitialReferences = 4; |
24 | 21 |
25 | 22 |
26 static bool IsSingletonClassId(intptr_t index) { | 23 static bool IsSingletonClassId(intptr_t class_id) { |
27 // Check if this is a singleton object class which is shared by all isolates. | 24 // Check if this is a singleton object class which is shared by all isolates. |
28 return (index >= Object::kClassClass && index < Object::kMaxId); | 25 return ((class_id >= kClassCid && class_id <= kUnwindErrorCid) || |
| 26 (class_id >= kNullCid && class_id <= kVoidCid)); |
29 } | 27 } |
30 | 28 |
31 | 29 |
32 static bool IsObjectStoreClassId(intptr_t index) { | 30 static bool IsObjectStoreClassId(intptr_t class_id) { |
33 // Check if this is a class which is stored in the object store. | 31 // Check if this is a class which is stored in the object store. |
34 return (index >= ObjectStore::kObjectClass && index < ObjectStore::kMaxId); | 32 return (class_id == kObjectCid || |
| 33 (class_id >= kInstanceCid && class_id <= kJSRegExpCid)); |
35 } | 34 } |
36 | 35 |
37 | 36 |
38 static bool IsObjectStoreTypeId(intptr_t index) { | 37 static bool IsObjectStoreTypeId(intptr_t index) { |
39 // Check if this is a type which is stored in the object store. | 38 // Check if this is a type which is stored in the object store. |
40 return (index >= ObjectStore::kObjectType && | 39 return (index >= kObjectType && index <= kByteArrayInterface); |
41 index <= ObjectStore::kListInterface); | 40 } |
| 41 |
| 42 |
| 43 static intptr_t ClassIdFromObjectId(intptr_t object_id) { |
| 44 ASSERT(object_id > kClassIdsOffset); |
| 45 intptr_t class_id = (object_id - kClassIdsOffset); |
| 46 return class_id; |
| 47 } |
| 48 |
| 49 |
| 50 static intptr_t ObjectIdFromClassId(intptr_t class_id) { |
| 51 ASSERT(class_id > kIllegalCid && class_id < kNumPredefinedCids); |
| 52 return (class_id + kClassIdsOffset); |
| 53 } |
| 54 |
| 55 |
| 56 static RawType* GetType(ObjectStore* object_store, int index) { |
| 57 switch (index) { |
| 58 case kObjectType: return object_store->object_type(); |
| 59 case kNullType: return object_store->null_type(); |
| 60 case kDynamicType: return object_store->dynamic_type(); |
| 61 case kVoidType: return object_store->void_type(); |
| 62 case kFunctionInterface: return object_store->function_interface(); |
| 63 case kNumberInterface: return object_store->number_interface(); |
| 64 case kDoubleInterface: return object_store->double_interface(); |
| 65 case kIntInterface: return object_store->int_interface(); |
| 66 case kBoolInterface: return object_store->bool_interface(); |
| 67 case kStringInterface: return object_store->string_interface(); |
| 68 case kListInterface: return object_store->list_interface(); |
| 69 case kByteArrayInterface: return object_store->byte_array_interface(); |
| 70 default: break; |
| 71 } |
| 72 UNREACHABLE(); |
| 73 return Type::null(); |
| 74 } |
| 75 |
| 76 |
| 77 static int GetTypeIndex(ObjectStore* object_store, const RawType* raw_type) { |
| 78 ASSERT(raw_type->IsHeapObject()); |
| 79 if (raw_type == object_store->object_type()) { |
| 80 return kObjectType; |
| 81 } else if (raw_type == object_store->null_type()) { |
| 82 return kNullType; |
| 83 } else if (raw_type == object_store->dynamic_type()) { |
| 84 return kDynamicType; |
| 85 } else if (raw_type == object_store->void_type()) { |
| 86 return kVoidType; |
| 87 } else if (raw_type == object_store->function_interface()) { |
| 88 return kFunctionInterface; |
| 89 } else if (raw_type == object_store->number_interface()) { |
| 90 return kNumberInterface; |
| 91 } else if (raw_type == object_store->double_interface()) { |
| 92 return kDoubleInterface; |
| 93 } else if (raw_type == object_store->int_interface()) { |
| 94 return kIntInterface; |
| 95 } else if (raw_type == object_store->bool_interface()) { |
| 96 return kBoolInterface; |
| 97 } else if (raw_type == object_store->string_interface()) { |
| 98 return kStringInterface; |
| 99 } else if (raw_type == object_store->list_interface()) { |
| 100 return kListInterface; |
| 101 } else if (raw_type == object_store->byte_array_interface()) { |
| 102 return kByteArrayInterface; |
| 103 } |
| 104 return kInvalidIndex; |
42 } | 105 } |
43 | 106 |
44 | 107 |
45 // TODO(5411462): Temporary setup of snapshot for testing purposes, | 108 // TODO(5411462): Temporary setup of snapshot for testing purposes, |
46 // the actual creation of a snapshot maybe done differently. | 109 // the actual creation of a snapshot maybe done differently. |
47 const Snapshot* Snapshot::SetupFromBuffer(const void* raw_memory) { | 110 const Snapshot* Snapshot::SetupFromBuffer(const void* raw_memory) { |
48 ASSERT(raw_memory != NULL); | 111 ASSERT(raw_memory != NULL); |
49 ASSERT(kHeaderSize == sizeof(Snapshot)); | 112 ASSERT(kHeaderSize == sizeof(Snapshot)); |
50 ASSERT(kLengthIndex == length_offset()); | 113 ASSERT(kLengthIndex == length_offset()); |
51 ASSERT((kSnapshotFlagIndex * sizeof(int32_t)) == kind_offset()); | 114 ASSERT((kSnapshotFlagIndex * sizeof(int32_t)) == kind_offset()); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 ASSERT(SerializedHeaderTag::decode(header_value) == kInlined); | 223 ASSERT(SerializedHeaderTag::decode(header_value) == kInlined); |
161 intptr_t object_id = SerializedHeaderData::decode(header_value); | 224 intptr_t object_id = SerializedHeaderData::decode(header_value); |
162 ASSERT(GetBackRef(object_id) == NULL); | 225 ASSERT(GetBackRef(object_id) == NULL); |
163 | 226 |
164 // Read the class header information and lookup the class. | 227 // Read the class header information and lookup the class. |
165 intptr_t class_header = ReadIntptrValue(); | 228 intptr_t class_header = ReadIntptrValue(); |
166 | 229 |
167 // Since we are only reading an object reference, If it is an instance kind | 230 // Since we are only reading an object reference, If it is an instance kind |
168 // then we only need to figure out the class of the object and allocate an | 231 // then we only need to figure out the class of the object and allocate an |
169 // instance of it. The individual fields will be read later. | 232 // instance of it. The individual fields will be read later. |
170 if (SerializedHeaderData::decode(class_header) == kInstanceId) { | 233 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
171 Instance& result = Instance::ZoneHandle(isolate(), Instance::null()); | 234 Instance& result = Instance::ZoneHandle(isolate(), Instance::null()); |
172 AddBackRef(object_id, &result, kIsNotDeserialized); | 235 AddBackRef(object_id, &result, kIsNotDeserialized); |
173 | 236 |
174 cls_ ^= ReadObjectImpl(); // Read class information. | 237 cls_ ^= ReadObjectImpl(); // Read class information. |
175 ASSERT(!cls_.IsNull()); | 238 ASSERT(!cls_.IsNull()); |
176 intptr_t instance_size = cls_.instance_size(); | 239 intptr_t instance_size = cls_.instance_size(); |
177 ASSERT(instance_size > 0); | 240 ASSERT(instance_size > 0); |
178 if (kind_ == Snapshot::kFull) { | 241 if (kind_ == Snapshot::kFull) { |
179 result ^= AllocateUninitialized(cls_, instance_size); | 242 result ^= AllocateUninitialized(cls_, instance_size); |
180 } else { | 243 } else { |
181 result ^= Object::Allocate(cls_.id(), instance_size, Heap::kNew); | 244 result ^= Object::Allocate(cls_.id(), instance_size, Heap::kNew); |
182 } | 245 } |
183 return result.raw(); | 246 return result.raw(); |
184 } else { | |
185 ASSERT((class_header & kSmiTagMask) != 0); | |
186 cls_ = LookupInternalClass(class_header); | |
187 ASSERT(!cls_.IsNull()); | |
188 } | 247 } |
| 248 ASSERT((class_header & kSmiTagMask) != 0); |
| 249 cls_ = LookupInternalClass(class_header); |
| 250 ASSERT(!cls_.IsNull()); |
189 | 251 |
190 // Similarly Array and ImmutableArray objects are also similarly only | 252 // Similarly Array and ImmutableArray objects are also similarly only |
191 // allocated here, the individual array elements are read later. | 253 // allocated here, the individual array elements are read later. |
192 ObjectKind obj_kind = cls_.instance_kind(); | 254 intptr_t class_id = cls_.id(); |
193 if (obj_kind == Array::kInstanceKind) { | 255 if (class_id == kArrayCid) { |
194 // Read the length and allocate an object based on the len. | 256 // Read the length and allocate an object based on the len. |
195 intptr_t len = ReadSmiValue(); | 257 intptr_t len = ReadSmiValue(); |
196 Array& array = Array::ZoneHandle( | 258 Array& array = Array::ZoneHandle( |
197 isolate(), | 259 isolate(), |
198 (kind_ == Snapshot::kFull) ? NewArray(len) : Array::New(len)); | 260 (kind_ == Snapshot::kFull) ? NewArray(len) : Array::New(len)); |
199 AddBackRef(object_id, &array, kIsNotDeserialized); | 261 AddBackRef(object_id, &array, kIsNotDeserialized); |
200 | 262 |
201 return array.raw(); | 263 return array.raw(); |
202 } | 264 } |
203 if (obj_kind == ImmutableArray::kInstanceKind) { | 265 if (class_id == kImmutableArrayCid) { |
204 // Read the length and allocate an object based on the len. | 266 // Read the length and allocate an object based on the len. |
205 intptr_t len = ReadSmiValue(); | 267 intptr_t len = ReadSmiValue(); |
206 ImmutableArray& array = ImmutableArray::ZoneHandle( | 268 ImmutableArray& array = ImmutableArray::ZoneHandle( |
207 isolate(), | 269 isolate(), |
208 (kind_ == Snapshot::kFull) ? | 270 (kind_ == Snapshot::kFull) ? |
209 NewImmutableArray(len) : ImmutableArray::New(len)); | 271 NewImmutableArray(len) : ImmutableArray::New(len)); |
210 AddBackRef(object_id, &array, kIsNotDeserialized); | 272 AddBackRef(object_id, &array, kIsNotDeserialized); |
211 | 273 |
212 return array.raw(); | 274 return array.raw(); |
213 } | 275 } |
214 | 276 |
215 // For all other internal VM classes we read the object inline. | 277 // For all other internal VM classes we read the object inline. |
216 intptr_t tags = ReadIntptrValue(); | 278 intptr_t tags = ReadIntptrValue(); |
217 switch (obj_kind) { | 279 switch (class_id) { |
218 #define SNAPSHOT_READ(clazz) \ | 280 #define SNAPSHOT_READ(clazz) \ |
219 case clazz::kInstanceKind: { \ | 281 case clazz::kClassId: { \ |
220 obj_ = clazz::ReadFrom(this, object_id, tags, kind_); \ | 282 obj_ = clazz::ReadFrom(this, object_id, tags, kind_); \ |
221 break; \ | 283 break; \ |
222 } | 284 } |
223 CLASS_LIST_NO_OBJECT(SNAPSHOT_READ) | 285 CLASS_LIST_NO_OBJECT(SNAPSHOT_READ) |
224 #undef SNAPSHOT_READ | 286 #undef SNAPSHOT_READ |
225 default: UNREACHABLE(); break; | 287 default: UNREACHABLE(); break; |
226 } | 288 } |
227 if (kind_ == Snapshot::kFull) { | 289 if (kind_ == Snapshot::kFull) { |
228 obj_.SetCreatedFromSnapshot(); | 290 obj_.SetCreatedFromSnapshot(); |
229 } | 291 } |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 ASSERT(kind_ == Snapshot::kFull); | 403 ASSERT(kind_ == Snapshot::kFull); |
342 ASSERT(isolate()->no_gc_scope_depth() != 0); | 404 ASSERT(isolate()->no_gc_scope_depth() != 0); |
343 cls_ = Object::context_class(); | 405 cls_ = Object::context_class(); |
344 RawContext* obj = reinterpret_cast<RawContext*>( | 406 RawContext* obj = reinterpret_cast<RawContext*>( |
345 AllocateUninitialized(cls_, Context::InstanceSize(num_variables))); | 407 AllocateUninitialized(cls_, Context::InstanceSize(num_variables))); |
346 obj->ptr()->num_variables_ = num_variables; | 408 obj->ptr()->num_variables_ = num_variables; |
347 return obj; | 409 return obj; |
348 } | 410 } |
349 | 411 |
350 | 412 |
351 RawClass* SnapshotReader::NewClass(int value) { | 413 RawClass* SnapshotReader::NewClass(intptr_t class_id, bool is_signature_class) { |
352 ASSERT(kind_ == Snapshot::kFull); | 414 ASSERT(kind_ == Snapshot::kFull); |
353 ASSERT(isolate()->no_gc_scope_depth() != 0); | 415 ASSERT(isolate()->no_gc_scope_depth() != 0); |
354 ObjectKind object_kind = static_cast<ObjectKind>(value); | 416 if (class_id < kNumPredefinedCids) { |
355 if ((object_kind == kInstance || object_kind == kClosure)) { | 417 return Class::GetClass(class_id, is_signature_class); |
356 cls_ = Object::class_class(); | |
357 RawClass* obj = reinterpret_cast<RawClass*>( | |
358 AllocateUninitialized(cls_, Class::InstanceSize())); | |
359 if (object_kind == kInstance) { | |
360 Instance fake; | |
361 obj->ptr()->handle_vtable_ = fake.vtable(); | |
362 } else { | |
363 Closure fake; | |
364 obj->ptr()->handle_vtable_ = fake.vtable(); | |
365 } | |
366 cls_ = obj; | |
367 cls_.set_instance_kind(object_kind); | |
368 cls_.set_id(kIllegalObjectKind); | |
369 isolate()->class_table()->Register(cls_); | |
370 return cls_.raw(); | |
371 } | 418 } |
372 return Class::GetClass(object_kind); | 419 cls_ = Object::class_class(); |
| 420 RawClass* obj = reinterpret_cast<RawClass*>( |
| 421 AllocateUninitialized(cls_, Class::InstanceSize())); |
| 422 if (is_signature_class) { |
| 423 Closure fake; |
| 424 obj->ptr()->handle_vtable_ = fake.vtable(); |
| 425 } else { |
| 426 Instance fake; |
| 427 obj->ptr()->handle_vtable_ = fake.vtable(); |
| 428 } |
| 429 cls_ = obj; |
| 430 cls_.set_id(kIllegalCid); |
| 431 isolate()->class_table()->Register(cls_); |
| 432 return cls_.raw(); |
373 } | 433 } |
374 | 434 |
375 | 435 |
376 RawMint* SnapshotReader::NewMint(int64_t value) { | 436 RawMint* SnapshotReader::NewMint(int64_t value) { |
377 ASSERT(kind_ == Snapshot::kFull); | 437 ASSERT(kind_ == Snapshot::kFull); |
378 ASSERT(isolate()->no_gc_scope_depth() != 0); | 438 ASSERT(isolate()->no_gc_scope_depth() != 0); |
379 cls_ = object_store()->mint_class(); | 439 cls_ = object_store()->mint_class(); |
380 RawMint* obj = reinterpret_cast<RawMint*>( | 440 RawMint* obj = reinterpret_cast<RawMint*>( |
381 AllocateUninitialized(cls_, Mint::InstanceSize())); | 441 AllocateUninitialized(cls_, Mint::InstanceSize())); |
382 obj->ptr()->value_ = value; | 442 obj->ptr()->value_ = value; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 object_store()->growable_object_array_class()); | 527 object_store()->growable_object_array_class()); |
468 } | 528 } |
469 | 529 |
470 | 530 |
471 RawClass* SnapshotReader::LookupInternalClass(intptr_t class_header) { | 531 RawClass* SnapshotReader::LookupInternalClass(intptr_t class_header) { |
472 // If the header is an object Id, lookup singleton VM classes or classes | 532 // If the header is an object Id, lookup singleton VM classes or classes |
473 // stored in the object store. | 533 // stored in the object store. |
474 if (IsVMIsolateObject(class_header)) { | 534 if (IsVMIsolateObject(class_header)) { |
475 intptr_t class_id = GetVMIsolateObjectId(class_header); | 535 intptr_t class_id = GetVMIsolateObjectId(class_header); |
476 if (IsSingletonClassId(class_id)) { | 536 if (IsSingletonClassId(class_id)) { |
477 return Object::GetSingletonClass(class_id); // return singleton. | 537 return isolate()->class_table()->At(class_id); // get singleton class. |
478 } | 538 } |
479 } else if (SerializedHeaderTag::decode(class_header) == kObjectId) { | 539 } else if (SerializedHeaderTag::decode(class_header) == kObjectId) { |
480 intptr_t header_value = SerializedHeaderData::decode(class_header); | 540 intptr_t class_id = SerializedHeaderData::decode(class_header); |
481 if (IsObjectStoreClassId(header_value)) { | 541 if (IsObjectStoreClassId(class_id)) { |
482 return object_store()->GetClass(header_value); | 542 return isolate()->class_table()->At(class_id); // get singleton class. |
483 } | 543 } |
484 } | 544 } |
485 return Class::null(); | 545 return Class::null(); |
486 } | 546 } |
487 | 547 |
488 | 548 |
489 RawObject* SnapshotReader::AllocateUninitialized(const Class& cls, | 549 RawObject* SnapshotReader::AllocateUninitialized(const Class& cls, |
490 intptr_t size) { | 550 intptr_t size) { |
491 ASSERT(isolate()->no_gc_scope_depth() != 0); | 551 ASSERT(isolate()->no_gc_scope_depth() != 0); |
492 ASSERT(Utils::IsAligned(size, kObjectAlignment)); | 552 ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
493 Heap* heap = isolate()->heap(); | 553 Heap* heap = isolate()->heap(); |
494 | 554 |
495 uword address = heap->TryAllocate(size, Heap::kOld); | 555 uword address = heap->TryAllocate(size, Heap::kOld); |
496 if (address == 0) { | 556 if (address == 0) { |
497 // Use the preallocated out of memory exception to avoid calling | 557 // Use the preallocated out of memory exception to avoid calling |
498 // into dart code or allocating any code. | 558 // into dart code or allocating any code. |
499 const Instance& exception = | 559 const Instance& exception = |
500 Instance::Handle(object_store()->out_of_memory()); | 560 Instance::Handle(object_store()->out_of_memory()); |
501 Exceptions::Throw(exception); | 561 Exceptions::Throw(exception); |
502 UNREACHABLE(); | 562 UNREACHABLE(); |
503 } | 563 } |
504 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 564 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); |
505 uword tags = 0; | 565 uword tags = 0; |
506 intptr_t index = cls.id(); | 566 intptr_t index = cls.id(); |
507 ASSERT(index != kIllegalObjectKind); | 567 ASSERT(index != kIllegalCid); |
508 tags = RawObject::ClassIdTag::update(index, tags); | 568 tags = RawObject::ClassIdTag::update(index, tags); |
509 tags = RawObject::SizeTag::update(size, tags); | 569 tags = RawObject::SizeTag::update(size, tags); |
510 raw_obj->ptr()->tags_ = tags; | 570 raw_obj->ptr()->tags_ = tags; |
511 return raw_obj; | 571 return raw_obj; |
512 } | 572 } |
513 | 573 |
514 | 574 |
515 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) { | 575 RawObject* SnapshotReader::ReadVMIsolateObject(intptr_t header_value) { |
516 intptr_t object_id = GetVMIsolateObjectId(header_value); | 576 intptr_t object_id = GetVMIsolateObjectId(header_value); |
517 if (object_id == Object::kNullObject) { | 577 if (object_id == kNullObject) { |
518 // This is a singleton null object, return it. | 578 // This is a singleton null object, return it. |
519 return Object::null(); | 579 return Object::null(); |
520 } | 580 } |
521 if (object_id == Object::kSentinelObject) { | 581 if (object_id == kSentinelObject) { |
522 return Object::sentinel(); | 582 return Object::sentinel(); |
523 } | 583 } |
524 if (IsSingletonClassId(object_id)) { | 584 intptr_t class_id = ClassIdFromObjectId(object_id); |
525 return Object::GetSingletonClass(object_id); // return singleton object. | 585 if (IsSingletonClassId(class_id)) { |
| 586 return isolate()->class_table()->At(class_id); // get singleton class. |
526 } else { | 587 } else { |
527 ASSERT(Symbols::IsVMSymbolId(object_id)); | 588 ASSERT(Symbols::IsVMSymbolId(object_id)); |
528 return Symbols::GetVMSymbol(object_id); // return VM symbol. | 589 return Symbols::GetVMSymbol(object_id); // return VM symbol. |
529 } | 590 } |
530 UNREACHABLE(); | 591 UNREACHABLE(); |
| 592 return Object::null(); |
531 } | 593 } |
532 | 594 |
533 | 595 |
534 RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id) { | 596 RawObject* SnapshotReader::ReadIndexedObject(intptr_t object_id) { |
535 if (IsObjectStoreClassId(object_id)) { | 597 if (object_id == kTrueValue) { |
536 return object_store()->GetClass(object_id); | |
537 } else if (object_id == ObjectStore::kTrueValue) { | |
538 return object_store()->true_value(); | 598 return object_store()->true_value(); |
539 } else if (object_id == ObjectStore::kFalseValue) { | 599 } |
| 600 if (object_id == kFalseValue) { |
540 return object_store()->false_value(); | 601 return object_store()->false_value(); |
541 } else if (kind_ != Snapshot::kFull) { | 602 } |
| 603 intptr_t class_id = ClassIdFromObjectId(object_id); |
| 604 if (IsObjectStoreClassId(class_id)) { |
| 605 return isolate()->class_table()->At(class_id); // get singleton class. |
| 606 } |
| 607 if (kind_ != Snapshot::kFull) { |
542 if (IsObjectStoreTypeId(object_id)) { | 608 if (IsObjectStoreTypeId(object_id)) { |
543 return object_store()->GetType(object_id); // return type object. | 609 return GetType(object_store(), object_id); // return type obj. |
544 } | 610 } |
545 } | 611 } |
546 | |
547 Object* object = GetBackRef(object_id); | 612 Object* object = GetBackRef(object_id); |
548 return object->raw(); | 613 return object->raw(); |
549 } | 614 } |
550 | 615 |
551 | 616 |
552 RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) { | 617 RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) { |
553 // Read the class header information and lookup the class. | 618 // Read the class header information and lookup the class. |
554 intptr_t class_header = ReadIntptrValue(); | 619 intptr_t class_header = ReadIntptrValue(); |
555 intptr_t tags = ReadIntptrValue(); | 620 intptr_t tags = ReadIntptrValue(); |
556 if (SerializedHeaderData::decode(class_header) == kInstanceId) { | 621 if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
557 // Object is regular dart instance. | 622 // Object is regular dart instance. |
558 Instance* result = reinterpret_cast<Instance*>(GetBackRef(object_id)); | 623 Instance* result = reinterpret_cast<Instance*>(GetBackRef(object_id)); |
559 intptr_t instance_size = 0; | 624 intptr_t instance_size = 0; |
560 if (result == NULL) { | 625 if (result == NULL) { |
561 result = &(Instance::ZoneHandle(isolate(), Instance::null())); | 626 result = &(Instance::ZoneHandle(isolate(), Instance::null())); |
562 AddBackRef(object_id, result, kIsDeserialized); | 627 AddBackRef(object_id, result, kIsDeserialized); |
563 cls_ ^= ReadObjectImpl(); | 628 cls_ ^= ReadObjectImpl(); |
564 ASSERT(!cls_.IsNull()); | 629 ASSERT(!cls_.IsNull()); |
565 instance_size = cls_.instance_size(); | 630 instance_size = cls_.instance_size(); |
566 ASSERT(instance_size > 0); | 631 ASSERT(instance_size > 0); |
(...skipping 13 matching lines...) Expand all Loading... |
580 obj_ = ReadObjectRef(); | 645 obj_ = ReadObjectRef(); |
581 result->SetFieldAtOffset(offset, obj_); | 646 result->SetFieldAtOffset(offset, obj_); |
582 offset += kWordSize; | 647 offset += kWordSize; |
583 } | 648 } |
584 if (kind_ == Snapshot::kFull) { | 649 if (kind_ == Snapshot::kFull) { |
585 result->SetCreatedFromSnapshot(); | 650 result->SetCreatedFromSnapshot(); |
586 } else if (result->IsCanonical()) { | 651 } else if (result->IsCanonical()) { |
587 *result = result->Canonicalize(); | 652 *result = result->Canonicalize(); |
588 } | 653 } |
589 return result->raw(); | 654 return result->raw(); |
590 } else { | |
591 ASSERT((class_header & kSmiTagMask) != 0); | |
592 cls_ = LookupInternalClass(class_header); | |
593 ASSERT(!cls_.IsNull()); | |
594 } | 655 } |
595 switch (cls_.instance_kind()) { | 656 ASSERT((class_header & kSmiTagMask) != 0); |
| 657 cls_ = LookupInternalClass(class_header); |
| 658 ASSERT(!cls_.IsNull()); |
| 659 switch (cls_.id()) { |
596 #define SNAPSHOT_READ(clazz) \ | 660 #define SNAPSHOT_READ(clazz) \ |
597 case clazz::kInstanceKind: { \ | 661 case clazz::kClassId: { \ |
598 obj_ = clazz::ReadFrom(this, object_id, tags, kind_); \ | 662 obj_ = clazz::ReadFrom(this, object_id, tags, kind_); \ |
599 break; \ | 663 break; \ |
600 } | 664 } |
601 CLASS_LIST_NO_OBJECT(SNAPSHOT_READ) | 665 CLASS_LIST_NO_OBJECT(SNAPSHOT_READ) |
602 #undef SNAPSHOT_READ | 666 #undef SNAPSHOT_READ |
603 default: UNREACHABLE(); break; | 667 default: UNREACHABLE(); break; |
604 } | 668 } |
605 if (kind_ == Snapshot::kFull) { | 669 if (kind_ == Snapshot::kFull) { |
606 obj_.SetCreatedFromSnapshot(); | 670 obj_.SetCreatedFromSnapshot(); |
607 } | 671 } |
(...skipping 20 matching lines...) Expand all Loading... |
628 | 692 |
629 void SnapshotWriter::WriteObject(RawObject* rawobj) { | 693 void SnapshotWriter::WriteObject(RawObject* rawobj) { |
630 WriteObjectImpl(rawobj); | 694 WriteObjectImpl(rawobj); |
631 WriteForwardedObjects(); | 695 WriteForwardedObjects(); |
632 } | 696 } |
633 | 697 |
634 | 698 |
635 void SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) { | 699 void SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) { |
636 // Check if it is a singleton null object. | 700 // Check if it is a singleton null object. |
637 if (rawobj == Object::null()) { | 701 if (rawobj == Object::null()) { |
638 WriteVMIsolateObject(Object::kNullObject); | 702 WriteVMIsolateObject(kNullObject); |
639 return; | 703 return; |
640 } | 704 } |
641 | 705 |
642 // Check if it is a singleton sentinel object. | 706 // Check if it is a singleton sentinel object. |
643 if (rawobj == Object::sentinel()) { | 707 if (rawobj == Object::sentinel()) { |
644 WriteVMIsolateObject(Object::kSentinelObject); | 708 WriteVMIsolateObject(kSentinelObject); |
645 return; | 709 return; |
646 } | 710 } |
647 | 711 |
648 // Check if it is a singleton class object. | 712 // Check if it is a singleton class object which is shared by |
649 RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj); | 713 // all isolates. |
650 intptr_t index = Object::GetSingletonClassIndex(raw_class); | 714 intptr_t id = rawobj->GetClassId(); |
651 if (index != Object::kInvalidIndex) { | 715 if (id == kClassCid) { |
652 WriteVMIsolateObject(index); | 716 RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj); |
| 717 intptr_t class_id = raw_class->ptr()->id_; |
| 718 if (IsSingletonClassId(class_id)) { |
| 719 intptr_t object_id = ObjectIdFromClassId(class_id); |
| 720 WriteVMIsolateObject(object_id); |
| 721 return; |
| 722 } |
| 723 } |
| 724 |
| 725 // Check it is a predefined symbol in the VM isolate. |
| 726 id = Symbols::LookupVMSymbol(rawobj); |
| 727 if (id != kInvalidIndex) { |
| 728 WriteVMIsolateObject(id); |
653 return; | 729 return; |
654 } | 730 } |
655 | 731 |
656 // Check it is a predefined symbol. | |
657 index = Symbols::LookupVMSymbol(rawobj); | |
658 if (index != Object::kInvalidIndex) { | |
659 WriteVMIsolateObject(index); | |
660 return; | |
661 } | |
662 | |
663 UNREACHABLE(); | 732 UNREACHABLE(); |
664 } | 733 } |
665 | 734 |
666 | 735 |
667 void SnapshotWriter::WriteObjectRef(RawObject* raw) { | 736 void SnapshotWriter::WriteObjectRef(RawObject* raw) { |
668 // First check if object can be written as a simple predefined type. | 737 // First check if object can be written as a simple predefined type. |
669 if (CheckAndWritePredefinedObject(raw)) { | 738 if (CheckAndWritePredefinedObject(raw)) { |
670 return; | 739 return; |
671 } | 740 } |
672 // Check if object has already been serialized, in that | |
673 // case just write the object id out. | |
674 uword tags = raw->ptr()->tags_; | |
675 if (SerializedHeaderTag::decode(tags) == kObjectId) { | |
676 intptr_t id = SerializedHeaderData::decode(tags); | |
677 WriteIndexedObject(id); | |
678 return; | |
679 } | |
680 | 741 |
681 NoGCScope no_gc; | 742 NoGCScope no_gc; |
682 RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags)); | 743 RawClass* cls = class_table_->At(raw->GetClassId()); |
683 | 744 intptr_t class_id = cls->ptr()->id_; |
684 ObjectKind obj_kind = cls->ptr()->instance_kind_; | 745 ASSERT(class_id == raw->GetClassId()); |
685 if (obj_kind == Instance::kInstanceKind) { | 746 if (class_id >= kNumPredefinedCids) { |
| 747 ASSERT(!Class::IsSignatureClass(cls)); |
686 // Object is being referenced, add it to the forward ref list and mark | 748 // Object is being referenced, add it to the forward ref list and mark |
687 // it so that future references to this object in the snapshot will use | 749 // it so that future references to this object in the snapshot will use |
688 // this object id. Mark it as not having been serialized yet so that we | 750 // this object id. Mark it as not having been serialized yet so that we |
689 // will serialize the object when we go through the forward list. | 751 // will serialize the object when we go through the forward list. |
690 intptr_t object_id = MarkObject(raw, kIsNotSerialized); | 752 intptr_t object_id = MarkObject(raw, kIsNotSerialized); |
691 | 753 |
692 // Write out the serialization header value for this object. | 754 // Write out the serialization header value for this object. |
693 WriteInlinedObjectHeader(object_id); | 755 WriteInlinedObjectHeader(object_id); |
694 | 756 |
695 // Indicate this is an instance object. | 757 // Indicate this is an instance object. |
696 WriteIntptrValue(SerializedHeaderData::encode(kInstanceId)); | 758 WriteIntptrValue(SerializedHeaderData::encode(kInstanceObjectId)); |
697 | 759 |
698 // Write out the class information for this object. | 760 // Write out the class information for this object. |
699 WriteObjectImpl(cls); | 761 WriteObjectImpl(cls); |
700 | 762 |
701 return; | 763 return; |
702 } | 764 } |
703 if (obj_kind == Array::kInstanceKind) { | 765 if (class_id == kArrayCid) { |
704 // Object is being referenced, add it to the forward ref list and mark | 766 // Object is being referenced, add it to the forward ref list and mark |
705 // it so that future references to this object in the snapshot will use | 767 // it so that future references to this object in the snapshot will use |
706 // this object id. Mark it as not having been serialized yet so that we | 768 // this object id. Mark it as not having been serialized yet so that we |
707 // will serialize the object when we go through the forward list. | 769 // will serialize the object when we go through the forward list. |
708 intptr_t object_id = MarkObject(raw, kIsNotSerialized); | 770 intptr_t object_id = MarkObject(raw, kIsNotSerialized); |
709 | 771 |
710 RawArray* rawarray = reinterpret_cast<RawArray*>(raw); | 772 RawArray* rawarray = reinterpret_cast<RawArray*>(raw); |
711 | 773 |
712 // Write out the serialization header value for this object. | 774 // Write out the serialization header value for this object. |
713 WriteInlinedObjectHeader(object_id); | 775 WriteInlinedObjectHeader(object_id); |
714 | 776 |
715 // Write out the class information. | 777 // Write out the class information. |
716 WriteIndexedObject(ObjectStore::kArrayClass); | 778 WriteIndexedObject(kArrayCid); |
717 | 779 |
718 // Write out the length field. | 780 // Write out the length field. |
719 Write<RawObject*>(rawarray->ptr()->length_); | 781 Write<RawObject*>(rawarray->ptr()->length_); |
720 | 782 |
721 return; | 783 return; |
722 } | 784 } |
723 if (obj_kind == ImmutableArray::kInstanceKind) { | 785 if (class_id == kImmutableArrayCid) { |
724 // Object is being referenced, add it to the forward ref list and mark | 786 // Object is being referenced, add it to the forward ref list and mark |
725 // it so that future references to this object in the snapshot will use | 787 // it so that future references to this object in the snapshot will use |
726 // this object id. Mark it as not having been serialized yet so that we | 788 // this object id. Mark it as not having been serialized yet so that we |
727 // will serialize the object when we go through the forward list. | 789 // will serialize the object when we go through the forward list. |
728 intptr_t object_id = MarkObject(raw, kIsNotSerialized); | 790 intptr_t object_id = MarkObject(raw, kIsNotSerialized); |
729 | 791 |
730 RawArray* rawarray = reinterpret_cast<RawArray*>(raw); | 792 RawArray* rawarray = reinterpret_cast<RawArray*>(raw); |
731 | 793 |
732 // Write out the serialization header value for this object. | 794 // Write out the serialization header value for this object. |
733 WriteInlinedObjectHeader(object_id); | 795 WriteInlinedObjectHeader(object_id); |
734 | 796 |
735 // Write out the class information. | 797 // Write out the class information. |
736 WriteIndexedObject(ObjectStore::kImmutableArrayClass); | 798 WriteIndexedObject(kImmutableArrayCid); |
737 | 799 |
738 // Write out the length field. | 800 // Write out the length field. |
739 Write<RawObject*>(rawarray->ptr()->length_); | 801 Write<RawObject*>(rawarray->ptr()->length_); |
740 | 802 |
741 return; | 803 return; |
742 } | 804 } |
743 // Object is being referenced, add it to the forward ref list and mark | 805 // Object is being referenced, add it to the forward ref list and mark |
744 // it so that future references to this object in the snapshot will use | 806 // it so that future references to this object in the snapshot will use |
745 // this object id. Mark it as not having been serialized yet so that we | 807 // this object id. Mark it as not having been serialized yet so that we |
746 // will serialize the object when we go through the forward list. | 808 // will serialize the object when we go through the forward list. |
747 intptr_t object_id = MarkObject(raw, kIsSerialized); | 809 intptr_t object_id = MarkObject(raw, kIsSerialized); |
748 switch (obj_kind) { | 810 switch (class_id) { |
749 #define SNAPSHOT_WRITE(clazz) \ | 811 #define SNAPSHOT_WRITE(clazz) \ |
750 case clazz::kInstanceKind: { \ | 812 case clazz::kClassId: { \ |
751 Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw); \ | 813 Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw); \ |
752 raw_obj->WriteTo(this, object_id, kind_); \ | 814 raw_obj->WriteTo(this, object_id, kind_); \ |
753 return; \ | 815 return; \ |
754 } \ | 816 } \ |
755 | 817 |
756 CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) | 818 CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) |
757 #undef SNAPSHOT_WRITE | 819 #undef SNAPSHOT_WRITE |
758 default: break; | 820 default: break; |
759 } | 821 } |
760 UNREACHABLE(); | 822 UNREACHABLE(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 // Now check if it is an object from the VM isolate (NOTE: premarked objects | 905 // Now check if it is an object from the VM isolate (NOTE: premarked objects |
844 // are considered to be objects in the VM isolate). These objects are shared | 906 // are considered to be objects in the VM isolate). These objects are shared |
845 // by all isolates. | 907 // by all isolates. |
846 if (rawobj->IsMarked()) { | 908 if (rawobj->IsMarked()) { |
847 HandleVMIsolateObject(rawobj); | 909 HandleVMIsolateObject(rawobj); |
848 return true; | 910 return true; |
849 } | 911 } |
850 | 912 |
851 // Check if it is a singleton boolean true value. | 913 // Check if it is a singleton boolean true value. |
852 if (rawobj == object_store()->true_value()) { | 914 if (rawobj == object_store()->true_value()) { |
853 WriteIndexedObject(ObjectStore::kTrueValue); | 915 WriteIndexedObject(kTrueValue); |
854 return true; | 916 return true; |
855 } | 917 } |
856 | 918 |
857 // Check if it is a singleton boolean false value. | 919 // Check if it is a singleton boolean false value. |
858 if (rawobj == object_store()->false_value()) { | 920 if (rawobj == object_store()->false_value()) { |
859 WriteIndexedObject(ObjectStore::kFalseValue); | 921 WriteIndexedObject(kFalseValue); |
860 return true; | 922 return true; |
861 } | 923 } |
862 | 924 |
863 // Check if it is a code object in that case just write a Null object | 925 // Check if it is a code object in that case just write a Null object |
864 // as we do not want code objects in the snapshot. | 926 // as we do not want code objects in the snapshot. |
865 if (rawobj->GetClassId() == kCode) { | 927 if (rawobj->GetClassId() == kCodeCid) { |
866 WriteVMIsolateObject(Object::kNullObject); | 928 WriteVMIsolateObject(kNullObject); |
867 return true; | 929 return true; |
868 } | 930 } |
869 | 931 |
870 // Check if classes are not being serialized and it is preinitialized type. | 932 // Check if classes are not being serialized and it is preinitialized type. |
871 if (kind_ != Snapshot::kFull) { | 933 if (kind_ != Snapshot::kFull) { |
872 RawType* raw_type = reinterpret_cast<RawType*>(rawobj); | 934 RawType* raw_type = reinterpret_cast<RawType*>(rawobj); |
873 intptr_t index = object_store()->GetTypeIndex(raw_type); | 935 intptr_t index = GetTypeIndex(object_store(), raw_type); |
874 if (index != ObjectStore::kInvalidIndex) { | 936 if (index != kInvalidIndex) { |
875 WriteIndexedObject(index); | 937 WriteIndexedObject(index); |
876 return true; | 938 return true; |
877 } | 939 } |
878 } | 940 } |
879 | 941 |
880 return false; | 942 return false; |
881 } | 943 } |
882 | 944 |
883 | 945 |
884 void SnapshotWriter::WriteObjectImpl(RawObject* raw) { | 946 void SnapshotWriter::WriteObjectImpl(RawObject* raw) { |
(...skipping 16 matching lines...) Expand all Loading... |
901 // - Object is seen for the first time (inlined as follows): | 963 // - Object is seen for the first time (inlined as follows): |
902 // (object size in multiples of kObjectAlignment | 0x1) | 964 // (object size in multiples of kObjectAlignment | 0x1) |
903 // serialized fields of the object | 965 // serialized fields of the object |
904 // ...... | 966 // ...... |
905 NoGCScope no_gc; | 967 NoGCScope no_gc; |
906 uword tags = raw->ptr()->tags_; | 968 uword tags = raw->ptr()->tags_; |
907 ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); | 969 ASSERT(SerializedHeaderTag::decode(tags) == kObjectId); |
908 intptr_t object_id = SerializedHeaderData::decode(tags); | 970 intptr_t object_id = SerializedHeaderData::decode(tags); |
909 tags = forward_list_[object_id - kMaxPredefinedObjectIds]->tags(); | 971 tags = forward_list_[object_id - kMaxPredefinedObjectIds]->tags(); |
910 RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags)); | 972 RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags)); |
911 ObjectKind kind = cls->ptr()->instance_kind_; | 973 intptr_t class_id = cls->ptr()->id_; |
912 | 974 |
913 if (kind == Instance::kInstanceKind) { | 975 if (class_id >= kNumPredefinedCids) { |
| 976 ASSERT(!Class::IsSignatureClass(cls)); |
914 // Object is regular dart instance. | 977 // Object is regular dart instance. |
915 // TODO(5411462): figure out what we need to do if an object with native | 978 // TODO(5411462): figure out what we need to do if an object with native |
916 // fields is serialized (throw exception or serialize a null object). | 979 // fields is serialized (throw exception or serialize a null object). |
917 ASSERT(cls->ptr()->num_native_fields_ == 0); | 980 ASSERT(cls->ptr()->num_native_fields_ == 0); |
918 intptr_t instance_size = cls->ptr()->instance_size_; | 981 intptr_t instance_size = cls->ptr()->instance_size_; |
919 ASSERT(instance_size != 0); | 982 ASSERT(instance_size != 0); |
920 | 983 |
921 // Write out the serialization header value for this object. | 984 // Write out the serialization header value for this object. |
922 WriteInlinedObjectHeader(object_id); | 985 WriteInlinedObjectHeader(object_id); |
923 | 986 |
924 // Indicate this is an instance object. | 987 // Indicate this is an instance object. |
925 WriteIntptrValue(SerializedHeaderData::encode(kInstanceId)); | 988 WriteIntptrValue(SerializedHeaderData::encode(kInstanceObjectId)); |
926 | 989 |
927 // Write out the tags. | 990 // Write out the tags. |
928 WriteIntptrValue(tags); | 991 WriteIntptrValue(tags); |
929 | 992 |
930 // Write out the class information for this object. | 993 // Write out the class information for this object. |
931 WriteObjectImpl(cls); | 994 WriteObjectImpl(cls); |
932 | 995 |
933 // Write out all the fields for the object. | 996 // Write out all the fields for the object. |
934 intptr_t offset = Object::InstanceSize(); | 997 intptr_t offset = Object::InstanceSize(); |
935 while (offset < instance_size) { | 998 while (offset < instance_size) { |
936 WriteObjectRef(*reinterpret_cast<RawObject**>( | 999 WriteObjectRef(*reinterpret_cast<RawObject**>( |
937 reinterpret_cast<uword>(raw->ptr()) + offset)); | 1000 reinterpret_cast<uword>(raw->ptr()) + offset)); |
938 offset += kWordSize; | 1001 offset += kWordSize; |
939 } | 1002 } |
940 return; | 1003 return; |
941 } | 1004 } |
942 switch (kind) { | 1005 switch (class_id) { |
943 #define SNAPSHOT_WRITE(clazz) \ | 1006 #define SNAPSHOT_WRITE(clazz) \ |
944 case clazz::kInstanceKind: { \ | 1007 case clazz::kClassId: { \ |
945 Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw); \ | 1008 Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw); \ |
946 raw_obj->WriteTo(this, object_id, kind_); \ | 1009 raw_obj->WriteTo(this, object_id, kind_); \ |
947 return; \ | 1010 return; \ |
948 } \ | 1011 } \ |
949 | 1012 |
950 CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) | 1013 CLASS_LIST_NO_OBJECT(SNAPSHOT_WRITE) |
951 #undef SNAPSHOT_WRITE | 1014 #undef SNAPSHOT_WRITE |
952 default: break; | 1015 default: break; |
953 } | 1016 } |
954 UNREACHABLE(); | 1017 UNREACHABLE(); |
(...skipping 14 matching lines...) Expand all Loading... |
969 | 1032 |
970 // Mark object as serialized. | 1033 // Mark object as serialized. |
971 forward_list_[i]->set_state(kIsSerialized); | 1034 forward_list_[i]->set_state(kIsSerialized); |
972 } | 1035 } |
973 } | 1036 } |
974 } | 1037 } |
975 | 1038 |
976 | 1039 |
977 void SnapshotWriter::WriteClassId(RawClass* cls) { | 1040 void SnapshotWriter::WriteClassId(RawClass* cls) { |
978 ASSERT(kind_ != Snapshot::kFull); | 1041 ASSERT(kind_ != Snapshot::kFull); |
979 int id = object_store()->GetClassIndex(cls); | 1042 int class_id = cls->ptr()->id_; |
980 if (IsSingletonClassId(id)) { | 1043 if (IsSingletonClassId(class_id)) { |
981 WriteVMIsolateObject(id); | 1044 intptr_t object_id = ObjectIdFromClassId(class_id); |
982 } else if (IsObjectStoreClassId(id)) { | 1045 WriteVMIsolateObject(object_id); |
983 WriteIndexedObject(id); | 1046 } else if (IsObjectStoreClassId(class_id)) { |
| 1047 intptr_t object_id = ObjectIdFromClassId(class_id); |
| 1048 WriteIndexedObject(object_id); |
984 } else { | 1049 } else { |
985 // TODO(5411462): Should restrict this to only core-lib classes in this | 1050 // TODO(5411462): Should restrict this to only core-lib classes in this |
986 // case. | 1051 // case. |
987 // Write out the class and tags information. | 1052 // Write out the class and tags information. |
988 WriteVMIsolateObject(Object::kClassClass); | 1053 WriteVMIsolateObject(kClassCid); |
989 WriteIntptrValue(GetObjectTags(cls)); | 1054 WriteIntptrValue(GetObjectTags(cls)); |
990 | 1055 |
991 // Write out the library url and class name. | 1056 // Write out the library url and class name. |
992 RawLibrary* library = cls->ptr()->library_; | 1057 RawLibrary* library = cls->ptr()->library_; |
993 ASSERT(library != Library::null()); | 1058 ASSERT(library != Library::null()); |
994 WriteObjectImpl(library->ptr()->url_); | 1059 WriteObjectImpl(library->ptr()->url_); |
995 WriteObjectImpl(cls->ptr()->name_); | 1060 WriteObjectImpl(cls->ptr()->name_); |
996 } | 1061 } |
997 } | 1062 } |
998 | 1063 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1041 RawObject* raw_obj = *current; | 1106 RawObject* raw_obj = *current; |
1042 if (as_references_) { | 1107 if (as_references_) { |
1043 writer_->WriteObjectRef(raw_obj); | 1108 writer_->WriteObjectRef(raw_obj); |
1044 } else { | 1109 } else { |
1045 writer_->WriteObjectImpl(raw_obj); | 1110 writer_->WriteObjectImpl(raw_obj); |
1046 } | 1111 } |
1047 } | 1112 } |
1048 } | 1113 } |
1049 | 1114 |
1050 } // namespace dart | 1115 } // namespace dart |
OLD | NEW |