Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: runtime/vm/raw_object_snapshot.cc

Issue 2481873005: clang-format runtime/vm (Closed)
Patch Set: Merge Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/raw_object.cc ('k') | runtime/vm/redundancy_elimination.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/native_entry.h" 5 #include "vm/native_entry.h"
6 #include "vm/object.h" 6 #include "vm/object.h"
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/snapshot.h" 8 #include "vm/snapshot.h"
9 #include "vm/stub_code.h" 9 #include "vm/stub_code.h"
10 #include "vm/symbols.h" 10 #include "vm/symbols.h"
11 #include "vm/visitor.h" 11 #include "vm/visitor.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 DECLARE_FLAG(bool, remove_script_timestamps_for_test); 15 DECLARE_FLAG(bool, remove_script_timestamps_for_test);
16 16
17 #define OFFSET_OF_FROM(obj) \ 17 #define OFFSET_OF_FROM(obj) \
18 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr()) 18 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr())
19 19
20 // TODO(18854): Need to assert No GC can happen here, even though 20 // TODO(18854): Need to assert No GC can happen here, even though
21 // allocations may happen. 21 // allocations may happen.
22 #define READ_OBJECT_FIELDS(object, from, to, as_reference) \ 22 #define READ_OBJECT_FIELDS(object, from, to, as_reference) \
23 intptr_t num_flds = (to) - (from); \ 23 intptr_t num_flds = (to) - (from); \
24 intptr_t from_offset = OFFSET_OF_FROM(object); \ 24 intptr_t from_offset = OFFSET_OF_FROM(object); \
25 for (intptr_t i = 0; i <= num_flds; i++) { \ 25 for (intptr_t i = 0; i <= num_flds; i++) { \
26 (*reader->PassiveObjectHandle()) = \ 26 (*reader->PassiveObjectHandle()) = \
27 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \ 27 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \
28 object.StorePointer(((from) + i), \ 28 object.StorePointer(((from) + i), reader->PassiveObjectHandle()->raw()); \
29 reader->PassiveObjectHandle()->raw()); \
30 } 29 }
31 30
32 RawClass* Class::ReadFrom(SnapshotReader* reader, 31 RawClass* Class::ReadFrom(SnapshotReader* reader,
33 intptr_t object_id, 32 intptr_t object_id,
34 intptr_t tags, 33 intptr_t tags,
35 Snapshot::Kind kind, 34 Snapshot::Kind kind,
36 bool as_reference) { 35 bool as_reference) {
37 ASSERT(reader != NULL); 36 ASSERT(reader != NULL);
38 37
39 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); 38 Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
(...skipping 18 matching lines...) Expand all
58 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); 57 cls.set_next_field_offset_in_words(reader->Read<int32_t>());
59 } 58 }
60 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); 59 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>());
61 cls.set_num_type_arguments(reader->Read<int16_t>()); 60 cls.set_num_type_arguments(reader->Read<int16_t>());
62 cls.set_num_own_type_arguments(reader->Read<int16_t>()); 61 cls.set_num_own_type_arguments(reader->Read<int16_t>());
63 cls.set_num_native_fields(reader->Read<uint16_t>()); 62 cls.set_num_native_fields(reader->Read<uint16_t>());
64 cls.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); 63 cls.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
65 cls.set_state_bits(reader->Read<uint16_t>()); 64 cls.set_state_bits(reader->Read<uint16_t>());
66 65
67 // Set all the object fields. 66 // Set all the object fields.
68 READ_OBJECT_FIELDS(cls, 67 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to_snapshot(kind),
69 cls.raw()->from(),
70 cls.raw()->to_snapshot(kind),
71 kAsReference); 68 kAsReference);
72 cls.StorePointer(&cls.raw_ptr()->dependent_code_, Array::null()); 69 cls.StorePointer(&cls.raw_ptr()->dependent_code_, Array::null());
73 ASSERT(!cls.IsInFullSnapshot()); 70 ASSERT(!cls.IsInFullSnapshot());
74 } else { 71 } else {
75 cls ^= reader->ReadClassId(object_id); 72 cls ^= reader->ReadClassId(object_id);
76 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); 73 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot());
77 } 74 }
78 return cls.raw(); 75 return cls.raw();
79 } 76 }
80 77
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 133
137 134
138 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader, 135 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader,
139 intptr_t object_id, 136 intptr_t object_id,
140 intptr_t tags, 137 intptr_t tags,
141 Snapshot::Kind kind, 138 Snapshot::Kind kind,
142 bool as_reference) { 139 bool as_reference) {
143 ASSERT(reader != NULL); 140 ASSERT(reader != NULL);
144 141
145 // Allocate unresolved class object. 142 // Allocate unresolved class object.
146 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( 143 UnresolvedClass& unresolved_class =
147 reader->zone(), UnresolvedClass::New()); 144 UnresolvedClass::ZoneHandle(reader->zone(), UnresolvedClass::New());
148 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); 145 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
149 146
150 // Set all non object fields. 147 // Set all non object fields.
151 unresolved_class.set_token_pos( 148 unresolved_class.set_token_pos(
152 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); 149 TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
153 150
154 // Set all the object fields. 151 // Set all the object fields.
155 READ_OBJECT_FIELDS(unresolved_class, 152 READ_OBJECT_FIELDS(unresolved_class, unresolved_class.raw()->from(),
156 unresolved_class.raw()->from(), 153 unresolved_class.raw()->to(), kAsReference);
157 unresolved_class.raw()->to(),
158 kAsReference);
159 154
160 return unresolved_class.raw(); 155 return unresolved_class.raw();
161 } 156 }
162 157
163 158
164 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, 159 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer,
165 intptr_t object_id, 160 intptr_t object_id,
166 Snapshot::Kind kind, 161 Snapshot::Kind kind,
167 bool as_reference) { 162 bool as_reference) {
168 ASSERT(writer != NULL); 163 ASSERT(writer != NULL);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 Snapshot::Kind kind, 202 Snapshot::Kind kind,
208 bool as_reference) { 203 bool as_reference) {
209 ASSERT(reader != NULL); 204 ASSERT(reader != NULL);
210 205
211 // Determine if the type class of this type is in the full snapshot. 206 // Determine if the type class of this type is in the full snapshot.
212 bool typeclass_is_in_fullsnapshot = reader->Read<bool>(); 207 bool typeclass_is_in_fullsnapshot = reader->Read<bool>();
213 208
214 // Allocate type object. 209 // Allocate type object.
215 Type& type = Type::ZoneHandle(reader->zone(), Type::New()); 210 Type& type = Type::ZoneHandle(reader->zone(), Type::New());
216 bool is_canonical = RawObject::IsCanonical(tags); 211 bool is_canonical = RawObject::IsCanonical(tags);
217 bool defer_canonicalization = is_canonical && 212 bool defer_canonicalization =
213 is_canonical &&
218 ((kind == Snapshot::kMessage) || 214 ((kind == Snapshot::kMessage) ||
219 (!Snapshot::IsFull(kind) && typeclass_is_in_fullsnapshot)); 215 (!Snapshot::IsFull(kind) && typeclass_is_in_fullsnapshot));
220 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); 216 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization);
221 217
222 // Set all non object fields. 218 // Set all non object fields.
223 type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); 219 type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
224 type.set_type_state(reader->Read<int8_t>()); 220 type.set_type_state(reader->Read<int8_t>());
225 221
226 // Set all the object fields. 222 // Set all the object fields.
227 READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), kAsReference); 223 READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), kAsReference);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 287
292 288
293 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader, 289 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader,
294 intptr_t object_id, 290 intptr_t object_id,
295 intptr_t tags, 291 intptr_t tags,
296 Snapshot::Kind kind, 292 Snapshot::Kind kind,
297 bool as_reference) { 293 bool as_reference) {
298 ASSERT(reader != NULL); 294 ASSERT(reader != NULL);
299 295
300 // Allocate type ref object. 296 // Allocate type ref object.
301 TypeRef& type_ref = TypeRef::ZoneHandle( 297 TypeRef& type_ref = TypeRef::ZoneHandle(reader->zone(), TypeRef::New());
302 reader->zone(), TypeRef::New());
303 reader->AddBackRef(object_id, &type_ref, kIsDeserialized); 298 reader->AddBackRef(object_id, &type_ref, kIsDeserialized);
304 299
305 // Set all the object fields. 300 // Set all the object fields.
306 READ_OBJECT_FIELDS(type_ref, 301 READ_OBJECT_FIELDS(type_ref, type_ref.raw()->from(), type_ref.raw()->to(),
307 type_ref.raw()->from(), type_ref.raw()->to(),
308 kAsReference); 302 kAsReference);
309 303
310 return type_ref.raw(); 304 return type_ref.raw();
311 } 305 }
312 306
313 307
314 void RawTypeRef::WriteTo(SnapshotWriter* writer, 308 void RawTypeRef::WriteTo(SnapshotWriter* writer,
315 intptr_t object_id, 309 intptr_t object_id,
316 Snapshot::Kind kind, 310 Snapshot::Kind kind,
317 bool as_reference) { 311 bool as_reference) {
(...skipping 13 matching lines...) Expand all
331 325
332 326
333 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader, 327 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader,
334 intptr_t object_id, 328 intptr_t object_id,
335 intptr_t tags, 329 intptr_t tags,
336 Snapshot::Kind kind, 330 Snapshot::Kind kind,
337 bool as_reference) { 331 bool as_reference) {
338 ASSERT(reader != NULL); 332 ASSERT(reader != NULL);
339 333
340 // Allocate type parameter object. 334 // Allocate type parameter object.
341 TypeParameter& type_parameter = TypeParameter::ZoneHandle( 335 TypeParameter& type_parameter =
342 reader->zone(), TypeParameter::New()); 336 TypeParameter::ZoneHandle(reader->zone(), TypeParameter::New());
343 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); 337 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
344 338
345 // Set all non object fields. 339 // Set all non object fields.
346 type_parameter.set_token_pos( 340 type_parameter.set_token_pos(
347 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); 341 TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
348 type_parameter.set_index(reader->Read<int16_t>()); 342 type_parameter.set_index(reader->Read<int16_t>());
349 type_parameter.set_parent_level(reader->Read<uint8_t>()); 343 type_parameter.set_parent_level(reader->Read<uint8_t>());
350 type_parameter.set_type_state(reader->Read<int8_t>()); 344 type_parameter.set_type_state(reader->Read<int8_t>());
351 345
352 // Set all the object fields. 346 // Set all the object fields.
353 READ_OBJECT_FIELDS(type_parameter, 347 READ_OBJECT_FIELDS(type_parameter, type_parameter.raw()->from(),
354 type_parameter.raw()->from(), type_parameter.raw()->to(), 348 type_parameter.raw()->to(), kAsReference);
355 kAsReference);
356 349
357 // Read in the parameterized class. 350 // Read in the parameterized class.
358 (*reader->ClassHandle()) = 351 (*reader->ClassHandle()) =
359 Class::RawCast(reader->ReadObjectImpl(kAsReference)); 352 Class::RawCast(reader->ReadObjectImpl(kAsReference));
360 type_parameter.set_parameterized_class(*reader->ClassHandle()); 353 type_parameter.set_parameterized_class(*reader->ClassHandle());
361 354
362 return type_parameter.raw(); 355 return type_parameter.raw();
363 } 356 }
364 357
365 358
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 390
398 391
399 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader, 392 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader,
400 intptr_t object_id, 393 intptr_t object_id,
401 intptr_t tags, 394 intptr_t tags,
402 Snapshot::Kind kind, 395 Snapshot::Kind kind,
403 bool as_reference) { 396 bool as_reference) {
404 ASSERT(reader != NULL); 397 ASSERT(reader != NULL);
405 398
406 // Allocate bounded type object. 399 // Allocate bounded type object.
407 BoundedType& bounded_type = BoundedType::ZoneHandle( 400 BoundedType& bounded_type =
408 reader->zone(), BoundedType::New()); 401 BoundedType::ZoneHandle(reader->zone(), BoundedType::New());
409 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized); 402 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
410 403
411 // Set all the object fields. 404 // Set all the object fields.
412 READ_OBJECT_FIELDS(bounded_type, 405 READ_OBJECT_FIELDS(bounded_type, bounded_type.raw()->from(),
413 bounded_type.raw()->from(), bounded_type.raw()->to(), 406 bounded_type.raw()->to(), kAsReference);
414 kAsReference);
415 407
416 return bounded_type.raw(); 408 return bounded_type.raw();
417 } 409 }
418 410
419 411
420 void RawBoundedType::WriteTo(SnapshotWriter* writer, 412 void RawBoundedType::WriteTo(SnapshotWriter* writer,
421 intptr_t object_id, 413 intptr_t object_id,
422 Snapshot::Kind kind, 414 Snapshot::Kind kind,
423 bool as_reference) { 415 bool as_reference) {
424 ASSERT(writer != NULL); 416 ASSERT(writer != NULL);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 bool as_reference) { 453 bool as_reference) {
462 ASSERT(reader != NULL); 454 ASSERT(reader != NULL);
463 455
464 // Read the length so that we can determine instance size to allocate. 456 // Read the length so that we can determine instance size to allocate.
465 intptr_t len = reader->ReadSmiValue(); 457 intptr_t len = reader->ReadSmiValue();
466 458
467 TypeArguments& type_arguments = TypeArguments::ZoneHandle( 459 TypeArguments& type_arguments = TypeArguments::ZoneHandle(
468 reader->zone(), TypeArguments::New(len, HEAP_SPACE(kind))); 460 reader->zone(), TypeArguments::New(len, HEAP_SPACE(kind)));
469 bool is_canonical = RawObject::IsCanonical(tags); 461 bool is_canonical = RawObject::IsCanonical(tags);
470 bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind)); 462 bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind));
471 reader->AddBackRef(object_id, 463 reader->AddBackRef(object_id, &type_arguments, kIsDeserialized,
472 &type_arguments,
473 kIsDeserialized,
474 defer_canonicalization); 464 defer_canonicalization);
475 465
476 // Set the instantiations field, which is only read from a full snapshot. 466 // Set the instantiations field, which is only read from a full snapshot.
477 type_arguments.set_instantiations(Object::zero_array()); 467 type_arguments.set_instantiations(Object::zero_array());
478 468
479 // Now set all the type fields. 469 // Now set all the type fields.
480 intptr_t offset = type_arguments.TypeAddr(0) - 470 intptr_t offset =
471 type_arguments.TypeAddr(0) -
481 reinterpret_cast<RawAbstractType**>(type_arguments.raw()->ptr()); 472 reinterpret_cast<RawAbstractType**>(type_arguments.raw()->ptr());
482 for (intptr_t i = 0; i < len; i++) { 473 for (intptr_t i = 0; i < len; i++) {
483 *reader->TypeHandle() ^= 474 *reader->TypeHandle() ^=
484 reader->ReadObjectImpl(kAsReference, object_id, (i + offset)); 475 reader->ReadObjectImpl(kAsReference, object_id, (i + offset));
485 type_arguments.SetTypeAt(i, *reader->TypeHandle()); 476 type_arguments.SetTypeAt(i, *reader->TypeHandle());
486 } 477 }
487 478
488 // Set the canonical bit. 479 // Set the canonical bit.
489 if (!defer_canonicalization && is_canonical) { 480 if (!defer_canonicalization && is_canonical) {
490 type_arguments.SetCanonical(); 481 type_arguments.SetCanonical();
(...skipping 29 matching lines...) Expand all
520 511
521 RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader, 512 RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader,
522 intptr_t object_id, 513 intptr_t object_id,
523 intptr_t tags, 514 intptr_t tags,
524 Snapshot::Kind kind, 515 Snapshot::Kind kind,
525 bool as_reference) { 516 bool as_reference) {
526 ASSERT(reader != NULL); 517 ASSERT(reader != NULL);
527 ASSERT(kind == Snapshot::kScript); 518 ASSERT(kind == Snapshot::kScript);
528 519
529 // Allocate function object. 520 // Allocate function object.
530 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), 521 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), PatchClass::New());
531 PatchClass::New());
532 reader->AddBackRef(object_id, &cls, kIsDeserialized); 522 reader->AddBackRef(object_id, &cls, kIsDeserialized);
533 523
534 // Set all the object fields. 524 // Set all the object fields.
535 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); 525 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference);
536 526
537 return cls.raw(); 527 return cls.raw();
538 } 528 }
539 529
540 530
541 void RawPatchClass::WriteTo(SnapshotWriter* writer, 531 void RawPatchClass::WriteTo(SnapshotWriter* writer,
(...skipping 28 matching lines...) Expand all
570 void RawClosure::WriteTo(SnapshotWriter* writer, 560 void RawClosure::WriteTo(SnapshotWriter* writer,
571 intptr_t object_id, 561 intptr_t object_id,
572 Snapshot::Kind kind, 562 Snapshot::Kind kind,
573 bool as_reference) { 563 bool as_reference) {
574 ASSERT(writer != NULL); 564 ASSERT(writer != NULL);
575 ASSERT((kind == Snapshot::kMessage) || (kind == Snapshot::kScript)); 565 ASSERT((kind == Snapshot::kMessage) || (kind == Snapshot::kScript));
576 566
577 // Check if closure is serializable, throw an exception otherwise. 567 // Check if closure is serializable, throw an exception otherwise.
578 RawFunction* func = writer->IsSerializableClosure(this); 568 RawFunction* func = writer->IsSerializableClosure(this);
579 if (func != Function::null()) { 569 if (func != Function::null()) {
580 writer->WriteStaticImplicitClosure(object_id, 570 writer->WriteStaticImplicitClosure(object_id, func,
581 func,
582 writer->GetObjectTags(this)); 571 writer->GetObjectTags(this));
583 return; 572 return;
584 } 573 }
585 574
586 UNREACHABLE(); 575 UNREACHABLE();
587 } 576 }
588 577
589 578
590 RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader, 579 RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader,
591 intptr_t object_id, 580 intptr_t object_id,
592 intptr_t tags, 581 intptr_t tags,
593 Snapshot::Kind kind, 582 Snapshot::Kind kind,
594 bool as_reference) { 583 bool as_reference) {
595 ASSERT(reader != NULL); 584 ASSERT(reader != NULL);
596 ASSERT(kind == Snapshot::kScript); 585 ASSERT(kind == Snapshot::kScript);
597 586
598 // Allocate closure data object. 587 // Allocate closure data object.
599 ClosureData& data = ClosureData::ZoneHandle(reader->zone(), 588 ClosureData& data =
600 ClosureData::New()); 589 ClosureData::ZoneHandle(reader->zone(), ClosureData::New());
601 reader->AddBackRef(object_id, &data, kIsDeserialized); 590 reader->AddBackRef(object_id, &data, kIsDeserialized);
602 591
603 // Set all the object fields. 592 // Set all the object fields.
604 READ_OBJECT_FIELDS(data, 593 READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(),
605 data.raw()->from(), data.raw()->to(),
606 kAsInlinedObject); 594 kAsInlinedObject);
607 595
608 return data.raw(); 596 return data.raw();
609 } 597 }
610 598
611 599
612 void RawClosureData::WriteTo(SnapshotWriter* writer, 600 void RawClosureData::WriteTo(SnapshotWriter* writer,
613 intptr_t object_id, 601 intptr_t object_id,
614 Snapshot::Kind kind, 602 Snapshot::Kind kind,
615 bool as_reference) { 603 bool as_reference) {
(...skipping 30 matching lines...) Expand all
646 634
647 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader, 635 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
648 intptr_t object_id, 636 intptr_t object_id,
649 intptr_t tags, 637 intptr_t tags,
650 Snapshot::Kind kind, 638 Snapshot::Kind kind,
651 bool as_reference) { 639 bool as_reference) {
652 ASSERT(reader != NULL); 640 ASSERT(reader != NULL);
653 ASSERT(kind == Snapshot::kScript); 641 ASSERT(kind == Snapshot::kScript);
654 642
655 // Allocate redirection data object. 643 // Allocate redirection data object.
656 RedirectionData& data = RedirectionData::ZoneHandle(reader->zone(), 644 RedirectionData& data =
657 RedirectionData::New()); 645 RedirectionData::ZoneHandle(reader->zone(), RedirectionData::New());
658 reader->AddBackRef(object_id, &data, kIsDeserialized); 646 reader->AddBackRef(object_id, &data, kIsDeserialized);
659 647
660 // Set all the object fields. 648 // Set all the object fields.
661 READ_OBJECT_FIELDS(data, 649 READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference);
662 data.raw()->from(), data.raw()->to(),
663 kAsReference);
664 650
665 return data.raw(); 651 return data.raw();
666 } 652 }
667 653
668 654
669 void RawRedirectionData::WriteTo(SnapshotWriter* writer, 655 void RawRedirectionData::WriteTo(SnapshotWriter* writer,
670 intptr_t object_id, 656 intptr_t object_id,
671 Snapshot::Kind kind, 657 Snapshot::Kind kind,
672 bool as_reference) { 658 bool as_reference) {
673 ASSERT(writer != NULL); 659 ASSERT(writer != NULL);
(...skipping 16 matching lines...) Expand all
690 intptr_t object_id, 676 intptr_t object_id,
691 intptr_t tags, 677 intptr_t tags,
692 Snapshot::Kind kind, 678 Snapshot::Kind kind,
693 bool as_reference) { 679 bool as_reference) {
694 ASSERT(reader != NULL); 680 ASSERT(reader != NULL);
695 ASSERT(kind == Snapshot::kScript); 681 ASSERT(kind == Snapshot::kScript);
696 682
697 bool is_in_fullsnapshot = reader->Read<bool>(); 683 bool is_in_fullsnapshot = reader->Read<bool>();
698 if (!is_in_fullsnapshot) { 684 if (!is_in_fullsnapshot) {
699 // Allocate function object. 685 // Allocate function object.
700 Function& func = Function::ZoneHandle(reader->zone(), 686 Function& func = Function::ZoneHandle(reader->zone(), Function::New());
701 Function::New());
702 reader->AddBackRef(object_id, &func, kIsDeserialized); 687 reader->AddBackRef(object_id, &func, kIsDeserialized);
703 688
704 // Set all the non object fields. Read the token positions now but 689 // Set all the non object fields. Read the token positions now but
705 // don't set them until after setting the kind. 690 // don't set them until after setting the kind.
706 const int32_t token_pos = reader->Read<int32_t>(); 691 const int32_t token_pos = reader->Read<int32_t>();
707 const int32_t end_token_pos = reader->Read<uint32_t>(); 692 const int32_t end_token_pos = reader->Read<uint32_t>();
708 func.set_num_fixed_parameters(reader->Read<int16_t>()); 693 func.set_num_fixed_parameters(reader->Read<int16_t>());
709 func.set_num_optional_parameters(reader->Read<int16_t>()); 694 func.set_num_optional_parameters(reader->Read<int16_t>());
710 func.set_kind_tag(reader->Read<uint32_t>()); 695 func.set_kind_tag(reader->Read<uint32_t>());
711 func.set_token_pos(TokenPosition::SnapshotDecode(token_pos)); 696 func.set_token_pos(TokenPosition::SnapshotDecode(token_pos));
712 func.set_end_token_pos(TokenPosition::SnapshotDecode(end_token_pos)); 697 func.set_end_token_pos(TokenPosition::SnapshotDecode(end_token_pos));
713 func.set_usage_counter(reader->Read<int32_t>()); 698 func.set_usage_counter(reader->Read<int32_t>());
714 func.set_deoptimization_counter(reader->Read<int8_t>()); 699 func.set_deoptimization_counter(reader->Read<int8_t>());
715 func.set_optimized_instruction_count(reader->Read<uint16_t>()); 700 func.set_optimized_instruction_count(reader->Read<uint16_t>());
716 func.set_optimized_call_site_count(reader->Read<uint16_t>()); 701 func.set_optimized_call_site_count(reader->Read<uint16_t>());
717 func.set_kernel_function(NULL); 702 func.set_kernel_function(NULL);
718 func.set_was_compiled(false); 703 func.set_was_compiled(false);
719 704
720 // Set all the object fields. 705 // Set all the object fields.
721 READ_OBJECT_FIELDS(func, 706 READ_OBJECT_FIELDS(func, func.raw()->from(), func.raw()->to_snapshot(),
722 func.raw()->from(), func.raw()->to_snapshot(),
723 kAsReference); 707 kAsReference);
724 // Initialize all fields that are not part of the snapshot. 708 // Initialize all fields that are not part of the snapshot.
725 bool is_optimized = func.usage_counter() != 0; 709 bool is_optimized = func.usage_counter() != 0;
726 if (is_optimized) { 710 if (is_optimized) {
727 // Read the ic data array as the function is an optimized one. 711 // Read the ic data array as the function is an optimized one.
728 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference); 712 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference);
729 func.set_ic_data_array(*reader->ArrayHandle()); 713 func.set_ic_data_array(*reader->ArrayHandle());
730 } else { 714 } else {
731 func.ClearICDataArray(); 715 func.ClearICDataArray();
732 } 716 }
(...skipping 10 matching lines...) Expand all
743 Snapshot::Kind kind, 727 Snapshot::Kind kind,
744 bool as_reference) { 728 bool as_reference) {
745 ASSERT(writer != NULL); 729 ASSERT(writer != NULL);
746 ASSERT(kind == Snapshot::kScript); 730 ASSERT(kind == Snapshot::kScript);
747 bool is_in_fullsnapshot = false; 731 bool is_in_fullsnapshot = false;
748 bool owner_is_class = false; 732 bool owner_is_class = false;
749 if ((kind == Snapshot::kScript) && !Function::IsSignatureFunction(this)) { 733 if ((kind == Snapshot::kScript) && !Function::IsSignatureFunction(this)) {
750 intptr_t tags = writer->GetObjectTags(ptr()->owner_); 734 intptr_t tags = writer->GetObjectTags(ptr()->owner_);
751 intptr_t cid = ClassIdTag::decode(tags); 735 intptr_t cid = ClassIdTag::decode(tags);
752 owner_is_class = (cid == kClassCid); 736 owner_is_class = (cid == kClassCid);
753 is_in_fullsnapshot = owner_is_class ? 737 is_in_fullsnapshot =
754 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) : 738 owner_is_class ? Class::IsInFullSnapshot(
755 PatchClass::IsInFullSnapshot( 739 reinterpret_cast<RawClass*>(ptr()->owner_))
756 reinterpret_cast<RawPatchClass*>(ptr()->owner_)); 740 : PatchClass::IsInFullSnapshot(
741 reinterpret_cast<RawPatchClass*>(ptr()->owner_));
757 } 742 }
758 743
759 // Write out the serialization header value for this object. 744 // Write out the serialization header value for this object.
760 writer->WriteInlinedObjectHeader(object_id); 745 writer->WriteInlinedObjectHeader(object_id);
761 746
762 // Write out the class and tags information. 747 // Write out the class and tags information.
763 writer->WriteVMIsolateObject(kFunctionCid); 748 writer->WriteVMIsolateObject(kFunctionCid);
764 writer->WriteTags(writer->GetObjectTags(this)); 749 writer->WriteTags(writer->GetObjectTags(this));
765 750
766 // Write out the boolean is_in_fullsnapshot first as this will 751 // Write out the boolean is_in_fullsnapshot first as this will
767 // help the reader decide how the rest of the information needs 752 // help the reader decide how the rest of the information needs
768 // to be interpreted. 753 // to be interpreted.
769 writer->Write<bool>(is_in_fullsnapshot); 754 writer->Write<bool>(is_in_fullsnapshot);
770 755
771 if (!is_in_fullsnapshot) { 756 if (!is_in_fullsnapshot) {
772 bool is_optimized = Code::IsOptimized(ptr()->code_); 757 bool is_optimized = Code::IsOptimized(ptr()->code_);
773 758
774 // Write out all the non object fields. 759 // Write out all the non object fields.
775 #if !defined(DART_PRECOMPILED_RUNTIME) 760 #if !defined(DART_PRECOMPILED_RUNTIME)
776 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); 761 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
777 writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode()); 762 writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode());
778 #endif 763 #endif
779 writer->Write<int16_t>(ptr()->num_fixed_parameters_); 764 writer->Write<int16_t>(ptr()->num_fixed_parameters_);
780 writer->Write<int16_t>(ptr()->num_optional_parameters_); 765 writer->Write<int16_t>(ptr()->num_optional_parameters_);
781 writer->Write<uint32_t>(ptr()->kind_tag_); 766 writer->Write<uint32_t>(ptr()->kind_tag_);
782 #if !defined(DART_PRECOMPILED_RUNTIME) 767 #if !defined(DART_PRECOMPILED_RUNTIME)
783 if (is_optimized) { 768 if (is_optimized) {
784 writer->Write<int32_t>(FLAG_optimization_counter_threshold); 769 writer->Write<int32_t>(FLAG_optimization_counter_threshold);
(...skipping 24 matching lines...) Expand all
809 Snapshot::Kind kind, 794 Snapshot::Kind kind,
810 bool as_reference) { 795 bool as_reference) {
811 ASSERT(reader != NULL); 796 ASSERT(reader != NULL);
812 ASSERT(kind == Snapshot::kScript); 797 ASSERT(kind == Snapshot::kScript);
813 798
814 // Allocate field object. 799 // Allocate field object.
815 Field& field = Field::ZoneHandle(reader->zone(), Field::New()); 800 Field& field = Field::ZoneHandle(reader->zone(), Field::New());
816 reader->AddBackRef(object_id, &field, kIsDeserialized); 801 reader->AddBackRef(object_id, &field, kIsDeserialized);
817 802
818 // Set all non object fields. 803 // Set all non object fields.
819 field.set_token_pos( 804 field.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
820 TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
821 field.set_guarded_cid(reader->Read<int32_t>()); 805 field.set_guarded_cid(reader->Read<int32_t>());
822 field.set_is_nullable(reader->Read<int32_t>()); 806 field.set_is_nullable(reader->Read<int32_t>());
823 field.set_kind_bits(reader->Read<uint8_t>()); 807 field.set_kind_bits(reader->Read<uint8_t>());
824 field.set_kernel_field(NULL); 808 field.set_kernel_field(NULL);
825 809
826 // Set all the object fields. 810 // Set all the object fields.
827 READ_OBJECT_FIELDS(field, 811 READ_OBJECT_FIELDS(field, field.raw()->from(), field.raw()->to_snapshot(kind),
828 field.raw()->from(),
829 field.raw()->to_snapshot(kind),
830 kAsReference); 812 kAsReference);
831 field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null()); 813 field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null());
832 814
833 if (!FLAG_use_field_guards) { 815 if (!FLAG_use_field_guards) {
834 field.set_guarded_cid(kDynamicCid); 816 field.set_guarded_cid(kDynamicCid);
835 field.set_is_nullable(true); 817 field.set_is_nullable(true);
836 field.set_guarded_list_length(Field::kNoFixedLength); 818 field.set_guarded_list_length(Field::kNoFixedLength);
837 field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); 819 field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
838 } else { 820 } else {
839 field.InitializeGuardedListLengthInObjectOffset(); 821 field.InitializeGuardedListLengthInObjectOffset();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 872
891 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, 873 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader,
892 intptr_t object_id, 874 intptr_t object_id,
893 intptr_t tags, 875 intptr_t tags,
894 Snapshot::Kind kind, 876 Snapshot::Kind kind,
895 bool as_reference) { 877 bool as_reference) {
896 ASSERT(reader != NULL); 878 ASSERT(reader != NULL);
897 ASSERT(kind != Snapshot::kMessage); 879 ASSERT(kind != Snapshot::kMessage);
898 880
899 // Create the literal token object. 881 // Create the literal token object.
900 LiteralToken& literal_token = LiteralToken::ZoneHandle(reader->zone(), 882 LiteralToken& literal_token =
901 LiteralToken::New()); 883 LiteralToken::ZoneHandle(reader->zone(), LiteralToken::New());
902 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); 884 reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
903 885
904 // Read the token attributes. 886 // Read the token attributes.
905 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); 887 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>());
906 literal_token.set_kind(token_kind); 888 literal_token.set_kind(token_kind);
907 889
908 // Set all the object fields. 890 // Set all the object fields.
909 READ_OBJECT_FIELDS(literal_token, 891 READ_OBJECT_FIELDS(literal_token, literal_token.raw()->from(),
910 literal_token.raw()->from(), literal_token.raw()->to(), 892 literal_token.raw()->to(), kAsReference);
911 kAsReference);
912 893
913 return literal_token.raw(); 894 return literal_token.raw();
914 } 895 }
915 896
916 897
917 void RawLiteralToken::WriteTo(SnapshotWriter* writer, 898 void RawLiteralToken::WriteTo(SnapshotWriter* writer,
918 intptr_t object_id, 899 intptr_t object_id,
919 Snapshot::Kind kind, 900 Snapshot::Kind kind,
920 bool as_reference) { 901 bool as_reference) {
921 ASSERT(writer != NULL); 902 ASSERT(writer != NULL);
(...skipping 20 matching lines...) Expand all
942 intptr_t tags, 923 intptr_t tags,
943 Snapshot::Kind kind, 924 Snapshot::Kind kind,
944 bool as_reference) { 925 bool as_reference) {
945 ASSERT(reader != NULL); 926 ASSERT(reader != NULL);
946 ASSERT(kind == Snapshot::kScript); 927 ASSERT(kind == Snapshot::kScript);
947 928
948 // Read the length so that we can determine number of tokens to read. 929 // Read the length so that we can determine number of tokens to read.
949 intptr_t len = reader->ReadSmiValue(); 930 intptr_t len = reader->ReadSmiValue();
950 931
951 // Create the token stream object. 932 // Create the token stream object.
952 TokenStream& token_stream = TokenStream::ZoneHandle(reader->zone(), 933 TokenStream& token_stream =
953 TokenStream::New(len)); 934 TokenStream::ZoneHandle(reader->zone(), TokenStream::New(len));
954 reader->AddBackRef(object_id, &token_stream, kIsDeserialized); 935 reader->AddBackRef(object_id, &token_stream, kIsDeserialized);
955 936
956 // Read the stream of tokens into the TokenStream object for script 937 // Read the stream of tokens into the TokenStream object for script
957 // snapshots as we made a copy of token stream. 938 // snapshots as we made a copy of token stream.
958 if (kind == Snapshot::kScript) { 939 if (kind == Snapshot::kScript) {
959 NoSafepointScope no_safepoint; 940 NoSafepointScope no_safepoint;
960 RawExternalTypedData* stream = token_stream.GetStream(); 941 RawExternalTypedData* stream = token_stream.GetStream();
961 reader->ReadBytes(stream->ptr()->data_, len); 942 reader->ReadBytes(stream->ptr()->data_, len);
962 } 943 }
963 944
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 ASSERT(kind == Snapshot::kScript); 989 ASSERT(kind == Snapshot::kScript);
1009 990
1010 // Allocate script object. 991 // Allocate script object.
1011 Script& script = Script::ZoneHandle(reader->zone(), Script::New()); 992 Script& script = Script::ZoneHandle(reader->zone(), Script::New());
1012 reader->AddBackRef(object_id, &script, kIsDeserialized); 993 reader->AddBackRef(object_id, &script, kIsDeserialized);
1013 994
1014 script.StoreNonPointer(&script.raw_ptr()->line_offset_, 995 script.StoreNonPointer(&script.raw_ptr()->line_offset_,
1015 reader->Read<int32_t>()); 996 reader->Read<int32_t>());
1016 script.StoreNonPointer(&script.raw_ptr()->col_offset_, 997 script.StoreNonPointer(&script.raw_ptr()->col_offset_,
1017 reader->Read<int32_t>()); 998 reader->Read<int32_t>());
1018 script.StoreNonPointer(&script.raw_ptr()->kind_, 999 script.StoreNonPointer(&script.raw_ptr()->kind_, reader->Read<int8_t>());
1019 reader->Read<int8_t>());
1020 1000
1021 *reader->StringHandle() ^= String::null(); 1001 *reader->StringHandle() ^= String::null();
1022 script.set_source(*reader->StringHandle()); 1002 script.set_source(*reader->StringHandle());
1023 *reader->StreamHandle() ^= TokenStream::null(); 1003 *reader->StreamHandle() ^= TokenStream::null();
1024 script.set_tokens(*reader->StreamHandle()); 1004 script.set_tokens(*reader->StreamHandle());
1025 1005
1026 // Set all the object fields. 1006 // Set all the object fields.
1027 // TODO(5411462): Need to assert No GC can happen here, even though 1007 // TODO(5411462): Need to assert No GC can happen here, even though
1028 // allocations may happen. 1008 // allocations may happen.
1029 intptr_t num_flds = (script.raw()->to_snapshot(kind) - script.raw()->from()); 1009 intptr_t num_flds = (script.raw()->to_snapshot(kind) - script.raw()->from());
1030 for (intptr_t i = 0; i <= num_flds; i++) { 1010 for (intptr_t i = 0; i <= num_flds; i++) {
1031 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); 1011 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1032 script.StorePointer((script.raw()->from() + i), 1012 script.StorePointer((script.raw()->from() + i),
1033 reader->PassiveObjectHandle()->raw()); 1013 reader->PassiveObjectHandle()->raw());
1034 } 1014 }
1035 1015
1036 script.set_load_timestamp(FLAG_remove_script_timestamps_for_test 1016 script.set_load_timestamp(
1037 ? 0 : OS::GetCurrentTimeMillis()); 1017 FLAG_remove_script_timestamps_for_test ? 0 : OS::GetCurrentTimeMillis());
1038 1018
1039 return script.raw(); 1019 return script.raw();
1040 } 1020 }
1041 1021
1042 1022
1043 void RawScript::WriteTo(SnapshotWriter* writer, 1023 void RawScript::WriteTo(SnapshotWriter* writer,
1044 intptr_t object_id, 1024 intptr_t object_id,
1045 Snapshot::Kind kind, 1025 Snapshot::Kind kind,
1046 bool as_reference) { 1026 bool as_reference) {
1047 ASSERT(writer != NULL); 1027 ASSERT(writer != NULL);
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1175 1155
1176 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, 1156 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader,
1177 intptr_t object_id, 1157 intptr_t object_id,
1178 intptr_t tags, 1158 intptr_t tags,
1179 Snapshot::Kind kind, 1159 Snapshot::Kind kind,
1180 bool as_reference) { 1160 bool as_reference) {
1181 ASSERT(reader != NULL); 1161 ASSERT(reader != NULL);
1182 ASSERT(kind == Snapshot::kScript); 1162 ASSERT(kind == Snapshot::kScript);
1183 1163
1184 // Allocate library prefix object. 1164 // Allocate library prefix object.
1185 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(reader->zone(), 1165 LibraryPrefix& prefix =
1186 LibraryPrefix::New()); 1166 LibraryPrefix::ZoneHandle(reader->zone(), LibraryPrefix::New());
1187 reader->AddBackRef(object_id, &prefix, kIsDeserialized); 1167 reader->AddBackRef(object_id, &prefix, kIsDeserialized);
1188 1168
1189 // Set all non object fields. 1169 // Set all non object fields.
1190 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, 1170 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_,
1191 reader->Read<int16_t>()); 1171 reader->Read<int16_t>());
1192 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, 1172 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_,
1193 reader->Read<bool>()); 1173 reader->Read<bool>());
1194 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, 1174 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_,
1195 !prefix.raw_ptr()->is_deferred_load_); 1175 !prefix.raw_ptr()->is_deferred_load_);
1196 1176
1197 // Set all the object fields. 1177 // Set all the object fields.
1198 READ_OBJECT_FIELDS(prefix, 1178 READ_OBJECT_FIELDS(prefix, prefix.raw()->from(),
1199 prefix.raw()->from(), 1179 prefix.raw()->to_snapshot(kind), kAsReference);
1200 prefix.raw()->to_snapshot(kind), 1180 prefix.StorePointer(&prefix.raw_ptr()->dependent_code_, Array::null());
1201 kAsReference);
1202 prefix.StorePointer(&prefix.raw_ptr()->dependent_code_,
1203 Array::null());
1204 1181
1205 return prefix.raw(); 1182 return prefix.raw();
1206 } 1183 }
1207 1184
1208 1185
1209 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, 1186 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
1210 intptr_t object_id, 1187 intptr_t object_id,
1211 Snapshot::Kind kind, 1188 Snapshot::Kind kind,
1212 bool as_reference) { 1189 bool as_reference) {
1213 ASSERT(writer != NULL); 1190 ASSERT(writer != NULL);
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
1574 ICData& result = ICData::ZoneHandle(reader->zone(), ICData::New()); 1551 ICData& result = ICData::ZoneHandle(reader->zone(), ICData::New());
1575 reader->AddBackRef(object_id, &result, kIsDeserialized); 1552 reader->AddBackRef(object_id, &result, kIsDeserialized);
1576 1553
1577 NOT_IN_PRECOMPILED(result.set_deopt_id(reader->Read<int32_t>())); 1554 NOT_IN_PRECOMPILED(result.set_deopt_id(reader->Read<int32_t>()));
1578 result.set_state_bits(reader->Read<uint32_t>()); 1555 result.set_state_bits(reader->Read<uint32_t>());
1579 #if defined(TAG_IC_DATA) 1556 #if defined(TAG_IC_DATA)
1580 result.set_tag(reader->Read<int16_t>()); 1557 result.set_tag(reader->Read<int16_t>());
1581 #endif 1558 #endif
1582 1559
1583 // Set all the object fields. 1560 // Set all the object fields.
1584 READ_OBJECT_FIELDS(result, 1561 READ_OBJECT_FIELDS(result, result.raw()->from(),
1585 result.raw()->from(), 1562 result.raw()->to_snapshot(kind), kAsReference);
1586 result.raw()->to_snapshot(kind),
1587 kAsReference);
1588 1563
1589 return result.raw(); 1564 return result.raw();
1590 } 1565 }
1591 1566
1592 1567
1593 void RawICData::WriteTo(SnapshotWriter* writer, 1568 void RawICData::WriteTo(SnapshotWriter* writer,
1594 intptr_t object_id, 1569 intptr_t object_id,
1595 Snapshot::Kind kind, 1570 Snapshot::Kind kind,
1596 bool as_reference) { 1571 bool as_reference) {
1597 ASSERT(kind == Snapshot::kScript); 1572 ASSERT(kind == Snapshot::kScript);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1673 1648
1674 1649
1675 RawApiError* ApiError::ReadFrom(SnapshotReader* reader, 1650 RawApiError* ApiError::ReadFrom(SnapshotReader* reader,
1676 intptr_t object_id, 1651 intptr_t object_id,
1677 intptr_t tags, 1652 intptr_t tags,
1678 Snapshot::Kind kind, 1653 Snapshot::Kind kind,
1679 bool as_reference) { 1654 bool as_reference) {
1680 ASSERT(reader != NULL); 1655 ASSERT(reader != NULL);
1681 1656
1682 // Allocate ApiError object. 1657 // Allocate ApiError object.
1683 ApiError& api_error = 1658 ApiError& api_error = ApiError::ZoneHandle(reader->zone(), ApiError::New());
1684 ApiError::ZoneHandle(reader->zone(), ApiError::New());
1685 reader->AddBackRef(object_id, &api_error, kIsDeserialized); 1659 reader->AddBackRef(object_id, &api_error, kIsDeserialized);
1686 1660
1687 // Set all the object fields. 1661 // Set all the object fields.
1688 READ_OBJECT_FIELDS(api_error, 1662 READ_OBJECT_FIELDS(api_error, api_error.raw()->from(), api_error.raw()->to(),
1689 api_error.raw()->from(), api_error.raw()->to(),
1690 kAsReference); 1663 kAsReference);
1691 1664
1692 return api_error.raw(); 1665 return api_error.raw();
1693 } 1666 }
1694 1667
1695 1668
1696 void RawApiError::WriteTo(SnapshotWriter* writer, 1669 void RawApiError::WriteTo(SnapshotWriter* writer,
1697 intptr_t object_id, 1670 intptr_t object_id,
1698 Snapshot::Kind kind, 1671 Snapshot::Kind kind,
1699 bool as_reference) { 1672 bool as_reference) {
(...skipping 24 matching lines...) Expand all
1724 LanguageError::ZoneHandle(reader->zone(), LanguageError::New()); 1697 LanguageError::ZoneHandle(reader->zone(), LanguageError::New());
1725 reader->AddBackRef(object_id, &language_error, kIsDeserialized); 1698 reader->AddBackRef(object_id, &language_error, kIsDeserialized);
1726 1699
1727 // Set all non object fields. 1700 // Set all non object fields.
1728 language_error.set_token_pos( 1701 language_error.set_token_pos(
1729 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); 1702 TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
1730 language_error.set_report_after_token(reader->Read<bool>()); 1703 language_error.set_report_after_token(reader->Read<bool>());
1731 language_error.set_kind(reader->Read<uint8_t>()); 1704 language_error.set_kind(reader->Read<uint8_t>());
1732 1705
1733 // Set all the object fields. 1706 // Set all the object fields.
1734 READ_OBJECT_FIELDS(language_error, 1707 READ_OBJECT_FIELDS(language_error, language_error.raw()->from(),
1735 language_error.raw()->from(), language_error.raw()->to(), 1708 language_error.raw()->to(), kAsReference);
1736 kAsReference);
1737 1709
1738 return language_error.raw(); 1710 return language_error.raw();
1739 } 1711 }
1740 1712
1741 1713
1742 void RawLanguageError::WriteTo(SnapshotWriter* writer, 1714 void RawLanguageError::WriteTo(SnapshotWriter* writer,
1743 intptr_t object_id, 1715 intptr_t object_id,
1744 Snapshot::Kind kind, 1716 Snapshot::Kind kind,
1745 bool as_reference) { 1717 bool as_reference) {
1746 ASSERT(writer != NULL); 1718 ASSERT(writer != NULL);
(...skipping 14 matching lines...) Expand all
1761 SnapshotWriterVisitor visitor(writer, kAsReference); 1733 SnapshotWriterVisitor visitor(writer, kAsReference);
1762 visitor.VisitPointers(from(), to()); 1734 visitor.VisitPointers(from(), to());
1763 } 1735 }
1764 1736
1765 1737
1766 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, 1738 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader,
1767 intptr_t object_id, 1739 intptr_t object_id,
1768 intptr_t tags, 1740 intptr_t tags,
1769 Snapshot::Kind kind, 1741 Snapshot::Kind kind,
1770 bool as_reference) { 1742 bool as_reference) {
1771 UnhandledException& result = UnhandledException::ZoneHandle( 1743 UnhandledException& result =
1772 reader->zone(), UnhandledException::New()); 1744 UnhandledException::ZoneHandle(reader->zone(), UnhandledException::New());
1773 reader->AddBackRef(object_id, &result, kIsDeserialized); 1745 reader->AddBackRef(object_id, &result, kIsDeserialized);
1774 1746
1775 // Set all the object fields. 1747 // Set all the object fields.
1776 READ_OBJECT_FIELDS(result, 1748 READ_OBJECT_FIELDS(result, result.raw()->from(), result.raw()->to(),
1777 result.raw()->from(), result.raw()->to(),
1778 kAsReference); 1749 kAsReference);
1779 1750
1780 return result.raw(); 1751 return result.raw();
1781 } 1752 }
1782 1753
1783 1754
1784 void RawUnhandledException::WriteTo(SnapshotWriter* writer, 1755 void RawUnhandledException::WriteTo(SnapshotWriter* writer,
1785 intptr_t object_id, 1756 intptr_t object_id,
1786 Snapshot::Kind kind, 1757 Snapshot::Kind kind,
1787 bool as_reference) { 1758 bool as_reference) {
(...skipping 30 matching lines...) Expand all
1818 RawInstance* Instance::ReadFrom(SnapshotReader* reader, 1789 RawInstance* Instance::ReadFrom(SnapshotReader* reader,
1819 intptr_t object_id, 1790 intptr_t object_id,
1820 intptr_t tags, 1791 intptr_t tags,
1821 Snapshot::Kind kind, 1792 Snapshot::Kind kind,
1822 bool as_reference) { 1793 bool as_reference) {
1823 ASSERT(reader != NULL); 1794 ASSERT(reader != NULL);
1824 1795
1825 // Create an Instance object or get canonical one if it is a canonical 1796 // Create an Instance object or get canonical one if it is a canonical
1826 // constant. 1797 // constant.
1827 Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null()); 1798 Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
1828 obj ^= Object::Allocate(kInstanceCid, 1799 obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(),
1829 Instance::InstanceSize(),
1830 HEAP_SPACE(kind)); 1800 HEAP_SPACE(kind));
1831 if (RawObject::IsCanonical(tags)) { 1801 if (RawObject::IsCanonical(tags)) {
1832 obj = obj.CheckAndCanonicalize(reader->thread(), NULL); 1802 obj = obj.CheckAndCanonicalize(reader->thread(), NULL);
1833 } 1803 }
1834 reader->AddBackRef(object_id, &obj, kIsDeserialized); 1804 reader->AddBackRef(object_id, &obj, kIsDeserialized);
1835 1805
1836 return obj.raw(); 1806 return obj.raw();
1837 } 1807 }
1838 1808
1839 1809
(...skipping 18 matching lines...) Expand all
1858 Snapshot::Kind kind, 1828 Snapshot::Kind kind,
1859 bool as_reference) { 1829 bool as_reference) {
1860 ASSERT(reader != NULL); 1830 ASSERT(reader != NULL);
1861 1831
1862 // Read the 64 bit value for the object. 1832 // Read the 64 bit value for the object.
1863 int64_t value = reader->Read<int64_t>(); 1833 int64_t value = reader->Read<int64_t>();
1864 1834
1865 // Check if the value could potentially fit in a Smi in our current 1835 // Check if the value could potentially fit in a Smi in our current
1866 // architecture, if so return the object as a Smi. 1836 // architecture, if so return the object as a Smi.
1867 if (Smi::IsValid(value)) { 1837 if (Smi::IsValid(value)) {
1868 Smi& smi = Smi::ZoneHandle(reader->zone(), 1838 Smi& smi =
1869 Smi::New(static_cast<intptr_t>(value))); 1839 Smi::ZoneHandle(reader->zone(), Smi::New(static_cast<intptr_t>(value)));
1870 reader->AddBackRef(object_id, &smi, kIsDeserialized); 1840 reader->AddBackRef(object_id, &smi, kIsDeserialized);
1871 return smi.raw(); 1841 return smi.raw();
1872 } 1842 }
1873 1843
1874 // Create a Mint object or get canonical one if it is a canonical constant. 1844 // Create a Mint object or get canonical one if it is a canonical constant.
1875 Mint& mint = Mint::ZoneHandle(reader->zone(), Mint::null()); 1845 Mint& mint = Mint::ZoneHandle(reader->zone(), Mint::null());
1876 // When reading a script snapshot we need to canonicalize only those object 1846 // When reading a script snapshot we need to canonicalize only those object
1877 // references that are objects from the core library (loaded from a 1847 // references that are objects from the core library (loaded from a
1878 // full snapshot). Objects that are only in the script need not be 1848 // full snapshot). Objects that are only in the script need not be
1879 // canonicalized as they are already canonical. 1849 // canonicalized as they are already canonical.
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2010 1980
2011 1981
2012 void RawString::WriteTo(SnapshotWriter* writer, 1982 void RawString::WriteTo(SnapshotWriter* writer,
2013 intptr_t object_id, 1983 intptr_t object_id,
2014 Snapshot::Kind kind, 1984 Snapshot::Kind kind,
2015 bool as_reference) { 1985 bool as_reference) {
2016 UNREACHABLE(); // String is an abstract class. 1986 UNREACHABLE(); // String is an abstract class.
2017 } 1987 }
2018 1988
2019 1989
2020 template<typename StringType, typename CharacterType, typename CallbackType> 1990 template <typename StringType, typename CharacterType, typename CallbackType>
2021 void String::ReadFromImpl(SnapshotReader* reader, 1991 void String::ReadFromImpl(SnapshotReader* reader,
2022 String* str_obj, 1992 String* str_obj,
2023 intptr_t len, 1993 intptr_t len,
2024 intptr_t tags, 1994 intptr_t tags,
2025 CallbackType new_symbol, 1995 CallbackType new_symbol,
2026 Snapshot::Kind kind) { 1996 Snapshot::Kind kind) {
2027 ASSERT(reader != NULL); 1997 ASSERT(reader != NULL);
2028 if (RawObject::IsCanonical(tags)) { 1998 if (RawObject::IsCanonical(tags)) {
2029 // Set up canonical string object. 1999 // Set up canonical string object.
2030 ASSERT(reader != NULL); 2000 ASSERT(reader != NULL);
(...skipping 22 matching lines...) Expand all
2053 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader, 2023 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader,
2054 intptr_t object_id, 2024 intptr_t object_id,
2055 intptr_t tags, 2025 intptr_t tags,
2056 Snapshot::Kind kind, 2026 Snapshot::Kind kind,
2057 bool as_reference) { 2027 bool as_reference) {
2058 // Read the length so that we can determine instance size to allocate. 2028 // Read the length so that we can determine instance size to allocate.
2059 ASSERT(reader != NULL); 2029 ASSERT(reader != NULL);
2060 intptr_t len = reader->ReadSmiValue(); 2030 intptr_t len = reader->ReadSmiValue();
2061 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); 2031 String& str_obj = String::ZoneHandle(reader->zone(), String::null());
2062 2032
2063 String::ReadFromImpl<OneByteString, uint8_t>( 2033 String::ReadFromImpl<OneByteString, uint8_t>(reader, &str_obj, len, tags,
2064 reader, &str_obj, len, tags, Symbols::FromLatin1, kind); 2034 Symbols::FromLatin1, kind);
2065 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); 2035 reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
2066 return raw(str_obj); 2036 return raw(str_obj);
2067 } 2037 }
2068 2038
2069 2039
2070 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader, 2040 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader,
2071 intptr_t object_id, 2041 intptr_t object_id,
2072 intptr_t tags, 2042 intptr_t tags,
2073 Snapshot::Kind kind, 2043 Snapshot::Kind kind,
2074 bool as_reference) { 2044 bool as_reference) {
2075 // Read the length so that we can determine instance size to allocate. 2045 // Read the length so that we can determine instance size to allocate.
2076 ASSERT(reader != NULL); 2046 ASSERT(reader != NULL);
2077 intptr_t len = reader->ReadSmiValue(); 2047 intptr_t len = reader->ReadSmiValue();
2078 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); 2048 String& str_obj = String::ZoneHandle(reader->zone(), String::null());
2079 2049
2080 String::ReadFromImpl<TwoByteString, uint16_t>( 2050 String::ReadFromImpl<TwoByteString, uint16_t>(reader, &str_obj, len, tags,
2081 reader, &str_obj, len, tags, Symbols::FromUTF16, kind); 2051 Symbols::FromUTF16, kind);
2082 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); 2052 reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
2083 return raw(str_obj); 2053 return raw(str_obj);
2084 } 2054 }
2085 2055
2086 2056
2087 template<typename T> 2057 template <typename T>
2088 static void StringWriteTo(SnapshotWriter* writer, 2058 static void StringWriteTo(SnapshotWriter* writer,
2089 intptr_t object_id, 2059 intptr_t object_id,
2090 Snapshot::Kind kind, 2060 Snapshot::Kind kind,
2091 intptr_t class_id, 2061 intptr_t class_id,
2092 intptr_t tags, 2062 intptr_t tags,
2093 RawSmi* length, 2063 RawSmi* length,
2094 T* data) { 2064 T* data) {
2095 ASSERT(writer != NULL); 2065 ASSERT(writer != NULL);
2096 intptr_t len = Smi::Value(length); 2066 intptr_t len = Smi::Value(length);
2097 2067
(...skipping 17 matching lines...) Expand all
2115 } 2085 }
2116 } 2086 }
2117 } 2087 }
2118 } 2088 }
2119 2089
2120 2090
2121 void RawOneByteString::WriteTo(SnapshotWriter* writer, 2091 void RawOneByteString::WriteTo(SnapshotWriter* writer,
2122 intptr_t object_id, 2092 intptr_t object_id,
2123 Snapshot::Kind kind, 2093 Snapshot::Kind kind,
2124 bool as_reference) { 2094 bool as_reference) {
2125 StringWriteTo(writer, 2095 StringWriteTo(writer, object_id, kind, kOneByteStringCid,
2126 object_id, 2096 writer->GetObjectTags(this), ptr()->length_, ptr()->data());
2127 kind,
2128 kOneByteStringCid,
2129 writer->GetObjectTags(this),
2130 ptr()->length_,
2131 ptr()->data());
2132 } 2097 }
2133 2098
2134 2099
2135 void RawTwoByteString::WriteTo(SnapshotWriter* writer, 2100 void RawTwoByteString::WriteTo(SnapshotWriter* writer,
2136 intptr_t object_id, 2101 intptr_t object_id,
2137 Snapshot::Kind kind, 2102 Snapshot::Kind kind,
2138 bool as_reference) { 2103 bool as_reference) {
2139 StringWriteTo(writer, 2104 StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
2140 object_id, 2105 writer->GetObjectTags(this), ptr()->length_, ptr()->data());
2141 kind,
2142 kTwoByteStringCid,
2143 writer->GetObjectTags(this),
2144 ptr()->length_,
2145 ptr()->data());
2146 } 2106 }
2147 2107
2148 2108
2149 RawExternalOneByteString* ExternalOneByteString::ReadFrom( 2109 RawExternalOneByteString* ExternalOneByteString::ReadFrom(
2150 SnapshotReader* reader, 2110 SnapshotReader* reader,
2151 intptr_t object_id, 2111 intptr_t object_id,
2152 intptr_t tags, 2112 intptr_t tags,
2153 Snapshot::Kind kind, 2113 Snapshot::Kind kind,
2154 bool as_reference) { 2114 bool as_reference) {
2155 UNREACHABLE(); 2115 UNREACHABLE();
(...skipping 10 matching lines...) Expand all
2166 UNREACHABLE(); 2126 UNREACHABLE();
2167 return ExternalTwoByteString::null(); 2127 return ExternalTwoByteString::null();
2168 } 2128 }
2169 2129
2170 2130
2171 void RawExternalOneByteString::WriteTo(SnapshotWriter* writer, 2131 void RawExternalOneByteString::WriteTo(SnapshotWriter* writer,
2172 intptr_t object_id, 2132 intptr_t object_id,
2173 Snapshot::Kind kind, 2133 Snapshot::Kind kind,
2174 bool as_reference) { 2134 bool as_reference) {
2175 // Serialize as a non-external one byte string. 2135 // Serialize as a non-external one byte string.
2176 StringWriteTo(writer, 2136 StringWriteTo(writer, object_id, kind, kOneByteStringCid,
2177 object_id, 2137 writer->GetObjectTags(this), ptr()->length_,
2178 kind,
2179 kOneByteStringCid,
2180 writer->GetObjectTags(this),
2181 ptr()->length_,
2182 ptr()->external_data_->data()); 2138 ptr()->external_data_->data());
2183 } 2139 }
2184 2140
2185 2141
2186 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer, 2142 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer,
2187 intptr_t object_id, 2143 intptr_t object_id,
2188 Snapshot::Kind kind, 2144 Snapshot::Kind kind,
2189 bool as_reference) { 2145 bool as_reference) {
2190 // Serialize as a non-external two byte string. 2146 // Serialize as a non-external two byte string.
2191 StringWriteTo(writer, 2147 StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
2192 object_id, 2148 writer->GetObjectTags(this), ptr()->length_,
2193 kind,
2194 kTwoByteStringCid,
2195 writer->GetObjectTags(this),
2196 ptr()->length_,
2197 ptr()->external_data_->data()); 2149 ptr()->external_data_->data());
2198 } 2150 }
2199 2151
2200 2152
2201 RawBool* Bool::ReadFrom(SnapshotReader* reader, 2153 RawBool* Bool::ReadFrom(SnapshotReader* reader,
2202 intptr_t object_id, 2154 intptr_t object_id,
2203 intptr_t tags, 2155 intptr_t tags,
2204 Snapshot::Kind kind, 2156 Snapshot::Kind kind,
2205 bool as_reference) { 2157 bool as_reference) {
2206 UNREACHABLE(); 2158 UNREACHABLE();
(...skipping 20 matching lines...) Expand all
2227 intptr_t len = reader->ReadSmiValue(); 2179 intptr_t len = reader->ReadSmiValue();
2228 Array* array = NULL; 2180 Array* array = NULL;
2229 DeserializeState state; 2181 DeserializeState state;
2230 if (!as_reference) { 2182 if (!as_reference) {
2231 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); 2183 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id));
2232 state = kIsDeserialized; 2184 state = kIsDeserialized;
2233 } else { 2185 } else {
2234 state = kIsNotDeserialized; 2186 state = kIsNotDeserialized;
2235 } 2187 }
2236 if (array == NULL) { 2188 if (array == NULL) {
2237 array = &(Array::ZoneHandle(reader->zone(), 2189 array =
2238 Array::New(len, HEAP_SPACE(kind)))); 2190 &(Array::ZoneHandle(reader->zone(), Array::New(len, HEAP_SPACE(kind))));
2239 reader->AddBackRef(object_id, array, state); 2191 reader->AddBackRef(object_id, array, state);
2240 } 2192 }
2241 if (!as_reference) { 2193 if (!as_reference) {
2242 // Read all the individual elements for inlined objects. 2194 // Read all the individual elements for inlined objects.
2243 ASSERT(!RawObject::IsCanonical(tags)); 2195 ASSERT(!RawObject::IsCanonical(tags));
2244 reader->ArrayReadFrom(object_id, *array, len, tags); 2196 reader->ArrayReadFrom(object_id, *array, len, tags);
2245 } 2197 }
2246 return array->raw(); 2198 return array->raw();
2247 } 2199 }
2248 2200
2249 2201
2250 RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader, 2202 RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader,
2251 intptr_t object_id, 2203 intptr_t object_id,
2252 intptr_t tags, 2204 intptr_t tags,
2253 Snapshot::Kind kind, 2205 Snapshot::Kind kind,
2254 bool as_reference) { 2206 bool as_reference) {
2255 ASSERT(reader != NULL); 2207 ASSERT(reader != NULL);
2256 2208
2257 // Read the length so that we can determine instance size to allocate. 2209 // Read the length so that we can determine instance size to allocate.
2258 intptr_t len = reader->ReadSmiValue(); 2210 intptr_t len = reader->ReadSmiValue();
2259 Array* array = NULL; 2211 Array* array = NULL;
2260 DeserializeState state; 2212 DeserializeState state;
2261 if (!as_reference) { 2213 if (!as_reference) {
2262 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); 2214 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id));
2263 state = kIsDeserialized; 2215 state = kIsDeserialized;
2264 } else { 2216 } else {
2265 state = kIsNotDeserialized; 2217 state = kIsNotDeserialized;
2266 } 2218 }
2267 if (array == NULL) { 2219 if (array == NULL) {
2268 array = &(Array::ZoneHandle( 2220 array = &(Array::ZoneHandle(reader->zone(),
2269 reader->zone(), 2221 ImmutableArray::New(len, HEAP_SPACE(kind))));
2270 ImmutableArray::New(len, HEAP_SPACE(kind))));
2271 reader->AddBackRef(object_id, array, state); 2222 reader->AddBackRef(object_id, array, state);
2272 } 2223 }
2273 if (!as_reference) { 2224 if (!as_reference) {
2274 // Read all the individual elements for inlined objects. 2225 // Read all the individual elements for inlined objects.
2275 reader->ArrayReadFrom(object_id, *array, len, tags); 2226 reader->ArrayReadFrom(object_id, *array, len, tags);
2276 if (RawObject::IsCanonical(tags)) { 2227 if (RawObject::IsCanonical(tags)) {
2277 *array ^= array->CheckAndCanonicalize(reader->thread(), NULL); 2228 *array ^= array->CheckAndCanonicalize(reader->thread(), NULL);
2278 } 2229 }
2279 } 2230 }
2280 return raw(*array); 2231 return raw(*array);
2281 } 2232 }
2282 2233
2283 2234
2284 void RawArray::WriteTo(SnapshotWriter* writer, 2235 void RawArray::WriteTo(SnapshotWriter* writer,
2285 intptr_t object_id, 2236 intptr_t object_id,
2286 Snapshot::Kind kind, 2237 Snapshot::Kind kind,
2287 bool as_reference) { 2238 bool as_reference) {
2288 ASSERT(!this->IsCanonical()); 2239 ASSERT(!this->IsCanonical());
2289 writer->ArrayWriteTo(object_id, 2240 writer->ArrayWriteTo(object_id, kArrayCid, writer->GetObjectTags(this),
2290 kArrayCid, 2241 ptr()->length_, ptr()->type_arguments_, ptr()->data(),
2291 writer->GetObjectTags(this),
2292 ptr()->length_,
2293 ptr()->type_arguments_,
2294 ptr()->data(),
2295 as_reference); 2242 as_reference);
2296 } 2243 }
2297 2244
2298 2245
2299 void RawImmutableArray::WriteTo(SnapshotWriter* writer, 2246 void RawImmutableArray::WriteTo(SnapshotWriter* writer,
2300 intptr_t object_id, 2247 intptr_t object_id,
2301 Snapshot::Kind kind, 2248 Snapshot::Kind kind,
2302 bool as_reference) { 2249 bool as_reference) {
2303 writer->ArrayWriteTo(object_id, 2250 writer->ArrayWriteTo(object_id, kImmutableArrayCid,
2304 kImmutableArrayCid, 2251 writer->GetObjectTags(this), ptr()->length_,
2305 writer->GetObjectTags(this), 2252 ptr()->type_arguments_, ptr()->data(), as_reference);
2306 ptr()->length_,
2307 ptr()->type_arguments_,
2308 ptr()->data(),
2309 as_reference);
2310 } 2253 }
2311 2254
2312 2255
2313 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader, 2256 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader,
2314 intptr_t object_id, 2257 intptr_t object_id,
2315 intptr_t tags, 2258 intptr_t tags,
2316 Snapshot::Kind kind, 2259 Snapshot::Kind kind,
2317 bool as_reference) { 2260 bool as_reference) {
2318 ASSERT(reader != NULL); 2261 ASSERT(reader != NULL);
2319 2262
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2366 } 2309 }
2367 2310
2368 2311
2369 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, 2312 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader,
2370 intptr_t object_id, 2313 intptr_t object_id,
2371 intptr_t tags, 2314 intptr_t tags,
2372 Snapshot::Kind kind, 2315 Snapshot::Kind kind,
2373 bool as_reference) { 2316 bool as_reference) {
2374 ASSERT(reader != NULL); 2317 ASSERT(reader != NULL);
2375 2318
2376 LinkedHashMap& map = LinkedHashMap::ZoneHandle( 2319 LinkedHashMap& map =
2377 reader->zone(), LinkedHashMap::null()); 2320 LinkedHashMap::ZoneHandle(reader->zone(), LinkedHashMap::null());
2378 if (kind == Snapshot::kScript) { 2321 if (kind == Snapshot::kScript) {
2379 // The immutable maps that seed map literals are not yet VM-internal, so 2322 // The immutable maps that seed map literals are not yet VM-internal, so
2380 // we don't reach this. 2323 // we don't reach this.
2381 UNREACHABLE(); 2324 UNREACHABLE();
2382 } else { 2325 } else {
2383 // Since the map might contain itself as a key or value, allocate first. 2326 // Since the map might contain itself as a key or value, allocate first.
2384 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); 2327 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind));
2385 } 2328 }
2386 reader->AddBackRef(object_id, &map, kIsDeserialized); 2329 reader->AddBackRef(object_id, &map, kIsDeserialized);
2387 2330
2388 // Read the type arguments. 2331 // Read the type arguments.
2389 const intptr_t typeargs_offset = 2332 const intptr_t typeargs_offset =
2390 GrowableObjectArray::type_arguments_offset() / kWordSize; 2333 GrowableObjectArray::type_arguments_offset() / kWordSize;
2391 *reader->TypeArgumentsHandle() ^= 2334 *reader->TypeArgumentsHandle() ^=
2392 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); 2335 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
2393 map.SetTypeArguments(*reader->TypeArgumentsHandle()); 2336 map.SetTypeArguments(*reader->TypeArgumentsHandle());
2394 2337
2395 // Read the number of key/value pairs. 2338 // Read the number of key/value pairs.
2396 intptr_t len = reader->ReadSmiValue(); 2339 intptr_t len = reader->ReadSmiValue();
2397 intptr_t used_data = (len << 1); 2340 intptr_t used_data = (len << 1);
2398 map.SetUsedData(used_data); 2341 map.SetUsedData(used_data);
2399 2342
2400 // Allocate the data array. 2343 // Allocate the data array.
2401 intptr_t data_size = Utils::Maximum( 2344 intptr_t data_size =
2402 Utils::RoundUpToPowerOfTwo(used_data), 2345 Utils::Maximum(Utils::RoundUpToPowerOfTwo(used_data),
2403 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); 2346 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
2404 Array& data = Array::ZoneHandle(reader->zone(), 2347 Array& data = Array::ZoneHandle(reader->zone(),
2405 Array::New(data_size, HEAP_SPACE(kind))); 2348 Array::New(data_size, HEAP_SPACE(kind)));
2406 map.SetData(data); 2349 map.SetData(data);
2407 map.SetDeletedKeys(0); 2350 map.SetDeletedKeys(0);
2408 2351
2409 // The index and hashMask is regenerated by the maps themselves on demand. 2352 // The index and hashMask is regenerated by the maps themselves on demand.
2410 // Thus, the index will probably be allocated in new space (unless it's huge). 2353 // Thus, the index will probably be allocated in new space (unless it's huge).
2411 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and 2354 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and
2412 // in particular, if/when (const) maps are needed in the VM isolate snapshot. 2355 // in particular, if/when (const) maps are needed in the VM isolate snapshot.
2413 ASSERT(reader->isolate() != Dart::vm_isolate()); 2356 ASSERT(reader->isolate() != Dart::vm_isolate());
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2480 Snapshot::Kind kind, 2423 Snapshot::Kind kind,
2481 bool as_reference) { 2424 bool as_reference) {
2482 ASSERT(reader != NULL); 2425 ASSERT(reader != NULL);
2483 // Read the values. 2426 // Read the values.
2484 float value0 = reader->Read<float>(); 2427 float value0 = reader->Read<float>();
2485 float value1 = reader->Read<float>(); 2428 float value1 = reader->Read<float>();
2486 float value2 = reader->Read<float>(); 2429 float value2 = reader->Read<float>();
2487 float value3 = reader->Read<float>(); 2430 float value3 = reader->Read<float>();
2488 2431
2489 // Create a Float32x4 object. 2432 // Create a Float32x4 object.
2490 Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), 2433 Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), Float32x4::null());
2491 Float32x4::null());
2492 simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); 2434 simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
2493 reader->AddBackRef(object_id, &simd, kIsDeserialized); 2435 reader->AddBackRef(object_id, &simd, kIsDeserialized);
2494 return simd.raw(); 2436 return simd.raw();
2495 } 2437 }
2496 2438
2497 2439
2498 void RawFloat32x4::WriteTo(SnapshotWriter* writer, 2440 void RawFloat32x4::WriteTo(SnapshotWriter* writer,
2499 intptr_t object_id, 2441 intptr_t object_id,
2500 Snapshot::Kind kind, 2442 Snapshot::Kind kind,
2501 bool as_reference) { 2443 bool as_reference) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2561 intptr_t object_id, 2503 intptr_t object_id,
2562 intptr_t tags, 2504 intptr_t tags,
2563 Snapshot::Kind kind, 2505 Snapshot::Kind kind,
2564 bool as_reference) { 2506 bool as_reference) {
2565 ASSERT(reader != NULL); 2507 ASSERT(reader != NULL);
2566 // Read the values. 2508 // Read the values.
2567 double value0 = reader->Read<double>(); 2509 double value0 = reader->Read<double>();
2568 double value1 = reader->Read<double>(); 2510 double value1 = reader->Read<double>();
2569 2511
2570 // Create a Float64x2 object. 2512 // Create a Float64x2 object.
2571 Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), 2513 Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), Float64x2::null());
2572 Float64x2::null());
2573 simd = Float64x2::New(value0, value1, HEAP_SPACE(kind)); 2514 simd = Float64x2::New(value0, value1, HEAP_SPACE(kind));
2574 reader->AddBackRef(object_id, &simd, kIsDeserialized); 2515 reader->AddBackRef(object_id, &simd, kIsDeserialized);
2575 return simd.raw(); 2516 return simd.raw();
2576 } 2517 }
2577 2518
2578 2519
2579 void RawFloat64x2::WriteTo(SnapshotWriter* writer, 2520 void RawFloat64x2::WriteTo(SnapshotWriter* writer,
2580 intptr_t object_id, 2521 intptr_t object_id,
2581 Snapshot::Kind kind, 2522 Snapshot::Kind kind,
2582 bool as_reference) { 2523 bool as_reference) {
2583 ASSERT(writer != NULL); 2524 ASSERT(writer != NULL);
2584 2525
2585 // Write out the serialization header value for this object. 2526 // Write out the serialization header value for this object.
2586 writer->WriteInlinedObjectHeader(object_id); 2527 writer->WriteInlinedObjectHeader(object_id);
2587 2528
2588 // Write out the class and tags information. 2529 // Write out the class and tags information.
2589 writer->WriteIndexedObject(kFloat64x2Cid); 2530 writer->WriteIndexedObject(kFloat64x2Cid);
2590 writer->WriteTags(writer->GetObjectTags(this)); 2531 writer->WriteTags(writer->GetObjectTags(this));
2591 2532
2592 // Write out the float values. 2533 // Write out the float values.
2593 writer->Write<double>(ptr()->value_[0]); 2534 writer->Write<double>(ptr()->value_[0]);
2594 writer->Write<double>(ptr()->value_[1]); 2535 writer->Write<double>(ptr()->value_[1]);
2595 } 2536 }
2596 2537
2597 2538
2598 #define TYPED_DATA_READ(setter, type) \ 2539 #define TYPED_DATA_READ(setter, type) \
2599 for (intptr_t i = 0; i < length_in_bytes; i += element_size) { \ 2540 for (intptr_t i = 0; i < length_in_bytes; i += element_size) { \
2600 result.Set##setter(i, reader->Read<type>()); \ 2541 result.Set##setter(i, reader->Read<type>()); \
2601 } \ 2542 }
2602 2543
2603 2544
2604 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader, 2545 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader,
2605 intptr_t object_id, 2546 intptr_t object_id,
2606 intptr_t tags, 2547 intptr_t tags,
2607 Snapshot::Kind kind, 2548 Snapshot::Kind kind,
2608 bool as_reference) { 2549 bool as_reference) {
2609 ASSERT(reader != NULL); 2550 ASSERT(reader != NULL);
2610 2551
2611 intptr_t cid = RawObject::ClassIdTag::decode(tags); 2552 intptr_t cid = RawObject::ClassIdTag::decode(tags);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2670 2611
2671 RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader, 2612 RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader,
2672 intptr_t object_id, 2613 intptr_t object_id,
2673 intptr_t tags, 2614 intptr_t tags,
2674 Snapshot::Kind kind, 2615 Snapshot::Kind kind,
2675 bool as_reference) { 2616 bool as_reference) {
2676 ASSERT(!Snapshot::IsFull(kind)); 2617 ASSERT(!Snapshot::IsFull(kind));
2677 intptr_t cid = RawObject::ClassIdTag::decode(tags); 2618 intptr_t cid = RawObject::ClassIdTag::decode(tags);
2678 intptr_t length = reader->ReadSmiValue(); 2619 intptr_t length = reader->ReadSmiValue();
2679 uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue()); 2620 uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue());
2680 ExternalTypedData& obj = ExternalTypedData::ZoneHandle( 2621 ExternalTypedData& obj =
2681 ExternalTypedData::New(cid, data, length)); 2622 ExternalTypedData::ZoneHandle(ExternalTypedData::New(cid, data, length));
2682 reader->AddBackRef(object_id, &obj, kIsDeserialized); 2623 reader->AddBackRef(object_id, &obj, kIsDeserialized);
2683 void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue()); 2624 void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue());
2684 Dart_WeakPersistentHandleFinalizer callback = 2625 Dart_WeakPersistentHandleFinalizer callback =
2685 reinterpret_cast<Dart_WeakPersistentHandleFinalizer>( 2626 reinterpret_cast<Dart_WeakPersistentHandleFinalizer>(
2686 reader->ReadRawPointerValue()); 2627 reader->ReadRawPointerValue());
2687 intptr_t external_size = obj.LengthInBytes(); 2628 intptr_t external_size = obj.LengthInBytes();
2688 obj.AddFinalizer(peer, callback, external_size); 2629 obj.AddFinalizer(peer, callback, external_size);
2689 return obj.raw(); 2630 return obj.raw();
2690 } 2631 }
2691 2632
2692 2633
2693 #define TYPED_DATA_WRITE(type) \ 2634 #define TYPED_DATA_WRITE(type) \
2694 { \ 2635 { \
2695 type* data = reinterpret_cast<type*>(ptr()->data()); \ 2636 type* data = reinterpret_cast<type*>(ptr()->data()); \
2696 for (intptr_t i = 0; i < len; i++) { \ 2637 for (intptr_t i = 0; i < len; i++) { \
2697 writer->Write(data[i]); \ 2638 writer->Write(data[i]); \
2698 } \ 2639 } \
2699 } \ 2640 }
2700 2641
2701 2642
2702 void RawTypedData::WriteTo(SnapshotWriter* writer, 2643 void RawTypedData::WriteTo(SnapshotWriter* writer,
2703 intptr_t object_id, 2644 intptr_t object_id,
2704 Snapshot::Kind kind, 2645 Snapshot::Kind kind,
2705 bool as_reference) { 2646 bool as_reference) {
2706 ASSERT(writer != NULL); 2647 ASSERT(writer != NULL);
2707 intptr_t cid = this->GetClassId(); 2648 intptr_t cid = this->GetClassId();
2708 intptr_t len = Smi::Value(ptr()->length_); 2649 intptr_t len = Smi::Value(ptr()->length_);
2709 2650
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2755 } 2696 }
2756 } 2697 }
2757 2698
2758 2699
2759 #define TYPED_EXT_DATA_WRITE(type) \ 2700 #define TYPED_EXT_DATA_WRITE(type) \
2760 { \ 2701 { \
2761 type* data = reinterpret_cast<type*>(ptr()->data_); \ 2702 type* data = reinterpret_cast<type*>(ptr()->data_); \
2762 for (intptr_t i = 0; i < len; i++) { \ 2703 for (intptr_t i = 0; i < len; i++) { \
2763 writer->Write(data[i]); \ 2704 writer->Write(data[i]); \
2764 } \ 2705 } \
2765 } \ 2706 }
2766 2707
2767 2708
2768 #define EXT_TYPED_DATA_WRITE(cid, type) \ 2709 #define EXT_TYPED_DATA_WRITE(cid, type) \
2769 writer->WriteIndexedObject(cid); \ 2710 writer->WriteIndexedObject(cid); \
2770 writer->WriteTags(writer->GetObjectTags(this)); \ 2711 writer->WriteTags(writer->GetObjectTags(this)); \
2771 writer->Write<RawObject*>(ptr()->length_); \ 2712 writer->Write<RawObject*>(ptr()->length_); \
2772 TYPED_EXT_DATA_WRITE(type) \ 2713 TYPED_EXT_DATA_WRITE(type)
2773 2714
2774 2715
2775 void RawExternalTypedData::WriteTo(SnapshotWriter* writer, 2716 void RawExternalTypedData::WriteTo(SnapshotWriter* writer,
2776 intptr_t object_id, 2717 intptr_t object_id,
2777 Snapshot::Kind kind, 2718 Snapshot::Kind kind,
2778 bool as_reference) { 2719 bool as_reference) {
2779 ASSERT(writer != NULL); 2720 ASSERT(writer != NULL);
2780 intptr_t cid = this->GetClassId(); 2721 intptr_t cid = this->GetClassId();
2781 intptr_t len = Smi::Value(ptr()->length_); 2722 intptr_t len = Smi::Value(ptr()->length_);
2782 2723
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2825 #undef EXT_TYPED_DATA_WRITE 2766 #undef EXT_TYPED_DATA_WRITE
2826 2767
2827 2768
2828 RawCapability* Capability::ReadFrom(SnapshotReader* reader, 2769 RawCapability* Capability::ReadFrom(SnapshotReader* reader,
2829 intptr_t object_id, 2770 intptr_t object_id,
2830 intptr_t tags, 2771 intptr_t tags,
2831 Snapshot::Kind kind, 2772 Snapshot::Kind kind,
2832 bool as_reference) { 2773 bool as_reference) {
2833 uint64_t id = reader->Read<uint64_t>(); 2774 uint64_t id = reader->Read<uint64_t>();
2834 2775
2835 Capability& result = Capability::ZoneHandle(reader->zone(), 2776 Capability& result =
2836 Capability::New(id)); 2777 Capability::ZoneHandle(reader->zone(), Capability::New(id));
2837 reader->AddBackRef(object_id, &result, kIsDeserialized); 2778 reader->AddBackRef(object_id, &result, kIsDeserialized);
2838 return result.raw(); 2779 return result.raw();
2839 } 2780 }
2840 2781
2841 2782
2842 void RawCapability::WriteTo(SnapshotWriter* writer, 2783 void RawCapability::WriteTo(SnapshotWriter* writer,
2843 intptr_t object_id, 2784 intptr_t object_id,
2844 Snapshot::Kind kind, 2785 Snapshot::Kind kind,
2845 bool as_reference) { 2786 bool as_reference) {
2846 // Write out the serialization header value for this object. 2787 // Write out the serialization header value for this object.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2883 intptr_t object_id, 2824 intptr_t object_id,
2884 intptr_t tags, 2825 intptr_t tags,
2885 Snapshot::Kind kind, 2826 Snapshot::Kind kind,
2886 bool as_reference) { 2827 bool as_reference) {
2887 ASSERT(kind == Snapshot::kMessage); 2828 ASSERT(kind == Snapshot::kMessage);
2888 2829
2889 uint64_t id = reader->Read<uint64_t>(); 2830 uint64_t id = reader->Read<uint64_t>();
2890 uint64_t origin_id = reader->Read<uint64_t>(); 2831 uint64_t origin_id = reader->Read<uint64_t>();
2891 2832
2892 SendPort& result = 2833 SendPort& result =
2893 SendPort::ZoneHandle(reader->zone(), 2834 SendPort::ZoneHandle(reader->zone(), SendPort::New(id, origin_id));
2894 SendPort::New(id, origin_id));
2895 reader->AddBackRef(object_id, &result, kIsDeserialized); 2835 reader->AddBackRef(object_id, &result, kIsDeserialized);
2896 return result.raw(); 2836 return result.raw();
2897 } 2837 }
2898 2838
2899 2839
2900 void RawSendPort::WriteTo(SnapshotWriter* writer, 2840 void RawSendPort::WriteTo(SnapshotWriter* writer,
2901 intptr_t object_id, 2841 intptr_t object_id,
2902 Snapshot::Kind kind, 2842 Snapshot::Kind kind,
2903 bool as_reference) { 2843 bool as_reference) {
2904 // Write out the serialization header value for this object. 2844 // Write out the serialization header value for this object.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2945 RegExp& regex = RegExp::ZoneHandle(reader->zone(), RegExp::New()); 2885 RegExp& regex = RegExp::ZoneHandle(reader->zone(), RegExp::New());
2946 reader->AddBackRef(object_id, &regex, kIsDeserialized); 2886 reader->AddBackRef(object_id, &regex, kIsDeserialized);
2947 2887
2948 // Read and Set all the other fields. 2888 // Read and Set all the other fields.
2949 regex.StoreSmi(&regex.raw_ptr()->num_bracket_expressions_, 2889 regex.StoreSmi(&regex.raw_ptr()->num_bracket_expressions_,
2950 reader->ReadAsSmi()); 2890 reader->ReadAsSmi());
2951 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); 2891 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
2952 regex.set_pattern(*reader->StringHandle()); 2892 regex.set_pattern(*reader->StringHandle());
2953 regex.StoreNonPointer(&regex.raw_ptr()->num_registers_, 2893 regex.StoreNonPointer(&regex.raw_ptr()->num_registers_,
2954 reader->Read<int32_t>()); 2894 reader->Read<int32_t>());
2955 regex.StoreNonPointer(&regex.raw_ptr()->type_flags_, 2895 regex.StoreNonPointer(&regex.raw_ptr()->type_flags_, reader->Read<int8_t>());
2956 reader->Read<int8_t>());
2957 2896
2958 // TODO(18854): Need to implement a way of recreating the irrexp functions. 2897 // TODO(18854): Need to implement a way of recreating the irrexp functions.
2959 const Function& no_function = Function::Handle(reader->zone()); 2898 const Function& no_function = Function::Handle(reader->zone());
2960 regex.set_function(kOneByteStringCid, no_function); 2899 regex.set_function(kOneByteStringCid, no_function);
2961 regex.set_function(kTwoByteStringCid, no_function); 2900 regex.set_function(kTwoByteStringCid, no_function);
2962 regex.set_function(kExternalOneByteStringCid, no_function); 2901 regex.set_function(kExternalOneByteStringCid, no_function);
2963 regex.set_function(kExternalTwoByteStringCid, no_function); 2902 regex.set_function(kExternalTwoByteStringCid, no_function);
2964 2903
2965 const TypedData& no_bytecode = TypedData::Handle(reader->zone()); 2904 const TypedData& no_bytecode = TypedData::Handle(reader->zone());
2966 regex.set_bytecode(true, no_bytecode); 2905 regex.set_bytecode(true, no_bytecode);
(...skipping 25 matching lines...) Expand all
2992 2931
2993 2932
2994 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, 2933 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader,
2995 intptr_t object_id, 2934 intptr_t object_id,
2996 intptr_t tags, 2935 intptr_t tags,
2997 Snapshot::Kind kind, 2936 Snapshot::Kind kind,
2998 bool as_reference) { 2937 bool as_reference) {
2999 ASSERT(reader != NULL); 2938 ASSERT(reader != NULL);
3000 2939
3001 // Allocate the weak property object. 2940 // Allocate the weak property object.
3002 WeakProperty& weak_property = WeakProperty::ZoneHandle(reader->zone(), 2941 WeakProperty& weak_property =
3003 WeakProperty::New()); 2942 WeakProperty::ZoneHandle(reader->zone(), WeakProperty::New());
3004 reader->AddBackRef(object_id, &weak_property, kIsDeserialized); 2943 reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
3005 2944
3006 // Set all the object fields. 2945 // Set all the object fields.
3007 READ_OBJECT_FIELDS(weak_property, 2946 READ_OBJECT_FIELDS(weak_property, weak_property.raw()->from(),
3008 weak_property.raw()->from(), weak_property.raw()->to(), 2947 weak_property.raw()->to(), kAsReference);
3009 kAsReference);
3010 2948
3011 return weak_property.raw(); 2949 return weak_property.raw();
3012 } 2950 }
3013 2951
3014 2952
3015 void RawWeakProperty::WriteTo(SnapshotWriter* writer, 2953 void RawWeakProperty::WriteTo(SnapshotWriter* writer,
3016 intptr_t object_id, 2954 intptr_t object_id,
3017 Snapshot::Kind kind, 2955 Snapshot::Kind kind,
3018 bool as_reference) { 2956 bool as_reference) {
3019 ASSERT(writer != NULL); 2957 ASSERT(writer != NULL);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
3074 // We do not allow objects with native fields in an isolate message. 3012 // We do not allow objects with native fields in an isolate message.
3075 writer->SetWriteException(Exceptions::kArgument, 3013 writer->SetWriteException(Exceptions::kArgument,
3076 "Illegal argument in isolate message" 3014 "Illegal argument in isolate message"
3077 " : (object is a UserTag)"); 3015 " : (object is a UserTag)");
3078 } else { 3016 } else {
3079 UNREACHABLE(); 3017 UNREACHABLE();
3080 } 3018 }
3081 } 3019 }
3082 3020
3083 } // namespace dart 3021 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/raw_object.cc ('k') | runtime/vm/redundancy_elimination.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698