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

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

Issue 1318803002: Toward precompiled snapshots. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: READ_POINTERS Created 5 years, 3 months 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
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/object.h" 5 #include "vm/object.h"
6 #include "vm/object_store.h" 6 #include "vm/object_store.h"
7 #include "vm/snapshot.h" 7 #include "vm/snapshot.h"
8 #include "vm/stub_code.h" 8 #include "vm/stub_code.h"
9 #include "vm/symbols.h" 9 #include "vm/symbols.h"
10 #include "vm/visitor.h" 10 #include "vm/visitor.h"
11 11
12 namespace dart { 12 namespace dart {
13 13
14 #define NEW_OBJECT(type) \ 14 #define NEW_OBJECT(type) \
15 ((kind == Snapshot::kFull) ? reader->New##type() : type::New()) 15 ((kind == Snapshot::kFull) ? reader->New##type() : type::New())
16 16
17 #define NEW_OBJECT_WITH_LEN(type, len) \ 17 #define NEW_OBJECT_WITH_LEN(type, len) \
18 ((kind == Snapshot::kFull) ? reader->New##type(len) : type::New(len)) 18 ((kind == Snapshot::kFull) ? reader->New##type(len) : type::New(len))
19 19
20 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \ 20 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \
21 ((kind == Snapshot::kFull) ? \ 21 ((kind == Snapshot::kFull) ? \
22 reader->New##type(len) : type::New(len, HEAP_SPACE(kind))) 22 reader->New##type(len) : type::New(len, HEAP_SPACE(kind)))
23 23
24 #define OFFSET_OF_FROM(obj) \ 24 #define OFFSET_OF_FROM(obj) \
25 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr()) 25 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr())
26 26
27 // TODO(18854): Need to assert No GC can happen here, even though
28 // allocations may happen.
29 #define READ_POINTERS(object, as_reference) \
30 intptr_t num_flds = object.raw()->to() - object.raw()->from(); \
31 intptr_t from_offset = OFFSET_OF_FROM(object); \
32 for (intptr_t i = 0; i <= num_flds; i++) { \
33 (*reader->PassiveObjectHandle()) = \
34 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \
35 object.StorePointer((object.raw()->from() + i), \
36 reader->PassiveObjectHandle()->raw()); \
37 }
siva 2015/09/01 20:58:49 Instead of READ_POINTERS why not call it READ_OBJE
rmacnak 2015/09/01 23:43:47 Done.
38
27 RawClass* Class::ReadFrom(SnapshotReader* reader, 39 RawClass* Class::ReadFrom(SnapshotReader* reader,
28 intptr_t object_id, 40 intptr_t object_id,
29 intptr_t tags, 41 intptr_t tags,
30 Snapshot::Kind kind) { 42 Snapshot::Kind kind) {
31 ASSERT(reader != NULL); 43 ASSERT(reader != NULL);
32 44
33 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); 45 Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
34 bool is_in_fullsnapshot = reader->Read<bool>(); 46 bool is_in_fullsnapshot = reader->Read<bool>();
35 if ((kind == Snapshot::kFull) || 47 if ((kind == Snapshot::kFull) ||
36 (kind == Snapshot::kScript && !is_in_fullsnapshot)) { 48 (kind == Snapshot::kScript && !is_in_fullsnapshot)) {
(...skipping 20 matching lines...) Expand all
57 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); 69 cls.set_next_field_offset_in_words(reader->Read<int32_t>());
58 } 70 }
59 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); 71 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>());
60 cls.set_num_type_arguments(reader->Read<int16_t>()); 72 cls.set_num_type_arguments(reader->Read<int16_t>());
61 cls.set_num_own_type_arguments(reader->Read<int16_t>()); 73 cls.set_num_own_type_arguments(reader->Read<int16_t>());
62 cls.set_num_native_fields(reader->Read<uint16_t>()); 74 cls.set_num_native_fields(reader->Read<uint16_t>());
63 cls.set_token_pos(reader->Read<int32_t>()); 75 cls.set_token_pos(reader->Read<int32_t>());
64 cls.set_state_bits(reader->Read<uint16_t>()); 76 cls.set_state_bits(reader->Read<uint16_t>());
65 77
66 // Set all the object fields. 78 // Set all the object fields.
67 // TODO(5411462): Need to assert No GC can happen here, even though 79 READ_POINTERS(cls, kAsReference);
68 // allocations may happen. 80
69 intptr_t num_flds = (cls.raw()->to() - cls.raw()->from());
70 intptr_t from_offset = OFFSET_OF_FROM(cls);
71 for (intptr_t i = 0; i <= num_flds; i++) {
72 (*reader->PassiveObjectHandle()) =
73 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
74 cls.StorePointer((cls.raw()->from() + i),
75 reader->PassiveObjectHandle()->raw());
76 }
77 ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull)); 81 ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull));
78 } else { 82 } else {
79 cls ^= reader->ReadClassId(object_id); 83 cls ^= reader->ReadClassId(object_id);
80 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); 84 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot());
81 } 85 }
82 return cls.raw(); 86 return cls.raw();
83 } 87 }
84 88
85 89
86 void RawClass::WriteTo(SnapshotWriter* writer, 90 void RawClass::WriteTo(SnapshotWriter* writer,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 150
147 // Allocate unresolved class object. 151 // Allocate unresolved class object.
148 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( 152 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle(
149 reader->zone(), NEW_OBJECT(UnresolvedClass)); 153 reader->zone(), NEW_OBJECT(UnresolvedClass));
150 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); 154 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
151 155
152 // Set all non object fields. 156 // Set all non object fields.
153 unresolved_class.set_token_pos(reader->Read<int32_t>()); 157 unresolved_class.set_token_pos(reader->Read<int32_t>());
154 158
155 // Set all the object fields. 159 // Set all the object fields.
156 // TODO(5411462): Need to assert No GC can happen here, even though 160 READ_POINTERS(unresolved_class, kAsReference);
157 // allocations may happen. 161
158 intptr_t num_flds = (unresolved_class.raw()->to() -
159 unresolved_class.raw()->from());
160 for (intptr_t i = 0; i <= num_flds; i++) {
161 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
162 unresolved_class.StorePointer((unresolved_class.raw()->from() + i),
163 reader->PassiveObjectHandle()->raw());
164 }
165 return unresolved_class.raw(); 162 return unresolved_class.raw();
166 } 163 }
167 164
168 165
169 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, 166 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer,
170 intptr_t object_id, 167 intptr_t object_id,
171 Snapshot::Kind kind) { 168 Snapshot::Kind kind) {
172 ASSERT(writer != NULL); 169 ASSERT(writer != NULL);
173 170
174 // Write out the serialization header value for this object. 171 // Write out the serialization header value for this object.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 bool is_canonical = RawObject::IsCanonical(tags); 214 bool is_canonical = RawObject::IsCanonical(tags);
218 bool defer_canonicalization = is_canonical && 215 bool defer_canonicalization = is_canonical &&
219 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot); 216 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot);
220 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); 217 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization);
221 218
222 // Set all non object fields. 219 // Set all non object fields.
223 type.set_token_pos(reader->Read<int32_t>()); 220 type.set_token_pos(reader->Read<int32_t>());
224 type.set_type_state(reader->Read<int8_t>()); 221 type.set_type_state(reader->Read<int8_t>());
225 222
226 // Set all the object fields. 223 // Set all the object fields.
227 // TODO(5411462): Need to assert No GC can happen here, even though 224 READ_POINTERS(type, kAsReference);
228 // allocations may happen.
229 intptr_t num_flds = (type.raw()->to() - type.raw()->from());
230 intptr_t from_offset = OFFSET_OF_FROM(type);
231 for (intptr_t i = 0; i <= num_flds; i++) {
232 (*reader->PassiveObjectHandle()) =
233 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
234 type.StorePointer((type.raw()->from() + i),
235 reader->PassiveObjectHandle()->raw());
236 }
237 225
238 // Set the canonical bit. 226 // Set the canonical bit.
239 if (!defer_canonicalization && RawObject::IsCanonical(tags)) { 227 if (!defer_canonicalization && RawObject::IsCanonical(tags)) {
240 type.SetCanonical(); 228 type.SetCanonical();
241 } 229 }
242 230
243 return type.raw(); 231 return type.raw();
244 } 232 }
245 233
246 234
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 intptr_t tags, 275 intptr_t tags,
288 Snapshot::Kind kind) { 276 Snapshot::Kind kind) {
289 ASSERT(reader != NULL); 277 ASSERT(reader != NULL);
290 278
291 // Allocate type ref object. 279 // Allocate type ref object.
292 TypeRef& type_ref = TypeRef::ZoneHandle( 280 TypeRef& type_ref = TypeRef::ZoneHandle(
293 reader->zone(), NEW_OBJECT(TypeRef)); 281 reader->zone(), NEW_OBJECT(TypeRef));
294 reader->AddBackRef(object_id, &type_ref, kIsDeserialized); 282 reader->AddBackRef(object_id, &type_ref, kIsDeserialized);
295 283
296 // Set all the object fields. 284 // Set all the object fields.
297 // TODO(5411462): Need to assert No GC can happen here, even though 285 READ_POINTERS(type_ref, kAsReference);
298 // allocations may happen.
299 intptr_t num_flds = (type_ref.raw()->to() - type_ref.raw()->from());
300 intptr_t from_offset = OFFSET_OF_FROM(type_ref);
301 for (intptr_t i = 0; i <= num_flds; i++) {
302 (*reader->PassiveObjectHandle()) =
303 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
304 type_ref.StorePointer((type_ref.raw()->from() + i),
305 reader->PassiveObjectHandle()->raw());
306 }
307 286
308 return type_ref.raw(); 287 return type_ref.raw();
309 } 288 }
310 289
311 290
312 void RawTypeRef::WriteTo(SnapshotWriter* writer, 291 void RawTypeRef::WriteTo(SnapshotWriter* writer,
313 intptr_t object_id, 292 intptr_t object_id,
314 Snapshot::Kind kind) { 293 Snapshot::Kind kind) {
315 ASSERT(writer != NULL); 294 ASSERT(writer != NULL);
316 295
(...skipping 20 matching lines...) Expand all
337 TypeParameter& type_parameter = TypeParameter::ZoneHandle( 316 TypeParameter& type_parameter = TypeParameter::ZoneHandle(
338 reader->zone(), NEW_OBJECT(TypeParameter)); 317 reader->zone(), NEW_OBJECT(TypeParameter));
339 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); 318 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
340 319
341 // Set all non object fields. 320 // Set all non object fields.
342 type_parameter.set_token_pos(reader->Read<int32_t>()); 321 type_parameter.set_token_pos(reader->Read<int32_t>());
343 type_parameter.set_index(reader->Read<int16_t>()); 322 type_parameter.set_index(reader->Read<int16_t>());
344 type_parameter.set_type_state(reader->Read<int8_t>()); 323 type_parameter.set_type_state(reader->Read<int8_t>());
345 324
346 // Set all the object fields. 325 // Set all the object fields.
347 // TODO(5411462): Need to assert No GC can happen here, even though 326 READ_POINTERS(type_parameter, kAsReference);
348 // allocations may happen.
349 intptr_t num_flds = (type_parameter.raw()->to() -
350 type_parameter.raw()->from());
351 intptr_t from_offset = OFFSET_OF_FROM(type_parameter);
352 for (intptr_t i = 0; i <= num_flds; i++) {
353 (*reader->PassiveObjectHandle()) =
354 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
355 type_parameter.StorePointer((type_parameter.raw()->from() + i),
356 reader->PassiveObjectHandle()->raw());
357 }
358 327
359 return type_parameter.raw(); 328 return type_parameter.raw();
360 } 329 }
361 330
362 331
363 void RawTypeParameter::WriteTo(SnapshotWriter* writer, 332 void RawTypeParameter::WriteTo(SnapshotWriter* writer,
364 intptr_t object_id, 333 intptr_t object_id,
365 Snapshot::Kind kind) { 334 Snapshot::Kind kind) {
366 ASSERT(writer != NULL); 335 ASSERT(writer != NULL);
367 336
(...skipping 23 matching lines...) Expand all
391 intptr_t tags, 360 intptr_t tags,
392 Snapshot::Kind kind) { 361 Snapshot::Kind kind) {
393 ASSERT(reader != NULL); 362 ASSERT(reader != NULL);
394 363
395 // Allocate bounded type object. 364 // Allocate bounded type object.
396 BoundedType& bounded_type = BoundedType::ZoneHandle( 365 BoundedType& bounded_type = BoundedType::ZoneHandle(
397 reader->zone(), NEW_OBJECT(BoundedType)); 366 reader->zone(), NEW_OBJECT(BoundedType));
398 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized); 367 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
399 368
400 // Set all the object fields. 369 // Set all the object fields.
401 // TODO(5411462): Need to assert No GC can happen here, even though 370 READ_POINTERS(bounded_type, kAsReference);
402 // allocations may happen.
403 intptr_t num_flds = (bounded_type.raw()->to() -
404 bounded_type.raw()->from());
405 intptr_t from_offset = OFFSET_OF_FROM(bounded_type);
406 for (intptr_t i = 0; i <= num_flds; i++) {
407 (*reader->PassiveObjectHandle()) =
408 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
409 bounded_type.StorePointer((bounded_type.raw()->from() + i),
410 reader->PassiveObjectHandle()->raw());
411 }
412 371
413 return bounded_type.raw(); 372 return bounded_type.raw();
414 } 373 }
415 374
416 375
417 void RawBoundedType::WriteTo(SnapshotWriter* writer, 376 void RawBoundedType::WriteTo(SnapshotWriter* writer,
418 intptr_t object_id, 377 intptr_t object_id,
419 Snapshot::Kind kind) { 378 Snapshot::Kind kind) {
420 ASSERT(writer != NULL); 379 ASSERT(writer != NULL);
421 380
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 intptr_t tags, 484 intptr_t tags,
526 Snapshot::Kind kind) { 485 Snapshot::Kind kind) {
527 ASSERT(reader != NULL); 486 ASSERT(reader != NULL);
528 487
529 // Allocate function object. 488 // Allocate function object.
530 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), 489 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(),
531 NEW_OBJECT(PatchClass)); 490 NEW_OBJECT(PatchClass));
532 reader->AddBackRef(object_id, &cls, kIsDeserialized); 491 reader->AddBackRef(object_id, &cls, kIsDeserialized);
533 492
534 // Set all the object fields. 493 // Set all the object fields.
535 // TODO(5411462): Need to assert No GC can happen here, even though 494 READ_POINTERS(cls, kAsReference);
536 // allocations may happen. 495
537 intptr_t num_flds = (cls.raw()->to() - cls.raw()->from());
538 for (intptr_t i = 0; i <= num_flds; i++) {
539 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
540 cls.StorePointer((cls.raw()->from() + i),
541 reader->PassiveObjectHandle()->raw());
542 }
543 ASSERT(((kind == Snapshot::kScript) && 496 ASSERT(((kind == Snapshot::kScript) &&
544 !Class::IsInFullSnapshot(cls.source_class())) || 497 !Class::IsInFullSnapshot(cls.source_class())) ||
545 (kind == Snapshot::kFull)); 498 (kind == Snapshot::kFull));
546 499
547 return cls.raw(); 500 return cls.raw();
548 } 501 }
549 502
550 503
551 void RawPatchClass::WriteTo(SnapshotWriter* writer, 504 void RawPatchClass::WriteTo(SnapshotWriter* writer,
552 intptr_t object_id, 505 intptr_t object_id,
(...skipping 19 matching lines...) Expand all
572 Snapshot::Kind kind) { 525 Snapshot::Kind kind) {
573 ASSERT(reader != NULL); 526 ASSERT(reader != NULL);
574 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 527 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
575 528
576 // Allocate closure data object. 529 // Allocate closure data object.
577 ClosureData& data = ClosureData::ZoneHandle( 530 ClosureData& data = ClosureData::ZoneHandle(
578 reader->zone(), NEW_OBJECT(ClosureData)); 531 reader->zone(), NEW_OBJECT(ClosureData));
579 reader->AddBackRef(object_id, &data, kIsDeserialized); 532 reader->AddBackRef(object_id, &data, kIsDeserialized);
580 533
581 // Set all the object fields. 534 // Set all the object fields.
582 // TODO(5411462): Need to assert No GC can happen here, even though 535 READ_POINTERS(data, kAsReference);
583 // allocations may happen.
584 intptr_t num_flds = (data.raw()->to() - data.raw()->from());
585 for (intptr_t i = 0; i <= num_flds; i++) {
586 *(data.raw()->from() + i) = reader->ReadObjectImpl(kAsReference);
587 }
588 536
589 return data.raw(); 537 return data.raw();
590 } 538 }
591 539
592 540
593 void RawClosureData::WriteTo(SnapshotWriter* writer, 541 void RawClosureData::WriteTo(SnapshotWriter* writer,
594 intptr_t object_id, 542 intptr_t object_id,
595 Snapshot::Kind kind) { 543 Snapshot::Kind kind) {
596 ASSERT(writer != NULL); 544 ASSERT(writer != NULL);
597 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 545 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 27 matching lines...) Expand all
625 Snapshot::Kind kind) { 573 Snapshot::Kind kind) {
626 ASSERT(reader != NULL); 574 ASSERT(reader != NULL);
627 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 575 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
628 576
629 // Allocate redirection data object. 577 // Allocate redirection data object.
630 RedirectionData& data = RedirectionData::ZoneHandle( 578 RedirectionData& data = RedirectionData::ZoneHandle(
631 reader->zone(), NEW_OBJECT(RedirectionData)); 579 reader->zone(), NEW_OBJECT(RedirectionData));
632 reader->AddBackRef(object_id, &data, kIsDeserialized); 580 reader->AddBackRef(object_id, &data, kIsDeserialized);
633 581
634 // Set all the object fields. 582 // Set all the object fields.
635 // TODO(5411462): Need to assert No GC can happen here, even though 583 READ_POINTERS(data, kAsReference);
636 // allocations may happen.
637 intptr_t num_flds = (data.raw()->to() - data.raw()->from());
638 intptr_t from_offset = OFFSET_OF_FROM(data);
639 for (intptr_t i = 0; i <= num_flds; i++) {
640 (*reader->PassiveObjectHandle()) =
641 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
642 data.StorePointer((data.raw()->from() + i),
643 reader->PassiveObjectHandle()->raw());
644 }
645 584
646 return data.raw(); 585 return data.raw();
647 } 586 }
648 587
649 588
650 void RawRedirectionData::WriteTo(SnapshotWriter* writer, 589 void RawRedirectionData::WriteTo(SnapshotWriter* writer,
651 intptr_t object_id, 590 intptr_t object_id,
652 Snapshot::Kind kind) { 591 Snapshot::Kind kind) {
653 ASSERT(writer != NULL); 592 ASSERT(writer != NULL);
654 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 593 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 (*reader->PassiveObjectHandle()) = 639 (*reader->PassiveObjectHandle()) =
701 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset)); 640 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
702 func.StorePointer((func.raw()->from() + i), 641 func.StorePointer((func.raw()->from() + i),
703 reader->PassiveObjectHandle()->raw()); 642 reader->PassiveObjectHandle()->raw());
704 } 643 }
705 644
706 if (!reader->snapshot_code()) { 645 if (!reader->snapshot_code()) {
707 // Initialize all fields that are not part of the snapshot. 646 // Initialize all fields that are not part of the snapshot.
708 func.ClearICDataArray(); 647 func.ClearICDataArray();
709 func.ClearCode(); 648 func.ClearCode();
649 } else {
650 // TODO(rmacnak): Fix entry_point_.
710 } 651 }
711 return func.raw(); 652 return func.raw();
712 } 653 }
713 654
714 655
715 void RawFunction::WriteTo(SnapshotWriter* writer, 656 void RawFunction::WriteTo(SnapshotWriter* writer,
716 intptr_t object_id, 657 intptr_t object_id,
717 Snapshot::Kind kind) { 658 Snapshot::Kind kind) {
718 ASSERT(writer != NULL); 659 ASSERT(writer != NULL);
719 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 660 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field)); 695 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field));
755 reader->AddBackRef(object_id, &field, kIsDeserialized); 696 reader->AddBackRef(object_id, &field, kIsDeserialized);
756 697
757 // Set all non object fields. 698 // Set all non object fields.
758 field.set_token_pos(reader->Read<int32_t>()); 699 field.set_token_pos(reader->Read<int32_t>());
759 field.set_guarded_cid(reader->Read<int32_t>()); 700 field.set_guarded_cid(reader->Read<int32_t>());
760 field.set_is_nullable(reader->Read<int32_t>()); 701 field.set_is_nullable(reader->Read<int32_t>());
761 field.set_kind_bits(reader->Read<uint8_t>()); 702 field.set_kind_bits(reader->Read<uint8_t>());
762 703
763 // Set all the object fields. 704 // Set all the object fields.
764 // TODO(5411462): Need to assert No GC can happen here, even though 705 READ_POINTERS(field, kAsReference);
765 // allocations may happen.
766 intptr_t num_flds = (field.raw()->to() - field.raw()->from());
767 intptr_t from_offset = OFFSET_OF_FROM(field);
768 for (intptr_t i = 0; i <= num_flds; i++) {
769 (*reader->PassiveObjectHandle()) =
770 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
771 field.StorePointer((field.raw()->from() + i),
772 reader->PassiveObjectHandle()->raw());
773 }
774 706
775 field.InitializeGuardedListLengthInObjectOffset(); 707 field.InitializeGuardedListLengthInObjectOffset();
776 708
777 return field.raw(); 709 return field.raw();
778 } 710 }
779 711
780 712
781 void RawField::WriteTo(SnapshotWriter* writer, 713 void RawField::WriteTo(SnapshotWriter* writer,
782 intptr_t object_id, 714 intptr_t object_id,
783 Snapshot::Kind kind) { 715 Snapshot::Kind kind) {
(...skipping 29 matching lines...) Expand all
813 // Create the literal token object. 745 // Create the literal token object.
814 LiteralToken& literal_token = LiteralToken::ZoneHandle( 746 LiteralToken& literal_token = LiteralToken::ZoneHandle(
815 reader->zone(), NEW_OBJECT(LiteralToken)); 747 reader->zone(), NEW_OBJECT(LiteralToken));
816 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); 748 reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
817 749
818 // Read the token attributes. 750 // Read the token attributes.
819 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); 751 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>());
820 literal_token.set_kind(token_kind); 752 literal_token.set_kind(token_kind);
821 753
822 // Set all the object fields. 754 // Set all the object fields.
823 // TODO(5411462): Need to assert No GC can happen here, even though 755 READ_POINTERS(literal_token, kAsReference);
824 // allocations may happen.
825 intptr_t num_flds = (literal_token.raw()->to() - literal_token.raw()->from());
826 for (intptr_t i = 0; i <= num_flds; i++) {
827 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
828 literal_token.StorePointer((literal_token.raw()->from() + i),
829 reader->PassiveObjectHandle()->raw());
830 }
831 756
832 return literal_token.raw(); 757 return literal_token.raw();
833 } 758 }
834 759
835 760
836 void RawLiteralToken::WriteTo(SnapshotWriter* writer, 761 void RawLiteralToken::WriteTo(SnapshotWriter* writer,
837 intptr_t object_id, 762 intptr_t object_id,
838 Snapshot::Kind kind) { 763 Snapshot::Kind kind) {
839 ASSERT(writer != NULL); 764 ASSERT(writer != NULL);
840 ASSERT(kind != Snapshot::kMessage); 765 ASSERT(kind != Snapshot::kMessage);
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 reader->AddBackRef(object_id, &prefix, kIsDeserialized); 1020 reader->AddBackRef(object_id, &prefix, kIsDeserialized);
1096 1021
1097 // Set all non object fields. 1022 // Set all non object fields.
1098 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, 1023 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_,
1099 reader->Read<int16_t>()); 1024 reader->Read<int16_t>());
1100 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, 1025 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_,
1101 reader->Read<bool>()); 1026 reader->Read<bool>());
1102 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); 1027 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>());
1103 1028
1104 // Set all the object fields. 1029 // Set all the object fields.
1105 // TODO(5411462): Need to assert No GC can happen here, even though 1030 READ_POINTERS(prefix, kAsReference);
1106 // allocations may happen.
1107 intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from());
1108 for (intptr_t i = 0; i <= num_flds; i++) {
1109 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1110 prefix.StorePointer((prefix.raw()->from() + i),
1111 reader->PassiveObjectHandle()->raw());
1112 }
1113 1031
1114 return prefix.raw(); 1032 return prefix.raw();
1115 } 1033 }
1116 1034
1117 1035
1118 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, 1036 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
1119 intptr_t object_id, 1037 intptr_t object_id,
1120 Snapshot::Kind kind) { 1038 Snapshot::Kind kind) {
1121 ASSERT(writer != NULL); 1039 ASSERT(writer != NULL);
1122 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1040 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 22 matching lines...) Expand all
1145 Snapshot::Kind kind) { 1063 Snapshot::Kind kind) {
1146 ASSERT(reader != NULL); 1064 ASSERT(reader != NULL);
1147 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1065 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1148 1066
1149 // Allocate Namespace object. 1067 // Allocate Namespace object.
1150 Namespace& ns = Namespace::ZoneHandle( 1068 Namespace& ns = Namespace::ZoneHandle(
1151 reader->zone(), NEW_OBJECT(Namespace)); 1069 reader->zone(), NEW_OBJECT(Namespace));
1152 reader->AddBackRef(object_id, &ns, kIsDeserialized); 1070 reader->AddBackRef(object_id, &ns, kIsDeserialized);
1153 1071
1154 // Set all the object fields. 1072 // Set all the object fields.
1155 // TODO(5411462): Need to assert No GC can happen here, even though 1073 READ_POINTERS(ns, kAsReference);
1156 // allocations may happen.
1157 intptr_t num_flds = (ns.raw()->to() - ns.raw()->from());
1158 for (intptr_t i = 0; i <= num_flds; i++) {
1159 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1160 ns.StorePointer((ns.raw()->from() + i),
1161 reader->PassiveObjectHandle()->raw());
1162 }
1163 1074
1164 return ns.raw(); 1075 return ns.raw();
1165 } 1076 }
1166 1077
1167 1078
1168 void RawNamespace::WriteTo(SnapshotWriter* writer, 1079 void RawNamespace::WriteTo(SnapshotWriter* writer,
1169 intptr_t object_id, 1080 intptr_t object_id,
1170 Snapshot::Kind kind) { 1081 Snapshot::Kind kind) {
1171 ASSERT(writer != NULL); 1082 ASSERT(writer != NULL);
1172 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1083 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1173 1084
1174 // Write out the serialization header value for this object. 1085 // Write out the serialization header value for this object.
1175 writer->WriteInlinedObjectHeader(object_id); 1086 writer->WriteInlinedObjectHeader(object_id);
1176 1087
1177 // Write out the class and tags information. 1088 // Write out the class and tags information.
1178 writer->WriteVMIsolateObject(kNamespaceCid); 1089 writer->WriteVMIsolateObject(kNamespaceCid);
1179 writer->WriteTags(writer->GetObjectTags(this)); 1090 writer->WriteTags(writer->GetObjectTags(this));
1180 1091
1181 // Write out all the object pointer fields. 1092 // Write out all the object pointer fields.
1182 SnapshotWriterVisitor visitor(writer); 1093 SnapshotWriterVisitor visitor(writer);
1183 visitor.VisitPointers(from(), to()); 1094 visitor.VisitPointers(from(), to());
1184 } 1095 }
1185 1096
1186 1097
1187 RawCode* Code::ReadFrom(SnapshotReader* reader, 1098 RawCode* Code::ReadFrom(SnapshotReader* reader,
1188 intptr_t object_id, 1099 intptr_t object_id,
1189 intptr_t tags, 1100 intptr_t tags,
1190 Snapshot::Kind kind) { 1101 Snapshot::Kind kind) {
1191 UNREACHABLE(); // Untested.
1192 ASSERT(reader->snapshot_code()); 1102 ASSERT(reader->snapshot_code());
1193 ASSERT(kind == Snapshot::kFull); 1103 ASSERT(kind == Snapshot::kFull);
1194 1104
1195 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0)); 1105 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0));
1196 reader->AddBackRef(object_id, &result, kIsDeserialized); 1106 reader->AddBackRef(object_id, &result, kIsDeserialized);
1197 1107
1198 result.set_compile_timestamp(reader->Read<int64_t>()); 1108 result.set_compile_timestamp(reader->Read<int64_t>());
1199 result.set_state_bits(reader->Read<int32_t>()); 1109 result.set_state_bits(reader->Read<int32_t>());
1200 result.set_entry_patch_pc_offset(reader->Read<int32_t>()); 1110 result.set_entry_patch_pc_offset(reader->Read<int32_t>());
1201 result.set_patch_code_pc_offset(reader->Read<int32_t>()); 1111 result.set_patch_code_pc_offset(reader->Read<int32_t>());
1202 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>()); 1112 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>());
1203 1113
1204 // Set all the object fields. 1114 // Set all the object fields.
1205 // TODO(5411462): Need to assert No GC can happen here, even though 1115 READ_POINTERS(result, kAsReference);
1206 // allocations may happen. 1116
1207 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); 1117 // TODO(rmacnak): Fix entry_point_.
1208 for (intptr_t i = 0; i <= num_flds; i++) {
1209 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1210 result.StorePointer((result.raw()->from() + i),
1211 reader->PassiveObjectHandle()->raw());
1212 }
1213 1118
1214 return result.raw(); 1119 return result.raw();
1215 } 1120 }
1216 1121
1217 1122
1218 void RawCode::WriteTo(SnapshotWriter* writer, 1123 void RawCode::WriteTo(SnapshotWriter* writer,
1219 intptr_t object_id, 1124 intptr_t object_id,
1220 Snapshot::Kind kind) { 1125 Snapshot::Kind kind) {
1221 ASSERT(writer->snapshot_code()); 1126 ASSERT(writer->snapshot_code());
1222 ASSERT(kind == Snapshot::kFull); 1127 ASSERT(kind == Snapshot::kFull);
(...skipping 22 matching lines...) Expand all
1245 // Write out all the object pointer fields. 1150 // Write out all the object pointer fields.
1246 SnapshotWriterVisitor visitor(writer); 1151 SnapshotWriterVisitor visitor(writer);
1247 visitor.VisitPointers(from(), to()); 1152 visitor.VisitPointers(from(), to());
1248 } 1153 }
1249 1154
1250 1155
1251 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, 1156 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
1252 intptr_t object_id, 1157 intptr_t object_id,
1253 intptr_t tags, 1158 intptr_t tags,
1254 Snapshot::Kind kind) { 1159 Snapshot::Kind kind) {
1255 UNREACHABLE(); // Untested.
1256 ASSERT(reader->snapshot_code()); 1160 ASSERT(reader->snapshot_code());
1257 ASSERT(kind == Snapshot::kFull); 1161 ASSERT(kind == Snapshot::kFull);
1258 1162
1259 intptr_t id = reader->Read<int32_t>(); 1163 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>());
1164 intptr_t offset = reader->Read<int32_t>();
1260 Instructions& result = 1165 Instructions& result =
1261 Instructions::ZoneHandle(reader->zone(), 1166 Instructions::ZoneHandle(reader->zone(),
1262 reader->GetInstructionsById(id)); 1167 reader->GetInstructionsAt(offset, full_tags));
1263 reader->AddBackRef(object_id, &result, kIsDeserialized); 1168 reader->AddBackRef(object_id, &result, kIsDeserialized);
1169
1170 {
1171 // TODO(rmacnak): Drop after calling convention change.
1172 Code::CheckedHandle(reader->ReadObjectImpl(kAsReference));
1173 ObjectPool::CheckedHandle(reader->ReadObjectImpl(kAsReference));
1174 }
1175
1264 return result.raw(); 1176 return result.raw();
1265 } 1177 }
1266 1178
1267 1179
1268 void RawInstructions::WriteTo(SnapshotWriter* writer, 1180 void RawInstructions::WriteTo(SnapshotWriter* writer,
1269 intptr_t object_id, 1181 intptr_t object_id,
1270 Snapshot::Kind kind) { 1182 Snapshot::Kind kind) {
1271 ASSERT(writer->snapshot_code()); 1183 ASSERT(writer->snapshot_code());
1272 ASSERT(kind == Snapshot::kFull); 1184 ASSERT(kind == Snapshot::kFull);
1273 1185
1274 { 1186 {
1275 // TODO(rmacnak): Drop after calling convention change. 1187 // TODO(rmacnak): Drop after calling convention change.
1276 writer->WriteInlinedObjectHeader(object_id); 1188 writer->WriteInlinedObjectHeader(object_id);
1277 writer->WriteVMIsolateObject(kInstructionsCid); 1189 writer->WriteVMIsolateObject(kInstructionsCid);
1278 writer->WriteTags(writer->GetObjectTags(this)); 1190 writer->WriteTags(writer->GetObjectTags(this));
1191 }
1192
1193 writer->Write<intptr_t>(writer->GetObjectTags(this)); // For sanity check.
1194
1195 // Temporarily restore the object header for writing to the text section.
1196 // TODO(asiva): Don't mutate object headers during serialization.
1197 uword object_tags = writer->GetObjectTags(this);
1198 uword snapshot_tags = ptr()->tags_;
1199 ptr()->tags_ = object_tags;
1200 writer->Write<int32_t>(writer->GetInstructionsId(this));
1201 ptr()->tags_ = snapshot_tags;
1202
1203 {
1204 // TODO(rmacnak): Drop after calling convention change.
1279 writer->WriteObjectImpl(ptr()->code_, kAsReference); 1205 writer->WriteObjectImpl(ptr()->code_, kAsReference);
1280 writer->WriteObjectImpl(ptr()->object_pool_, kAsReference); 1206 writer->WriteObjectImpl(ptr()->object_pool_, kAsReference);
1281 } 1207 }
1282
1283 writer->Write<int32_t>(writer->GetInstructionsId(this));
1284 } 1208 }
1285 1209
1286 1210
1287 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader, 1211 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader,
1288 intptr_t object_id, 1212 intptr_t object_id,
1289 intptr_t tags, 1213 intptr_t tags,
1290 Snapshot::Kind kind) { 1214 Snapshot::Kind kind) {
1291 UNREACHABLE(); // Untested.
1292 ASSERT(reader->snapshot_code()); 1215 ASSERT(reader->snapshot_code());
1293 ASSERT(kind == Snapshot::kFull); 1216 ASSERT(kind == Snapshot::kFull);
1294 1217
1295 intptr_t length = reader->Read<intptr_t>(); 1218 intptr_t length = reader->Read<intptr_t>();
1296 1219
1297 ObjectPool& result = 1220 ObjectPool& result =
1298 ObjectPool::ZoneHandle(reader->zone(), 1221 ObjectPool::ZoneHandle(reader->zone(),
1299 NEW_OBJECT_WITH_LEN(ObjectPool, length)); 1222 NEW_OBJECT_WITH_LEN(ObjectPool, length));
1300 reader->AddBackRef(object_id, &result, kIsDeserialized); 1223 reader->AddBackRef(object_id, &result, kIsDeserialized);
1301 1224
1302 RawTypedData* info_array = result.raw_ptr()->info_array_->ptr(); 1225 const TypedData& info_array =
1226 TypedData::Handle(reader->NewTypedData(kTypedDataInt8ArrayCid, length));
1227 result.set_info_array(info_array);
1303 1228
1304 // Set all the object fields. 1229 NoSafepointScope no_safepoint;
1305 // TODO(5411462): Need to assert No GC can happen here, even though
1306 // allocations may happen.
1307 for (intptr_t i = 0; i < length; i++) { 1230 for (intptr_t i = 0; i < length; i++) {
1308 ObjectPool::EntryType entry_type = 1231 ObjectPool::EntryType entry_type =
1309 static_cast<ObjectPool::EntryType>(reader->Read<uint8_t>()); 1232 static_cast<ObjectPool::EntryType>(reader->Read<int8_t>());
1310 info_array->data()[i] = entry_type; 1233 *reinterpret_cast<int8_t*>(info_array.DataAddr(i)) = entry_type;
1311 switch (entry_type) { 1234 switch (entry_type) {
1312 case ObjectPool::kTaggedObject: { 1235 case ObjectPool::kTaggedObject: {
1313 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); 1236 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1314 result.SetObjectAt(i, *(reader->PassiveObjectHandle())); 1237 result.SetObjectAt(i, *(reader->PassiveObjectHandle()));
1315 break; 1238 break;
1316 } 1239 }
1317 case ObjectPool::kImmediate: { 1240 case ObjectPool::kImmediate: {
1318 intptr_t raw_value = reader->Read<intptr_t>(); 1241 intptr_t raw_value = reader->Read<intptr_t>();
1319 result.SetRawValueAt(i, raw_value); 1242 result.SetRawValueAt(i, raw_value);
1320 break; 1243 break;
(...skipping 27 matching lines...) Expand all
1348 writer->WriteTags(writer->GetObjectTags(this)); 1271 writer->WriteTags(writer->GetObjectTags(this));
1349 1272
1350 intptr_t length = ptr()->length_; 1273 intptr_t length = ptr()->length_;
1351 RawTypedData* info_array = ptr()->info_array_->ptr(); 1274 RawTypedData* info_array = ptr()->info_array_->ptr();
1352 ASSERT(info_array != TypedData::null()); 1275 ASSERT(info_array != TypedData::null());
1353 1276
1354 writer->Write<intptr_t>(length); 1277 writer->Write<intptr_t>(length);
1355 for (intptr_t i = 0; i < length; i++) { 1278 for (intptr_t i = 0; i < length; i++) {
1356 ObjectPool::EntryType entry_type = 1279 ObjectPool::EntryType entry_type =
1357 static_cast<ObjectPool::EntryType>(info_array->data()[i]); 1280 static_cast<ObjectPool::EntryType>(info_array->data()[i]);
1358 writer->Write<uint8_t>(entry_type); 1281 writer->Write<int8_t>(entry_type);
1359 Entry& entry = ptr()->data()[i]; 1282 Entry& entry = ptr()->data()[i];
1360 switch (entry_type) { 1283 switch (entry_type) {
1361 case ObjectPool::kTaggedObject: 1284 case ObjectPool::kTaggedObject:
1362 writer->WriteObjectImpl(entry.raw_obj_, kAsReference); 1285 writer->WriteObjectImpl(entry.raw_obj_, kAsReference);
1363 break; 1286 break;
1364 case ObjectPool::kImmediate: 1287 case ObjectPool::kImmediate:
1365 writer->Write<intptr_t>(entry.raw_value_); 1288 writer->Write<intptr_t>(entry.raw_value_);
1366 break; 1289 break;
1367 case ObjectPool::kExternalLabel: 1290 case ObjectPool::kExternalLabel:
1368 // TODO(rmacnak): Write symbolically. 1291 // TODO(rmacnak): Write symbolically.
1369 writer->Write<intptr_t>(entry.raw_value_); 1292 writer->Write<intptr_t>(entry.raw_value_);
1370 break; 1293 break;
1371 default: 1294 default:
1372 UNREACHABLE(); 1295 UNREACHABLE();
1373 } 1296 }
1374 } 1297 }
1375 } 1298 }
1376 1299
1377 1300
1378 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, 1301 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader,
1379 intptr_t object_id, 1302 intptr_t object_id,
1380 intptr_t tags, 1303 intptr_t tags,
1381 Snapshot::Kind kind) { 1304 Snapshot::Kind kind) {
1382 UNREACHABLE(); // Untested.
1383 ASSERT(reader->snapshot_code()); 1305 ASSERT(reader->snapshot_code());
1306 ASSERT(kind == Snapshot::kFull);
1384 1307
1385 const int32_t length = reader->Read<int32_t>(); 1308 const int32_t length = reader->Read<int32_t>();
1386 PcDescriptors& result = PcDescriptors::ZoneHandle(reader->zone(), 1309 PcDescriptors& result =
1387 PcDescriptors::New(length)); 1310 PcDescriptors::ZoneHandle(reader->zone(),
1311 NEW_OBJECT_WITH_LEN(PcDescriptors, length));
1388 reader->AddBackRef(object_id, &result, kIsDeserialized); 1312 reader->AddBackRef(object_id, &result, kIsDeserialized);
1389 1313
1390 if (result.Length() > 0) { 1314 if (result.Length() > 0) {
1391 NoSafepointScope no_safepoint; 1315 NoSafepointScope no_safepoint;
1392 intptr_t len = result.Length(); 1316 intptr_t len = result.Length();
1393 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); 1317 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1394 reader->ReadBytes(data, len); 1318 reader->ReadBytes(data, len);
1395 } 1319 }
1396 1320
1397 return result.raw(); 1321 return result.raw();
1398 } 1322 }
1399 1323
1400 1324
1401 void RawPcDescriptors::WriteTo(SnapshotWriter* writer, 1325 void RawPcDescriptors::WriteTo(SnapshotWriter* writer,
1402 intptr_t object_id, 1326 intptr_t object_id,
1403 Snapshot::Kind kind) { 1327 Snapshot::Kind kind) {
1404 ASSERT(writer->snapshot_code()); 1328 ASSERT(writer->snapshot_code());
1329 ASSERT(kind == Snapshot::kFull);
1405 1330
1406 // Write out the serialization header value for this object. 1331 // Write out the serialization header value for this object.
1407 writer->WriteInlinedObjectHeader(object_id); 1332 writer->WriteInlinedObjectHeader(object_id);
1408 writer->WriteIndexedObject(kPcDescriptorsCid); 1333 writer->WriteIndexedObject(kPcDescriptorsCid);
1409 writer->WriteTags(writer->GetObjectTags(this)); 1334 writer->WriteTags(writer->GetObjectTags(this));
1410 writer->Write<int32_t>(ptr()->length_); 1335 writer->Write<int32_t>(ptr()->length_);
1411 if (ptr()->length_ > 0) { 1336 if (ptr()->length_ > 0) {
1412 intptr_t len = ptr()->length_; 1337 intptr_t len = ptr()->length_;
1413 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1338 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1414 writer->WriteBytes(data, len); 1339 writer->WriteBytes(data, len);
1415 } 1340 }
1416 } 1341 }
1417 1342
1418 1343
1419 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, 1344 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader,
1420 intptr_t object_id, 1345 intptr_t object_id,
1421 intptr_t tags, 1346 intptr_t tags,
1422 Snapshot::Kind kind) { 1347 Snapshot::Kind kind) {
1423 UNREACHABLE(); // Untested.
1424 ASSERT(reader->snapshot_code()); 1348 ASSERT(reader->snapshot_code());
1349 ASSERT(kind == Snapshot::kFull);
1425 1350
1426 const int32_t length = reader->Read<int32_t>(); 1351 const int32_t length = reader->Read<int32_t>();
1427 const int32_t register_bit_count = reader->Read<int32_t>();
1428 const uword pc_offset = reader->Read<uint32_t>();
1429
1430 Stackmap& result = 1352 Stackmap& result =
1431 Stackmap::ZoneHandle(reader->zone(), 1353 Stackmap::ZoneHandle(reader->zone(),
1432 Stackmap::New(length, register_bit_count, pc_offset)); 1354 reader->NewStackmap(length));
siva 2015/09/01 20:58:49 This could also be created as NEW_OBJECT_WITH_LEN
1433 reader->AddBackRef(object_id, &result, kIsDeserialized); 1355 reader->AddBackRef(object_id, &result, kIsDeserialized);
1434 1356
1435 if (result.Length() > 0) { 1357 result.SetRegisterBitCount(reader->Read<int32_t>());
1358 result.SetPcOffset(reader->Read<uint32_t>());
1359
1360 if (length > 0) {
1436 NoSafepointScope no_safepoint; 1361 NoSafepointScope no_safepoint;
1437 intptr_t len = (result.Length() + 7) / 8; 1362 intptr_t len = (result.Length() + 7) / 8;
1438 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); 1363 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1439 reader->ReadBytes(data, len); 1364 reader->ReadBytes(data, len);
1440 } 1365 }
1441 1366
1442 return result.raw(); 1367 return result.raw();
1443 } 1368 }
1444 1369
1445 1370
1446 void RawStackmap::WriteTo(SnapshotWriter* writer, 1371 void RawStackmap::WriteTo(SnapshotWriter* writer,
1447 intptr_t object_id, 1372 intptr_t object_id,
1448 Snapshot::Kind kind) { 1373 Snapshot::Kind kind) {
1449 ASSERT(writer->snapshot_code()); 1374 ASSERT(writer->snapshot_code());
1375 ASSERT(kind == Snapshot::kFull);
1450 1376
1451 // Write out the serialization header value for this object. 1377 // Write out the serialization header value for this object.
1452 writer->WriteInlinedObjectHeader(object_id); 1378 writer->WriteInlinedObjectHeader(object_id);
1453 writer->WriteIndexedObject(kStackmapCid); 1379 writer->WriteIndexedObject(kStackmapCid);
1454 writer->WriteTags(writer->GetObjectTags(this)); 1380 writer->WriteTags(writer->GetObjectTags(this));
1381
1455 writer->Write<int32_t>(ptr()->length_); 1382 writer->Write<int32_t>(ptr()->length_);
1456 writer->Write<int32_t>(ptr()->register_bit_count_); 1383 writer->Write<int32_t>(ptr()->register_bit_count_);
1457 writer->Write<uint32_t>(ptr()->pc_offset_); 1384 writer->Write<uint32_t>(ptr()->pc_offset_);
1458 if (ptr()->length_ > 0) { 1385 if (ptr()->length_ > 0) {
1459 intptr_t len = (ptr()->length_ + 7) / 8; 1386 intptr_t len = (ptr()->length_ + 7) / 8;
1460 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1387 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1461 writer->WriteBytes(data, len); 1388 writer->WriteBytes(data, len);
1462 } 1389 }
1463 } 1390 }
1464 1391
1465 1392
1466 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader, 1393 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader,
1467 intptr_t object_id, 1394 intptr_t object_id,
1468 intptr_t tags, 1395 intptr_t tags,
1469 Snapshot::Kind kind) { 1396 Snapshot::Kind kind) {
1470 UNREACHABLE(); // Untested.
1471 ASSERT(reader->snapshot_code()); 1397 ASSERT(reader->snapshot_code());
1398 ASSERT(kind == Snapshot::kFull);
1472 1399
1473 const int32_t num_entries = reader->Read<int32_t>(); 1400 const int32_t num_entries = reader->Read<int32_t>();
1474 1401
1475 LocalVarDescriptors& result = 1402 LocalVarDescriptors& result =
1476 LocalVarDescriptors::ZoneHandle(reader->zone(), 1403 LocalVarDescriptors::ZoneHandle(reader->zone(),
1477 LocalVarDescriptors::New(num_entries)); 1404 NEW_OBJECT_WITH_LEN(LocalVarDescriptors,
1405 num_entries));
1478 reader->AddBackRef(object_id, &result, kIsDeserialized); 1406 reader->AddBackRef(object_id, &result, kIsDeserialized);
1479 1407
1480 for (intptr_t i = 0; i < num_entries; i++) { 1408 for (intptr_t i = 0; i < num_entries; i++) {
1481 (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference); 1409 (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference);
siva 2015/09/01 20:58:49 The write side is writing as kAsInlinedObject and
rmacnak 2015/09/01 23:43:47 Done.
1482 result.StorePointer(result.raw()->nameAddrAt(i), 1410 result.StorePointer(result.raw()->nameAddrAt(i),
1483 reader->StringHandle()->raw()); 1411 reader->StringHandle()->raw());
1484 } 1412 }
1485 1413
1486 if (num_entries > 0) { 1414 if (num_entries > 0) {
1487 NoSafepointScope no_safepoint; 1415 NoSafepointScope no_safepoint;
1488 intptr_t len = num_entries * sizeof(RawLocalVarDescriptors::VarInfo); 1416 intptr_t len = num_entries * sizeof(RawLocalVarDescriptors::VarInfo);
1489 uint8_t* data = result.UnsafeMutableNonPointer( 1417 uint8_t* data = result.UnsafeMutableNonPointer(
1490 reinterpret_cast<const uint8_t*>(result.raw()->data())); 1418 reinterpret_cast<const uint8_t*>(result.raw()->data()));
1491 reader->ReadBytes(data, len); 1419 reader->ReadBytes(data, len);
1492 } 1420 }
1493 1421
1494 return result.raw(); 1422 return result.raw();
1495 } 1423 }
1496 1424
1497 1425
1498 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer, 1426 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer,
1499 intptr_t object_id, 1427 intptr_t object_id,
1500 Snapshot::Kind kind) { 1428 Snapshot::Kind kind) {
1501 ASSERT(writer->snapshot_code()); 1429 ASSERT(writer->snapshot_code());
1430 ASSERT(kind == Snapshot::kFull);
1502 1431
1503 // Write out the serialization header value for this object. 1432 // Write out the serialization header value for this object.
1504 writer->WriteInlinedObjectHeader(object_id); 1433 writer->WriteInlinedObjectHeader(object_id);
1505 writer->WriteIndexedObject(kLocalVarDescriptorsCid); 1434 writer->WriteIndexedObject(kLocalVarDescriptorsCid);
1506 writer->WriteTags(writer->GetObjectTags(this)); 1435 writer->WriteTags(writer->GetObjectTags(this));
1507 writer->Write<int32_t>(ptr()->num_entries_); 1436 writer->Write<int32_t>(ptr()->num_entries_);
1508 for (intptr_t i = 0; i < ptr()->num_entries_; i++) { 1437 for (intptr_t i = 0; i < ptr()->num_entries_; i++) {
1509 writer->WriteObjectImpl(ptr()->names()[i], kAsInlinedObject); 1438 writer->WriteObjectImpl(ptr()->names()[i], kAsInlinedObject);
1510 } 1439 }
1511 if (ptr()->num_entries_ > 0) { 1440 if (ptr()->num_entries_ > 0) {
1512 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo); 1441 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo);
1513 uint8_t* data = reinterpret_cast<uint8_t*>(this->data()); 1442 uint8_t* data = reinterpret_cast<uint8_t*>(this->data());
1514 writer->WriteBytes(data, len); 1443 writer->WriteBytes(data, len);
1515 } 1444 }
1516 } 1445 }
1517 1446
1518 1447
1519 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader, 1448 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader,
1520 intptr_t object_id, 1449 intptr_t object_id,
1521 intptr_t tags, 1450 intptr_t tags,
1522 Snapshot::Kind kind) { 1451 Snapshot::Kind kind) {
1523 UNREACHABLE(); // Untested.
1524 ASSERT(reader->snapshot_code()); 1452 ASSERT(reader->snapshot_code());
1453 ASSERT(kind == Snapshot::kFull);
1525 1454
1526 // handled_types_data. 1455 const int32_t num_entries = reader->Read<int32_t>();
1527 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
1528
1529 ExceptionHandlers& result = 1456 ExceptionHandlers& result =
1530 ExceptionHandlers::ZoneHandle(reader->zone(), 1457 ExceptionHandlers::ZoneHandle(reader->zone(),
1531 ExceptionHandlers::New(*reader->ArrayHandle())); 1458 NEW_OBJECT_WITH_LEN(ExceptionHandlers,
1459 num_entries));
1532 reader->AddBackRef(object_id, &result, kIsDeserialized); 1460 reader->AddBackRef(object_id, &result, kIsDeserialized);
1533 1461
1534 if (result.num_entries() > 0) { 1462 if (result.num_entries() > 0) {
1535 NoSafepointScope no_safepoint; 1463 NoSafepointScope no_safepoint;
1536 const intptr_t len = 1464 const intptr_t len =
1537 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo); 1465 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo);
1538 uint8_t* data = result.UnsafeMutableNonPointer( 1466 uint8_t* data = result.UnsafeMutableNonPointer(
1539 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data())); 1467 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data()));
1540 reader->ReadBytes(data, len); 1468 reader->ReadBytes(data, len);
1541 } 1469 }
1542 1470
1471 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
1472 result.StorePointer(&result.raw_ptr()->handled_types_data_,
1473 reader->ArrayHandle()->raw());
1474
1543 return result.raw(); 1475 return result.raw();
1544 } 1476 }
1545 1477
1546 1478
1547 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer, 1479 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer,
1548 intptr_t object_id, 1480 intptr_t object_id,
1549 Snapshot::Kind kind) { 1481 Snapshot::Kind kind) {
1550 ASSERT(writer->snapshot_code()); 1482 ASSERT(writer->snapshot_code());
1483 ASSERT(kind == Snapshot::kFull);
1551 1484
1552 // Write out the serialization header value for this object. 1485 // Write out the serialization header value for this object.
1553 writer->WriteInlinedObjectHeader(object_id); 1486 writer->WriteInlinedObjectHeader(object_id);
1554 writer->WriteIndexedObject(kExceptionHandlersCid); 1487 writer->WriteIndexedObject(kExceptionHandlersCid);
1555 writer->WriteTags(writer->GetObjectTags(this)); 1488 writer->WriteTags(writer->GetObjectTags(this));
1556 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject); 1489 writer->Write<int32_t>(ptr()->num_entries_);
1557 1490
1558 if (ptr()->num_entries_ > 0) { 1491 if (ptr()->num_entries_ > 0) {
1559 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo); 1492 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo);
1560 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1493 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1561 writer->WriteBytes(data, len); 1494 writer->WriteBytes(data, len);
1562 } 1495 }
1496
1497 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject);
1563 } 1498 }
1564 1499
1565 1500
1566 RawContext* Context::ReadFrom(SnapshotReader* reader, 1501 RawContext* Context::ReadFrom(SnapshotReader* reader,
1567 intptr_t object_id, 1502 intptr_t object_id,
1568 intptr_t tags, 1503 intptr_t tags,
1569 Snapshot::Kind kind) { 1504 Snapshot::Kind kind) {
1570 ASSERT(reader != NULL); 1505 ASSERT(reader != NULL);
1571 1506
1572 // Allocate context object. 1507 // Allocate context object.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1628 intptr_t object_id, 1563 intptr_t object_id,
1629 Snapshot::Kind kind) { 1564 Snapshot::Kind kind) {
1630 UNREACHABLE(); 1565 UNREACHABLE();
1631 } 1566 }
1632 1567
1633 1568
1634 RawICData* ICData::ReadFrom(SnapshotReader* reader, 1569 RawICData* ICData::ReadFrom(SnapshotReader* reader,
1635 intptr_t object_id, 1570 intptr_t object_id,
1636 intptr_t tags, 1571 intptr_t tags,
1637 Snapshot::Kind kind) { 1572 Snapshot::Kind kind) {
1638 UNREACHABLE(); // Untested.
1639 ASSERT(reader->snapshot_code()); 1573 ASSERT(reader->snapshot_code());
1640 ASSERT(kind == Snapshot::kFull); 1574 ASSERT(kind == Snapshot::kFull);
1641 1575
1642 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); 1576 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData));
1643 reader->AddBackRef(object_id, &result, kIsDeserialized); 1577 reader->AddBackRef(object_id, &result, kIsDeserialized);
1644 1578
1645 result.set_deopt_id(reader->Read<int32_t>()); 1579 result.set_deopt_id(reader->Read<int32_t>());
1646 result.set_state_bits(reader->Read<uint32_t>()); 1580 result.set_state_bits(reader->Read<uint32_t>());
1647 1581
1648 // Set all the object fields. 1582 // Set all the object fields.
1649 // TODO(5411462): Need to assert No GC can happen here, even though 1583 READ_POINTERS(result, kAsReference);
1650 // allocations may happen.
1651 intptr_t num_flds = (result.raw()->to() - result.raw()->from());
1652 for (intptr_t i = 0; i <= num_flds; i++) {
1653 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1654 result.StorePointer((result.raw()->from() + i),
1655 reader->PassiveObjectHandle()->raw());
1656 }
1657 1584
1658 return result.raw(); 1585 return result.raw();
1659 } 1586 }
1660 1587
1661 1588
1662 void RawICData::WriteTo(SnapshotWriter* writer, 1589 void RawICData::WriteTo(SnapshotWriter* writer,
1663 intptr_t object_id, 1590 intptr_t object_id,
1664 Snapshot::Kind kind) { 1591 Snapshot::Kind kind) {
1665 ASSERT(writer->snapshot_code()); 1592 ASSERT(writer->snapshot_code());
1666 ASSERT(kind == Snapshot::kFull); 1593 ASSERT(kind == Snapshot::kFull);
(...skipping 12 matching lines...) Expand all
1679 // Write out all the object pointer fields. 1606 // Write out all the object pointer fields.
1680 SnapshotWriterVisitor visitor(writer); 1607 SnapshotWriterVisitor visitor(writer);
1681 visitor.VisitPointers(from(), to()); 1608 visitor.VisitPointers(from(), to());
1682 } 1609 }
1683 1610
1684 1611
1685 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader, 1612 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader,
1686 intptr_t object_id, 1613 intptr_t object_id,
1687 intptr_t tags, 1614 intptr_t tags,
1688 Snapshot::Kind kind) { 1615 Snapshot::Kind kind) {
1689 UNREACHABLE(); // Untested.
1690 ASSERT(reader->snapshot_code()); 1616 ASSERT(reader->snapshot_code());
1691 ASSERT(kind == Snapshot::kFull); 1617 ASSERT(kind == Snapshot::kFull);
1692 1618
1693 MegamorphicCache& result = 1619 MegamorphicCache& result =
1694 MegamorphicCache::ZoneHandle(reader->zone(), 1620 MegamorphicCache::ZoneHandle(reader->zone(),
1695 NEW_OBJECT(MegamorphicCache)); 1621 NEW_OBJECT(MegamorphicCache));
1696 reader->AddBackRef(object_id, &result, kIsDeserialized); 1622 reader->AddBackRef(object_id, &result, kIsDeserialized);
1697 1623
1698 result.set_filled_entry_count(reader->Read<int32_t>()); 1624 result.set_filled_entry_count(reader->Read<int32_t>());
1699 1625
1700 // Set all the object fields. 1626 // Set all the object fields.
1701 // TODO(5411462): Need to assert No GC can happen here, even though 1627 READ_POINTERS(result, kAsReference);
1702 // allocations may happen.
1703 intptr_t num_flds = (result.raw()->to() - result.raw()->from());
1704 for (intptr_t i = 0; i <= num_flds; i++) {
1705 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1706 result.StorePointer((result.raw()->from() + i),
1707 reader->PassiveObjectHandle()->raw());
1708 }
1709 1628
1710 return result.raw(); 1629 return result.raw();
1711 } 1630 }
1712 1631
1713 1632
1714 void RawMegamorphicCache::WriteTo(SnapshotWriter* writer, 1633 void RawMegamorphicCache::WriteTo(SnapshotWriter* writer,
1715 intptr_t object_id, 1634 intptr_t object_id,
1716 Snapshot::Kind kind) { 1635 Snapshot::Kind kind) {
1717 ASSERT(writer->snapshot_code()); 1636 ASSERT(writer->snapshot_code());
1718 ASSERT(kind == Snapshot::kFull); 1637 ASSERT(kind == Snapshot::kFull);
(...skipping 11 matching lines...) Expand all
1730 // Write out all the object pointer fields. 1649 // Write out all the object pointer fields.
1731 SnapshotWriterVisitor visitor(writer); 1650 SnapshotWriterVisitor visitor(writer);
1732 visitor.VisitPointers(from(), to()); 1651 visitor.VisitPointers(from(), to());
1733 } 1652 }
1734 1653
1735 1654
1736 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader, 1655 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader,
1737 intptr_t object_id, 1656 intptr_t object_id,
1738 intptr_t tags, 1657 intptr_t tags,
1739 Snapshot::Kind kind) { 1658 Snapshot::Kind kind) {
1740 UNREACHABLE(); // Untested.
1741 ASSERT(reader->snapshot_code()); 1659 ASSERT(reader->snapshot_code());
1742 ASSERT(kind == Snapshot::kFull); 1660 ASSERT(kind == Snapshot::kFull);
1743 1661
1744 SubtypeTestCache& result = 1662 SubtypeTestCache& result =
1745 SubtypeTestCache::ZoneHandle(reader->zone(), 1663 SubtypeTestCache::ZoneHandle(reader->zone(),
1746 NEW_OBJECT(SubtypeTestCache)); 1664 NEW_OBJECT(SubtypeTestCache));
1747 reader->AddBackRef(object_id, &result, kIsDeserialized); 1665 reader->AddBackRef(object_id, &result, kIsDeserialized);
1748 1666
1749 // Set all the object fields. 1667 // Set all the object fields.
1750 // TODO(5411462): Need to assert No GC can happen here, even though 1668 // TODO(5411462): Need to assert No GC can happen here, even though
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 intptr_t tags, 1714 intptr_t tags,
1797 Snapshot::Kind kind) { 1715 Snapshot::Kind kind) {
1798 ASSERT(reader != NULL); 1716 ASSERT(reader != NULL);
1799 1717
1800 // Allocate ApiError object. 1718 // Allocate ApiError object.
1801 ApiError& api_error = 1719 ApiError& api_error =
1802 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError)); 1720 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError));
1803 reader->AddBackRef(object_id, &api_error, kIsDeserialized); 1721 reader->AddBackRef(object_id, &api_error, kIsDeserialized);
1804 1722
1805 // Set all the object fields. 1723 // Set all the object fields.
1806 // TODO(5411462): Need to assert No GC can happen here, even though 1724 READ_POINTERS(api_error, kAsReference);
1807 // allocations may happen.
1808 intptr_t num_flds = (api_error.raw()->to() - api_error.raw()->from());
1809 for (intptr_t i = 0; i <= num_flds; i++) {
1810 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1811 api_error.StorePointer((api_error.raw()->from() + i),
1812 reader->PassiveObjectHandle()->raw());
1813 }
1814 1725
1815 return api_error.raw(); 1726 return api_error.raw();
1816 } 1727 }
1817 1728
1818 1729
1819 void RawApiError::WriteTo(SnapshotWriter* writer, 1730 void RawApiError::WriteTo(SnapshotWriter* writer,
1820 intptr_t object_id, 1731 intptr_t object_id,
1821 Snapshot::Kind kind) { 1732 Snapshot::Kind kind) {
1822 ASSERT(writer != NULL); 1733 ASSERT(writer != NULL);
1823 1734
(...skipping 19 matching lines...) Expand all
1843 // Allocate LanguageError object. 1754 // Allocate LanguageError object.
1844 LanguageError& language_error = 1755 LanguageError& language_error =
1845 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError)); 1756 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError));
1846 reader->AddBackRef(object_id, &language_error, kIsDeserialized); 1757 reader->AddBackRef(object_id, &language_error, kIsDeserialized);
1847 1758
1848 // Set all non object fields. 1759 // Set all non object fields.
1849 language_error.set_token_pos(reader->Read<int32_t>()); 1760 language_error.set_token_pos(reader->Read<int32_t>());
1850 language_error.set_kind(reader->Read<uint8_t>()); 1761 language_error.set_kind(reader->Read<uint8_t>());
1851 1762
1852 // Set all the object fields. 1763 // Set all the object fields.
1853 // TODO(5411462): Need to assert No GC can happen here, even though 1764 READ_POINTERS(language_error, kAsReference);
1854 // allocations may happen.
1855 intptr_t num_flds =
1856 (language_error.raw()->to() - language_error.raw()->from());
1857 for (intptr_t i = 0; i <= num_flds; i++) {
1858 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1859 language_error.StorePointer((language_error.raw()->from() + i),
1860 reader->PassiveObjectHandle()->raw());
1861 }
1862 1765
1863 return language_error.raw(); 1766 return language_error.raw();
1864 } 1767 }
1865 1768
1866 1769
1867 void RawLanguageError::WriteTo(SnapshotWriter* writer, 1770 void RawLanguageError::WriteTo(SnapshotWriter* writer,
1868 intptr_t object_id, 1771 intptr_t object_id,
1869 Snapshot::Kind kind) { 1772 Snapshot::Kind kind) {
1870 ASSERT(writer != NULL); 1773 ASSERT(writer != NULL);
1871 1774
(...skipping 16 matching lines...) Expand all
1888 1791
1889 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, 1792 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader,
1890 intptr_t object_id, 1793 intptr_t object_id,
1891 intptr_t tags, 1794 intptr_t tags,
1892 Snapshot::Kind kind) { 1795 Snapshot::Kind kind) {
1893 UnhandledException& result = UnhandledException::ZoneHandle( 1796 UnhandledException& result = UnhandledException::ZoneHandle(
1894 reader->zone(), NEW_OBJECT(UnhandledException)); 1797 reader->zone(), NEW_OBJECT(UnhandledException));
1895 reader->AddBackRef(object_id, &result, kIsDeserialized); 1798 reader->AddBackRef(object_id, &result, kIsDeserialized);
1896 1799
1897 // Set all the object fields. 1800 // Set all the object fields.
1898 // TODO(5411462): Need to assert No GC can happen here, even though 1801 READ_POINTERS(result, kAsReference);
1899 // allocations may happen.
1900 intptr_t num_flds = (result.raw()->to() - result.raw()->from());
1901 for (intptr_t i = 0; i <= num_flds; i++) {
1902 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1903 result.StorePointer((result.raw()->from() + i),
1904 reader->PassiveObjectHandle()->raw());
1905 }
1906 1802
1907 return result.raw(); 1803 return result.raw();
1908 } 1804 }
1909 1805
1910 1806
1911 void RawUnhandledException::WriteTo(SnapshotWriter* writer, 1807 void RawUnhandledException::WriteTo(SnapshotWriter* writer,
1912 intptr_t object_id, 1808 intptr_t object_id,
1913 Snapshot::Kind kind) { 1809 Snapshot::Kind kind) {
1914 // Write out the serialization header value for this object. 1810 // Write out the serialization header value for this object.
1915 writer->WriteInlinedObjectHeader(object_id); 1811 writer->WriteInlinedObjectHeader(object_id);
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 intptr_t object_id, 1943 intptr_t object_id,
2048 intptr_t tags, 1944 intptr_t tags,
2049 Snapshot::Kind kind) { 1945 Snapshot::Kind kind) {
2050 ASSERT(reader != NULL); 1946 ASSERT(reader != NULL);
2051 1947
2052 // Allocate bigint object. 1948 // Allocate bigint object.
2053 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint)); 1949 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint));
2054 reader->AddBackRef(object_id, &obj, kIsDeserialized); 1950 reader->AddBackRef(object_id, &obj, kIsDeserialized);
2055 1951
2056 // Set all the object fields. 1952 // Set all the object fields.
2057 // TODO(5411462): Need to assert No GC can happen here, even though 1953 READ_POINTERS(obj, kAsInlinedObject);
2058 // allocations may happen.
2059 intptr_t num_flds = (obj.raw()->to() - obj.raw()->from());
2060 for (intptr_t i = 0; i <= num_flds; i++) {
2061 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsInlinedObject);
2062 obj.StorePointer(obj.raw()->from() + i,
2063 reader->PassiveObjectHandle()->raw());
2064 }
2065 1954
2066 // If it is a canonical constant make it one. 1955 // If it is a canonical constant make it one.
2067 // When reading a full snapshot we don't need to canonicalize the object 1956 // When reading a full snapshot we don't need to canonicalize the object
2068 // as it would already be a canonical object. 1957 // as it would already be a canonical object.
2069 // When reading a script snapshot or a message snapshot we always have 1958 // When reading a script snapshot or a message snapshot we always have
2070 // to canonicalize the object. 1959 // to canonicalize the object.
2071 if (RawObject::IsCanonical(tags)) { 1960 if (RawObject::IsCanonical(tags)) {
2072 if (kind == Snapshot::kFull) { 1961 if (kind == Snapshot::kFull) {
2073 // Set the canonical bit. 1962 // Set the canonical bit.
2074 obj.SetCanonical(); 1963 obj.SetCanonical();
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
2532 2421
2533 2422
2534 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, 2423 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader,
2535 intptr_t object_id, 2424 intptr_t object_id,
2536 intptr_t tags, 2425 intptr_t tags,
2537 Snapshot::Kind kind) { 2426 Snapshot::Kind kind) {
2538 ASSERT(reader != NULL); 2427 ASSERT(reader != NULL);
2539 2428
2540 LinkedHashMap& map = LinkedHashMap::ZoneHandle( 2429 LinkedHashMap& map = LinkedHashMap::ZoneHandle(
2541 reader->zone(), LinkedHashMap::null()); 2430 reader->zone(), LinkedHashMap::null());
2542 if (kind == Snapshot::kFull || kind == Snapshot::kScript) { 2431 if ((kind == Snapshot::kFull && !reader->snapshot_code()) ||
2432 kind == Snapshot::kScript) {
2543 // The immutable maps that seed map literals are not yet VM-internal, so 2433 // The immutable maps that seed map literals are not yet VM-internal, so
2544 // we don't reach this. 2434 // we don't reach this.
2545 UNREACHABLE(); 2435 UNREACHABLE();
2546 } else { 2436 } else {
2547 // Since the map might contain itself as a key or value, allocate first. 2437 // Since the map might contain itself as a key or value, allocate first.
2548 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); 2438 if (kind == Snapshot::kFull) {
2439 map = reader->NewLinkedHashMap();
2440 } else {
2441 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind));
2442 }
2549 } 2443 }
2550 reader->AddBackRef(object_id, &map, kIsDeserialized); 2444 reader->AddBackRef(object_id, &map, kIsDeserialized);
2551 2445
2552 // Read the type arguments. 2446 // Read the type arguments.
2553 const intptr_t typeargs_offset = 2447 const intptr_t typeargs_offset =
2554 GrowableObjectArray::type_arguments_offset() / kWordSize; 2448 GrowableObjectArray::type_arguments_offset() / kWordSize;
2555 *reader->TypeArgumentsHandle() ^= 2449 *reader->TypeArgumentsHandle() ^=
2556 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); 2450 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
2557 map.SetTypeArguments(*reader->TypeArgumentsHandle()); 2451 map.SetTypeArguments(*reader->TypeArgumentsHandle());
2558 2452
2559 // Read the number of key/value pairs. 2453 // Read the number of key/value pairs.
2560 intptr_t len = reader->ReadSmiValue(); 2454 intptr_t len = reader->ReadSmiValue();
2561 intptr_t used_data = (len << 1); 2455 intptr_t used_data = (len << 1);
2562 map.SetUsedData(used_data); 2456 map.SetUsedData(used_data);
2563 2457
2564 // Allocate the data array. 2458 // Allocate the data array.
2565 intptr_t data_size = Utils::Maximum( 2459 intptr_t data_size = Utils::Maximum(
2566 Utils::RoundUpToPowerOfTwo(used_data), 2460 Utils::RoundUpToPowerOfTwo(used_data),
2567 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); 2461 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
2568 Array& data = Array::ZoneHandle(reader->zone(), 2462 Array& data = Array::ZoneHandle(reader->zone(),
2569 Array::New(data_size, HEAP_SPACE(kind))); 2463 NEW_OBJECT_WITH_LEN_SPACE(Array,
2464 data_size,
2465 kind));
2570 map.SetData(data); 2466 map.SetData(data);
2571 map.SetDeletedKeys(0); 2467 map.SetDeletedKeys(0);
2572 2468
2573 // The index and hashMask is regenerated by the maps themselves on demand. 2469 // The index and hashMask is regenerated by the maps themselves on demand.
2574 // Thus, the index will probably be allocated in new space (unless it's huge). 2470 // Thus, the index will probably be allocated in new space (unless it's huge).
2575 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and 2471 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and
2576 // in particular, if/when (const) maps are needed in the VM isolate snapshot. 2472 // in particular, if/when (const) maps are needed in the VM isolate snapshot.
2577 ASSERT(reader->isolate() != Dart::vm_isolate()); 2473 ASSERT(reader->isolate() != Dart::vm_isolate());
2578 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. 2474 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback.
2579 2475
2580 // Read the keys and values. 2476 // Read the keys and values.
2581 bool as_reference = RawObject::IsCanonical(tags) ? false : true; 2477 bool as_reference = RawObject::IsCanonical(tags) ? false : true;
2582 for (intptr_t i = 0; i < used_data; i++) { 2478 for (intptr_t i = 0; i < used_data; i++) {
2583 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference); 2479 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference);
2584 data.SetAt(i, *reader->PassiveObjectHandle()); 2480 data.SetAt(i, *reader->PassiveObjectHandle());
2585 } 2481 }
2586 return map.raw(); 2482 return map.raw();
2587 } 2483 }
2588 2484
2589 2485
2590 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, 2486 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer,
2591 intptr_t object_id, 2487 intptr_t object_id,
2592 Snapshot::Kind kind) { 2488 Snapshot::Kind kind) {
2593 if (kind == Snapshot::kFull || kind == Snapshot::kScript) { 2489 if ((kind == Snapshot::kFull && !writer->snapshot_code()) ||
2490 kind == Snapshot::kScript) {
2594 // The immutable maps that seed map literals are not yet VM-internal, so 2491 // The immutable maps that seed map literals are not yet VM-internal, so
2595 // we don't reach this. 2492 // we don't reach this.
2596 UNREACHABLE();
2597 } 2493 }
2598 ASSERT(writer != NULL); 2494 ASSERT(writer != NULL);
2599 2495
2600 // Write out the serialization header value for this object. 2496 // Write out the serialization header value for this object.
2601 writer->WriteInlinedObjectHeader(object_id); 2497 writer->WriteInlinedObjectHeader(object_id);
2602 2498
2603 // Write out the class and tags information. 2499 // Write out the class and tags information.
2604 writer->WriteIndexedObject(kLinkedHashMapCid); 2500 writer->WriteIndexedObject(kLinkedHashMapCid);
2605 const uword tags = writer->GetObjectTags(this); 2501 const uword tags = writer->GetObjectTags(this);
2606 writer->WriteTags(tags); 2502 writer->WriteTags(tags);
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
3032 } else { 2928 } else {
3033 UNREACHABLE(); 2929 UNREACHABLE();
3034 } 2930 }
3035 } 2931 }
3036 2932
3037 2933
3038 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader, 2934 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader,
3039 intptr_t object_id, 2935 intptr_t object_id,
3040 intptr_t tags, 2936 intptr_t tags,
3041 Snapshot::Kind kind) { 2937 Snapshot::Kind kind) {
2938 ASSERT(kind == Snapshot::kMessage || reader->snapshot_code());
2939
3042 uint64_t id = reader->Read<uint64_t>(); 2940 uint64_t id = reader->Read<uint64_t>();
3043 uint64_t origin_id = reader->Read<uint64_t>(); 2941 uint64_t origin_id = reader->Read<uint64_t>();
3044 2942
3045 SendPort& result = SendPort::ZoneHandle(reader->zone(), 2943 SendPort& result = SendPort::ZoneHandle(reader->zone());
3046 SendPort::New(id, origin_id)); 2944 if (reader->snapshot_code()) {
2945 // TODO(rmacnak): Reset fields in precompiled snapshots and assert
2946 // this is unreachable.
2947 } else {
2948 result = SendPort::New(id, origin_id);
2949 }
3047 reader->AddBackRef(object_id, &result, kIsDeserialized); 2950 reader->AddBackRef(object_id, &result, kIsDeserialized);
3048 return result.raw(); 2951 return result.raw();
3049 } 2952 }
3050 2953
3051 2954
3052 void RawSendPort::WriteTo(SnapshotWriter* writer, 2955 void RawSendPort::WriteTo(SnapshotWriter* writer,
3053 intptr_t object_id, 2956 intptr_t object_id,
3054 Snapshot::Kind kind) { 2957 Snapshot::Kind kind) {
3055 // Write out the serialization header value for this object. 2958 // Write out the serialization header value for this object.
3056 writer->WriteInlinedObjectHeader(object_id); 2959 writer->WriteInlinedObjectHeader(object_id);
3057 2960
3058 // Write out the class and tags information. 2961 // Write out the class and tags information.
3059 writer->WriteIndexedObject(kSendPortCid); 2962 writer->WriteIndexedObject(kSendPortCid);
3060 writer->WriteTags(writer->GetObjectTags(this)); 2963 writer->WriteTags(writer->GetObjectTags(this));
3061 2964
3062 writer->Write<uint64_t>(ptr()->id_); 2965 writer->Write<uint64_t>(ptr()->id_);
3063 writer->Write<uint64_t>(ptr()->origin_id_); 2966 writer->Write<uint64_t>(ptr()->origin_id_);
3064 } 2967 }
3065 2968
3066 2969
3067 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader, 2970 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader,
3068 intptr_t object_id, 2971 intptr_t object_id,
3069 intptr_t tags, 2972 intptr_t tags,
3070 Snapshot::Kind kind) { 2973 Snapshot::Kind kind) {
3071 if (kind == Snapshot::kFull) { 2974 if (kind == Snapshot::kFull) {
3072 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(), 2975 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(),
3073 reader->NewStacktrace()); 2976 reader->NewStacktrace());
3074 reader->AddBackRef(object_id, &result, kIsDeserialized); 2977 reader->AddBackRef(object_id, &result, kIsDeserialized);
3075 2978
3076 // Set all the object fields.
3077 // TODO(5411462): Need to assert No GC can happen here, even though
3078 // allocations may happen.
3079 intptr_t num_flds = (result.raw()->to() - result.raw()->from());
3080 for (intptr_t i = 0; i <= num_flds; i++) {
3081 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
3082 result.StorePointer((result.raw()->from() + i),
3083 reader->PassiveObjectHandle()->raw());
3084 }
3085
3086 bool expand_inlined = reader->Read<bool>(); 2979 bool expand_inlined = reader->Read<bool>();
3087 result.set_expand_inlined(expand_inlined); 2980 result.set_expand_inlined(expand_inlined);
3088 2981
2982 // Set all the object fields.
2983 READ_POINTERS(result, kAsReference);
2984
3089 return result.raw(); 2985 return result.raw();
3090 } 2986 }
3091 UNREACHABLE(); // Stacktraces are not sent in a snapshot. 2987 UNREACHABLE(); // Stacktraces are not sent in a snapshot.
3092 return Stacktrace::null(); 2988 return Stacktrace::null();
3093 } 2989 }
3094 2990
3095 2991
3096 void RawStacktrace::WriteTo(SnapshotWriter* writer, 2992 void RawStacktrace::WriteTo(SnapshotWriter* writer,
3097 intptr_t object_id, 2993 intptr_t object_id,
3098 Snapshot::Kind kind) { 2994 Snapshot::Kind kind) {
3099 if (kind == Snapshot::kFull) { 2995 if (kind == Snapshot::kFull) {
3100 ASSERT(writer != NULL); 2996 ASSERT(writer != NULL);
3101 ASSERT(this == Isolate::Current()->object_store()-> 2997 ASSERT(this == Isolate::Current()->object_store()->
3102 preallocated_stack_trace()); 2998 preallocated_stack_trace());
3103 2999
3104 // Write out the serialization header value for this object. 3000 // Write out the serialization header value for this object.
3105 writer->WriteInlinedObjectHeader(object_id); 3001 writer->WriteInlinedObjectHeader(object_id);
3106 3002
3107 // Write out the class and tags information. 3003 // Write out the class and tags information.
3108 writer->WriteIndexedObject(kStacktraceCid); 3004 writer->WriteIndexedObject(kStacktraceCid);
3109 writer->WriteTags(writer->GetObjectTags(this)); 3005 writer->WriteTags(writer->GetObjectTags(this));
3110 3006
3007 writer->Write(ptr()->expand_inlined_);
3008
3111 // Write out all the object pointer fields. 3009 // Write out all the object pointer fields.
3112 SnapshotWriterVisitor visitor(writer); 3010 SnapshotWriterVisitor visitor(writer);
3113 visitor.VisitPointers(from(), to()); 3011 visitor.VisitPointers(from(), to());
3114
3115 writer->Write(ptr()->expand_inlined_);
3116 } else { 3012 } else {
3117 // Stacktraces are not allowed in other snapshot forms. 3013 // Stacktraces are not allowed in other snapshot forms.
3118 writer->SetWriteException(Exceptions::kArgument, 3014 writer->SetWriteException(Exceptions::kArgument,
3119 "Illegal argument in isolate message" 3015 "Illegal argument in isolate message"
3120 " : (object is a stacktrace)"); 3016 " : (object is a stacktrace)");
3121 } 3017 }
3122 } 3018 }
3123 3019
3124 3020
3125 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader, 3021 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 intptr_t tags, 3071 intptr_t tags,
3176 Snapshot::Kind kind) { 3072 Snapshot::Kind kind) {
3177 ASSERT(reader != NULL); 3073 ASSERT(reader != NULL);
3178 3074
3179 // Allocate the weak property object. 3075 // Allocate the weak property object.
3180 WeakProperty& weak_property = WeakProperty::ZoneHandle( 3076 WeakProperty& weak_property = WeakProperty::ZoneHandle(
3181 reader->zone(), WeakProperty::New(HEAP_SPACE(kind))); 3077 reader->zone(), WeakProperty::New(HEAP_SPACE(kind)));
3182 reader->AddBackRef(object_id, &weak_property, kIsDeserialized); 3078 reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
3183 3079
3184 // Set all the object fields. 3080 // Set all the object fields.
3185 // TODO(5411462): Need to assert No GC can happen here, even though 3081 READ_POINTERS(weak_property, kAsReference);
3186 // allocations may happen.
3187 intptr_t num_flds = (weak_property.raw()->to() -
3188 weak_property.raw()->from());
3189 for (intptr_t i = 0; i <= num_flds; i++) {
3190 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
3191 weak_property.StorePointer((weak_property.raw()->from() + i),
3192 reader->PassiveObjectHandle()->raw());
3193 }
3194 3082
3195 return weak_property.raw(); 3083 return weak_property.raw();
3196 } 3084 }
3197 3085
3198 3086
3199 void RawWeakProperty::WriteTo(SnapshotWriter* writer, 3087 void RawWeakProperty::WriteTo(SnapshotWriter* writer,
3200 intptr_t object_id, 3088 intptr_t object_id,
3201 Snapshot::Kind kind) { 3089 Snapshot::Kind kind) {
3202 ASSERT(writer != NULL); 3090 ASSERT(writer != NULL);
3203 3091
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3253 // We do not allow objects with native fields in an isolate message. 3141 // We do not allow objects with native fields in an isolate message.
3254 writer->SetWriteException(Exceptions::kArgument, 3142 writer->SetWriteException(Exceptions::kArgument,
3255 "Illegal argument in isolate message" 3143 "Illegal argument in isolate message"
3256 " : (object is a UserTag)"); 3144 " : (object is a UserTag)");
3257 } else { 3145 } else {
3258 UNREACHABLE(); 3146 UNREACHABLE();
3259 } 3147 }
3260 } 3148 }
3261 3149
3262 } // namespace dart 3150 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698