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

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: 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
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.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/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 DECLARE_FLAG(int, optimization_counter_threshold); 14 DECLARE_FLAG(int, optimization_counter_threshold);
15 15
16 #define NEW_OBJECT(type) \ 16 #define NEW_OBJECT(type) \
17 ((kind == Snapshot::kFull) ? reader->New##type() : type::New()) 17 ((kind == Snapshot::kFull) ? reader->New##type() : type::New())
18 18
19 #define NEW_OBJECT_WITH_LEN(type, len) \ 19 #define NEW_OBJECT_WITH_LEN(type, len) \
20 ((kind == Snapshot::kFull) ? reader->New##type(len) : type::New(len)) 20 ((kind == Snapshot::kFull) ? reader->New##type(len) : type::New(len))
21 21
22 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \ 22 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \
23 ((kind == Snapshot::kFull) ? \ 23 ((kind == Snapshot::kFull) ? \
24 reader->New##type(len) : type::New(len, HEAP_SPACE(kind))) 24 reader->New##type(len) : type::New(len, HEAP_SPACE(kind)))
25 25
26 #define OFFSET_OF_FROM(obj) \ 26 #define OFFSET_OF_FROM(obj) \
27 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr()) 27 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr())
28 28
29 // TODO(18854): Need to assert No GC can happen here, even though
30 // allocations may happen.
31 #define READ_OBJECT_FIELDS(object, from, to, as_reference) \
32 intptr_t num_flds = (to) - (from); \
33 intptr_t from_offset = OFFSET_OF_FROM(object); \
34 for (intptr_t i = 0; i <= num_flds; i++) { \
35 (*reader->PassiveObjectHandle()) = \
36 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \
37 object.StorePointer(((from) + i), \
38 reader->PassiveObjectHandle()->raw()); \
39 }
40
29 RawClass* Class::ReadFrom(SnapshotReader* reader, 41 RawClass* Class::ReadFrom(SnapshotReader* reader,
30 intptr_t object_id, 42 intptr_t object_id,
31 intptr_t tags, 43 intptr_t tags,
32 Snapshot::Kind kind) { 44 Snapshot::Kind kind) {
33 ASSERT(reader != NULL); 45 ASSERT(reader != NULL);
34 46
35 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); 47 Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
36 bool is_in_fullsnapshot = reader->Read<bool>(); 48 bool is_in_fullsnapshot = reader->Read<bool>();
37 if ((kind == Snapshot::kFull) || 49 if ((kind == Snapshot::kFull) ||
38 (kind == Snapshot::kScript && !is_in_fullsnapshot)) { 50 (kind == Snapshot::kScript && !is_in_fullsnapshot)) {
(...skipping 20 matching lines...) Expand all
59 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); 71 cls.set_next_field_offset_in_words(reader->Read<int32_t>());
60 } 72 }
61 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); 73 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>());
62 cls.set_num_type_arguments(reader->Read<int16_t>()); 74 cls.set_num_type_arguments(reader->Read<int16_t>());
63 cls.set_num_own_type_arguments(reader->Read<int16_t>()); 75 cls.set_num_own_type_arguments(reader->Read<int16_t>());
64 cls.set_num_native_fields(reader->Read<uint16_t>()); 76 cls.set_num_native_fields(reader->Read<uint16_t>());
65 cls.set_token_pos(reader->Read<int32_t>()); 77 cls.set_token_pos(reader->Read<int32_t>());
66 cls.set_state_bits(reader->Read<uint16_t>()); 78 cls.set_state_bits(reader->Read<uint16_t>());
67 79
68 // Set all the object fields. 80 // Set all the object fields.
69 // TODO(5411462): Need to assert No GC can happen here, even though 81 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference);
70 // allocations may happen. 82
71 intptr_t num_flds = (cls.raw()->to() - cls.raw()->from());
72 intptr_t from_offset = OFFSET_OF_FROM(cls);
73 for (intptr_t i = 0; i <= num_flds; i++) {
74 (*reader->PassiveObjectHandle()) =
75 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
76 cls.StorePointer((cls.raw()->from() + i),
77 reader->PassiveObjectHandle()->raw());
78 }
79 ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull)); 83 ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull));
80 } else { 84 } else {
81 cls ^= reader->ReadClassId(object_id); 85 cls ^= reader->ReadClassId(object_id);
82 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); 86 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot());
83 } 87 }
84 return cls.raw(); 88 return cls.raw();
85 } 89 }
86 90
87 91
88 void RawClass::WriteTo(SnapshotWriter* writer, 92 void RawClass::WriteTo(SnapshotWriter* writer,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 152
149 // Allocate unresolved class object. 153 // Allocate unresolved class object.
150 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( 154 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle(
151 reader->zone(), NEW_OBJECT(UnresolvedClass)); 155 reader->zone(), NEW_OBJECT(UnresolvedClass));
152 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); 156 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
153 157
154 // Set all non object fields. 158 // Set all non object fields.
155 unresolved_class.set_token_pos(reader->Read<int32_t>()); 159 unresolved_class.set_token_pos(reader->Read<int32_t>());
156 160
157 // Set all the object fields. 161 // Set all the object fields.
158 // TODO(5411462): Need to assert No GC can happen here, even though 162 READ_OBJECT_FIELDS(unresolved_class,
159 // allocations may happen. 163 unresolved_class.raw()->from(),
160 intptr_t num_flds = (unresolved_class.raw()->to() - 164 unresolved_class.raw()->to(),
161 unresolved_class.raw()->from()); 165 kAsReference);
162 for (intptr_t i = 0; i <= num_flds; i++) { 166
163 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
164 unresolved_class.StorePointer((unresolved_class.raw()->from() + i),
165 reader->PassiveObjectHandle()->raw());
166 }
167 return unresolved_class.raw(); 167 return unresolved_class.raw();
168 } 168 }
169 169
170 170
171 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, 171 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer,
172 intptr_t object_id, 172 intptr_t object_id,
173 Snapshot::Kind kind) { 173 Snapshot::Kind kind) {
174 ASSERT(writer != NULL); 174 ASSERT(writer != NULL);
175 175
176 // Write out the serialization header value for this object. 176 // Write out the serialization header value for this object.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 bool is_canonical = RawObject::IsCanonical(tags); 219 bool is_canonical = RawObject::IsCanonical(tags);
220 bool defer_canonicalization = is_canonical && 220 bool defer_canonicalization = is_canonical &&
221 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot); 221 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot);
222 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); 222 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization);
223 223
224 // Set all non object fields. 224 // Set all non object fields.
225 type.set_token_pos(reader->Read<int32_t>()); 225 type.set_token_pos(reader->Read<int32_t>());
226 type.set_type_state(reader->Read<int8_t>()); 226 type.set_type_state(reader->Read<int8_t>());
227 227
228 // Set all the object fields. 228 // Set all the object fields.
229 // TODO(5411462): Need to assert No GC can happen here, even though 229 READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), kAsReference);
230 // allocations may happen.
231 intptr_t num_flds = (type.raw()->to() - type.raw()->from());
232 intptr_t from_offset = OFFSET_OF_FROM(type);
233 for (intptr_t i = 0; i <= num_flds; i++) {
234 (*reader->PassiveObjectHandle()) =
235 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
236 type.StorePointer((type.raw()->from() + i),
237 reader->PassiveObjectHandle()->raw());
238 }
239 230
240 // Set the canonical bit. 231 // Set the canonical bit.
241 if (!defer_canonicalization && RawObject::IsCanonical(tags)) { 232 if (!defer_canonicalization && RawObject::IsCanonical(tags)) {
242 type.SetCanonical(); 233 type.SetCanonical();
243 } 234 }
244 235
245 return type.raw(); 236 return type.raw();
246 } 237 }
247 238
248 239
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 intptr_t tags, 280 intptr_t tags,
290 Snapshot::Kind kind) { 281 Snapshot::Kind kind) {
291 ASSERT(reader != NULL); 282 ASSERT(reader != NULL);
292 283
293 // Allocate type ref object. 284 // Allocate type ref object.
294 TypeRef& type_ref = TypeRef::ZoneHandle( 285 TypeRef& type_ref = TypeRef::ZoneHandle(
295 reader->zone(), NEW_OBJECT(TypeRef)); 286 reader->zone(), NEW_OBJECT(TypeRef));
296 reader->AddBackRef(object_id, &type_ref, kIsDeserialized); 287 reader->AddBackRef(object_id, &type_ref, kIsDeserialized);
297 288
298 // Set all the object fields. 289 // Set all the object fields.
299 // TODO(5411462): Need to assert No GC can happen here, even though 290 READ_OBJECT_FIELDS(type_ref,
300 // allocations may happen. 291 type_ref.raw()->from(), type_ref.raw()->to(),
301 intptr_t num_flds = (type_ref.raw()->to() - type_ref.raw()->from()); 292 kAsReference);
302 intptr_t from_offset = OFFSET_OF_FROM(type_ref);
303 for (intptr_t i = 0; i <= num_flds; i++) {
304 (*reader->PassiveObjectHandle()) =
305 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
306 type_ref.StorePointer((type_ref.raw()->from() + i),
307 reader->PassiveObjectHandle()->raw());
308 }
309 293
310 return type_ref.raw(); 294 return type_ref.raw();
311 } 295 }
312 296
313 297
314 void RawTypeRef::WriteTo(SnapshotWriter* writer, 298 void RawTypeRef::WriteTo(SnapshotWriter* writer,
315 intptr_t object_id, 299 intptr_t object_id,
316 Snapshot::Kind kind) { 300 Snapshot::Kind kind) {
317 ASSERT(writer != NULL); 301 ASSERT(writer != NULL);
318 302
(...skipping 20 matching lines...) Expand all
339 TypeParameter& type_parameter = TypeParameter::ZoneHandle( 323 TypeParameter& type_parameter = TypeParameter::ZoneHandle(
340 reader->zone(), NEW_OBJECT(TypeParameter)); 324 reader->zone(), NEW_OBJECT(TypeParameter));
341 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); 325 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
342 326
343 // Set all non object fields. 327 // Set all non object fields.
344 type_parameter.set_token_pos(reader->Read<int32_t>()); 328 type_parameter.set_token_pos(reader->Read<int32_t>());
345 type_parameter.set_index(reader->Read<int16_t>()); 329 type_parameter.set_index(reader->Read<int16_t>());
346 type_parameter.set_type_state(reader->Read<int8_t>()); 330 type_parameter.set_type_state(reader->Read<int8_t>());
347 331
348 // Set all the object fields. 332 // Set all the object fields.
349 // TODO(5411462): Need to assert No GC can happen here, even though 333 READ_OBJECT_FIELDS(type_parameter,
350 // allocations may happen. 334 type_parameter.raw()->from(), type_parameter.raw()->to(),
351 intptr_t num_flds = (type_parameter.raw()->to() - 335 kAsReference);
352 type_parameter.raw()->from());
353 intptr_t from_offset = OFFSET_OF_FROM(type_parameter);
354 for (intptr_t i = 0; i <= num_flds; i++) {
355 (*reader->PassiveObjectHandle()) =
356 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
357 type_parameter.StorePointer((type_parameter.raw()->from() + i),
358 reader->PassiveObjectHandle()->raw());
359 }
360 336
361 return type_parameter.raw(); 337 return type_parameter.raw();
362 } 338 }
363 339
364 340
365 void RawTypeParameter::WriteTo(SnapshotWriter* writer, 341 void RawTypeParameter::WriteTo(SnapshotWriter* writer,
366 intptr_t object_id, 342 intptr_t object_id,
367 Snapshot::Kind kind) { 343 Snapshot::Kind kind) {
368 ASSERT(writer != NULL); 344 ASSERT(writer != NULL);
369 345
(...skipping 23 matching lines...) Expand all
393 intptr_t tags, 369 intptr_t tags,
394 Snapshot::Kind kind) { 370 Snapshot::Kind kind) {
395 ASSERT(reader != NULL); 371 ASSERT(reader != NULL);
396 372
397 // Allocate bounded type object. 373 // Allocate bounded type object.
398 BoundedType& bounded_type = BoundedType::ZoneHandle( 374 BoundedType& bounded_type = BoundedType::ZoneHandle(
399 reader->zone(), NEW_OBJECT(BoundedType)); 375 reader->zone(), NEW_OBJECT(BoundedType));
400 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized); 376 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
401 377
402 // Set all the object fields. 378 // Set all the object fields.
403 // TODO(5411462): Need to assert No GC can happen here, even though 379 READ_OBJECT_FIELDS(bounded_type,
404 // allocations may happen. 380 bounded_type.raw()->from(), bounded_type.raw()->to(),
405 intptr_t num_flds = (bounded_type.raw()->to() - 381 kAsReference);
406 bounded_type.raw()->from());
407 intptr_t from_offset = OFFSET_OF_FROM(bounded_type);
408 for (intptr_t i = 0; i <= num_flds; i++) {
409 (*reader->PassiveObjectHandle()) =
410 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
411 bounded_type.StorePointer((bounded_type.raw()->from() + i),
412 reader->PassiveObjectHandle()->raw());
413 }
414 382
415 return bounded_type.raw(); 383 return bounded_type.raw();
416 } 384 }
417 385
418 386
419 void RawBoundedType::WriteTo(SnapshotWriter* writer, 387 void RawBoundedType::WriteTo(SnapshotWriter* writer,
420 intptr_t object_id, 388 intptr_t object_id,
421 Snapshot::Kind kind) { 389 Snapshot::Kind kind) {
422 ASSERT(writer != NULL); 390 ASSERT(writer != NULL);
423 391
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 intptr_t tags, 495 intptr_t tags,
528 Snapshot::Kind kind) { 496 Snapshot::Kind kind) {
529 ASSERT(reader != NULL); 497 ASSERT(reader != NULL);
530 498
531 // Allocate function object. 499 // Allocate function object.
532 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), 500 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(),
533 NEW_OBJECT(PatchClass)); 501 NEW_OBJECT(PatchClass));
534 reader->AddBackRef(object_id, &cls, kIsDeserialized); 502 reader->AddBackRef(object_id, &cls, kIsDeserialized);
535 503
536 // Set all the object fields. 504 // Set all the object fields.
537 // TODO(5411462): Need to assert No GC can happen here, even though 505 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference);
538 // allocations may happen. 506
539 intptr_t num_flds = (cls.raw()->to() - cls.raw()->from());
540 for (intptr_t i = 0; i <= num_flds; i++) {
541 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
542 cls.StorePointer((cls.raw()->from() + i),
543 reader->PassiveObjectHandle()->raw());
544 }
545 ASSERT(((kind == Snapshot::kScript) && 507 ASSERT(((kind == Snapshot::kScript) &&
546 !Class::IsInFullSnapshot(cls.source_class())) || 508 !Class::IsInFullSnapshot(cls.source_class())) ||
547 (kind == Snapshot::kFull)); 509 (kind == Snapshot::kFull));
548 510
549 return cls.raw(); 511 return cls.raw();
550 } 512 }
551 513
552 514
553 void RawPatchClass::WriteTo(SnapshotWriter* writer, 515 void RawPatchClass::WriteTo(SnapshotWriter* writer,
554 intptr_t object_id, 516 intptr_t object_id,
(...skipping 19 matching lines...) Expand all
574 Snapshot::Kind kind) { 536 Snapshot::Kind kind) {
575 ASSERT(reader != NULL); 537 ASSERT(reader != NULL);
576 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 538 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
577 539
578 // Allocate closure data object. 540 // Allocate closure data object.
579 ClosureData& data = ClosureData::ZoneHandle( 541 ClosureData& data = ClosureData::ZoneHandle(
580 reader->zone(), NEW_OBJECT(ClosureData)); 542 reader->zone(), NEW_OBJECT(ClosureData));
581 reader->AddBackRef(object_id, &data, kIsDeserialized); 543 reader->AddBackRef(object_id, &data, kIsDeserialized);
582 544
583 // Set all the object fields. 545 // Set all the object fields.
584 // TODO(5411462): Need to assert No GC can happen here, even though 546 READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference);
585 // allocations may happen.
586 intptr_t num_flds = (data.raw()->to() - data.raw()->from());
587 for (intptr_t i = 0; i <= num_flds; i++) {
588 *(data.raw()->from() + i) = reader->ReadObjectImpl(kAsReference);
589 }
590 547
591 return data.raw(); 548 return data.raw();
592 } 549 }
593 550
594 551
595 void RawClosureData::WriteTo(SnapshotWriter* writer, 552 void RawClosureData::WriteTo(SnapshotWriter* writer,
596 intptr_t object_id, 553 intptr_t object_id,
597 Snapshot::Kind kind) { 554 Snapshot::Kind kind) {
598 ASSERT(writer != NULL); 555 ASSERT(writer != NULL);
599 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 556 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 10 matching lines...) Expand all
610 writer->WriteVMIsolateObject(kEmptyContextScopeObject); 567 writer->WriteVMIsolateObject(kEmptyContextScopeObject);
611 } else { 568 } else {
612 if (ptr()->context_scope_->ptr()->is_implicit_) { 569 if (ptr()->context_scope_->ptr()->is_implicit_) {
613 writer->WriteObjectImpl(ptr()->context_scope_, kAsInlinedObject); 570 writer->WriteObjectImpl(ptr()->context_scope_, kAsInlinedObject);
614 } else { 571 } else {
615 // We don't write non implicit context scopes in the snapshot. 572 // We don't write non implicit context scopes in the snapshot.
616 writer->WriteVMIsolateObject(kNullObject); 573 writer->WriteVMIsolateObject(kNullObject);
617 } 574 }
618 } 575 }
619 576
620 writer->WriteObjectImpl(Object::null(), kAsInlinedObject);
621
622 // Parent function. 577 // Parent function.
623 writer->WriteObjectImpl(ptr()->parent_function_, kAsInlinedObject); 578 writer->WriteObjectImpl(ptr()->parent_function_, kAsInlinedObject);
624 579
625 // Signature class. 580 // Signature class.
626 writer->WriteObjectImpl(ptr()->signature_class_, kAsInlinedObject); 581 writer->WriteObjectImpl(ptr()->signature_class_, kAsInlinedObject);
627 582
628 // Static closure/Closure allocation stub. 583 // Static closure/Closure allocation stub.
629 // We don't write the closure or allocation stub in the snapshot. 584 // We don't write the closure or allocation stub in the snapshot.
630 writer->WriteVMIsolateObject(kNullObject); 585 writer->WriteVMIsolateObject(kNullObject);
631 } 586 }
632 587
633 588
634 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader, 589 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
635 intptr_t object_id, 590 intptr_t object_id,
636 intptr_t tags, 591 intptr_t tags,
637 Snapshot::Kind kind) { 592 Snapshot::Kind kind) {
638 ASSERT(reader != NULL); 593 ASSERT(reader != NULL);
639 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 594 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
640 595
641 // Allocate redirection data object. 596 // Allocate redirection data object.
642 RedirectionData& data = RedirectionData::ZoneHandle( 597 RedirectionData& data = RedirectionData::ZoneHandle(
643 reader->zone(), NEW_OBJECT(RedirectionData)); 598 reader->zone(), NEW_OBJECT(RedirectionData));
644 reader->AddBackRef(object_id, &data, kIsDeserialized); 599 reader->AddBackRef(object_id, &data, kIsDeserialized);
645 600
646 // Set all the object fields. 601 // Set all the object fields.
647 // TODO(5411462): Need to assert No GC can happen here, even though 602 READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(), kAsReference);
648 // allocations may happen.
649 intptr_t num_flds = (data.raw()->to() - data.raw()->from());
650 intptr_t from_offset = OFFSET_OF_FROM(data);
651 for (intptr_t i = 0; i <= num_flds; i++) {
652 (*reader->PassiveObjectHandle()) =
653 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
654 data.StorePointer((data.raw()->from() + i),
655 reader->PassiveObjectHandle()->raw());
656 }
657 603
658 return data.raw(); 604 return data.raw();
659 } 605 }
660 606
661 607
662 void RawRedirectionData::WriteTo(SnapshotWriter* writer, 608 void RawRedirectionData::WriteTo(SnapshotWriter* writer,
663 intptr_t object_id, 609 intptr_t object_id,
664 Snapshot::Kind kind) { 610 Snapshot::Kind kind) {
665 ASSERT(writer != NULL); 611 ASSERT(writer != NULL);
666 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 612 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 28 matching lines...) Expand all
695 func.set_end_token_pos(reader->Read<int32_t>()); 641 func.set_end_token_pos(reader->Read<int32_t>());
696 func.set_usage_counter(reader->Read<int32_t>()); 642 func.set_usage_counter(reader->Read<int32_t>());
697 func.set_num_fixed_parameters(reader->Read<int16_t>()); 643 func.set_num_fixed_parameters(reader->Read<int16_t>());
698 func.set_num_optional_parameters(reader->Read<int16_t>()); 644 func.set_num_optional_parameters(reader->Read<int16_t>());
699 func.set_deoptimization_counter(reader->Read<int16_t>()); 645 func.set_deoptimization_counter(reader->Read<int16_t>());
700 func.set_kind_tag(reader->Read<uint32_t>()); 646 func.set_kind_tag(reader->Read<uint32_t>());
701 func.set_optimized_instruction_count(reader->Read<uint16_t>()); 647 func.set_optimized_instruction_count(reader->Read<uint16_t>());
702 func.set_optimized_call_site_count(reader->Read<uint16_t>()); 648 func.set_optimized_call_site_count(reader->Read<uint16_t>());
703 649
704 // Set all the object fields. 650 // Set all the object fields.
705 // TODO(5411462): Need to assert No GC can happen here, even though 651 READ_OBJECT_FIELDS(func,
706 // allocations may happen. 652 func.raw()->from(),
707 RawObject** toaddr = reader->snapshot_code() ? func.raw()->to() 653 reader->snapshot_code() ? func.raw()->to()
708 : func.raw()->to_snapshot(); 654 : func.raw()->to_snapshot(),
709 intptr_t num_flds = toaddr - func.raw()->from(); 655 kAsReference);
710 intptr_t from_offset = OFFSET_OF_FROM(func);
711 for (intptr_t i = 0; i <= num_flds; i++) {
712 (*reader->PassiveObjectHandle()) =
713 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
714 func.StorePointer((func.raw()->from() + i),
715 reader->PassiveObjectHandle()->raw());
716 }
717 656
718 if (!reader->snapshot_code()) { 657 if (!reader->snapshot_code()) {
719 // Initialize all fields that are not part of the snapshot. 658 // Initialize all fields that are not part of the snapshot.
720 func.ClearICDataArray(); 659 func.ClearICDataArray();
721 func.ClearCode(); 660 func.ClearCode();
661 } else {
662 // TODO(rmacnak): Fix entry_point_.
722 } 663 }
723 return func.raw(); 664 return func.raw();
724 } 665 }
725 666
726 667
727 void RawFunction::WriteTo(SnapshotWriter* writer, 668 void RawFunction::WriteTo(SnapshotWriter* writer,
728 intptr_t object_id, 669 intptr_t object_id,
729 Snapshot::Kind kind) { 670 Snapshot::Kind kind) {
730 ASSERT(writer != NULL); 671 ASSERT(writer != NULL);
731 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 672 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field)); 711 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field));
771 reader->AddBackRef(object_id, &field, kIsDeserialized); 712 reader->AddBackRef(object_id, &field, kIsDeserialized);
772 713
773 // Set all non object fields. 714 // Set all non object fields.
774 field.set_token_pos(reader->Read<int32_t>()); 715 field.set_token_pos(reader->Read<int32_t>());
775 field.set_guarded_cid(reader->Read<int32_t>()); 716 field.set_guarded_cid(reader->Read<int32_t>());
776 field.set_is_nullable(reader->Read<int32_t>()); 717 field.set_is_nullable(reader->Read<int32_t>());
777 field.set_kind_bits(reader->Read<uint8_t>()); 718 field.set_kind_bits(reader->Read<uint8_t>());
778 719
779 // Set all the object fields. 720 // Set all the object fields.
780 // TODO(5411462): Need to assert No GC can happen here, even though 721 READ_OBJECT_FIELDS(field,
781 // allocations may happen. 722 field.raw()->from(), field.raw()->to(),
782 intptr_t num_flds = (field.raw()->to() - field.raw()->from()); 723 kAsReference);
783 intptr_t from_offset = OFFSET_OF_FROM(field);
784 for (intptr_t i = 0; i <= num_flds; i++) {
785 (*reader->PassiveObjectHandle()) =
786 reader->ReadObjectImpl(kAsReference, object_id, (i + from_offset));
787 field.StorePointer((field.raw()->from() + i),
788 reader->PassiveObjectHandle()->raw());
789 }
790 724
791 field.InitializeGuardedListLengthInObjectOffset(); 725 field.InitializeGuardedListLengthInObjectOffset();
792 726
793 return field.raw(); 727 return field.raw();
794 } 728 }
795 729
796 730
797 void RawField::WriteTo(SnapshotWriter* writer, 731 void RawField::WriteTo(SnapshotWriter* writer,
798 intptr_t object_id, 732 intptr_t object_id,
799 Snapshot::Kind kind) { 733 Snapshot::Kind kind) {
(...skipping 29 matching lines...) Expand all
829 // Create the literal token object. 763 // Create the literal token object.
830 LiteralToken& literal_token = LiteralToken::ZoneHandle( 764 LiteralToken& literal_token = LiteralToken::ZoneHandle(
831 reader->zone(), NEW_OBJECT(LiteralToken)); 765 reader->zone(), NEW_OBJECT(LiteralToken));
832 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); 766 reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
833 767
834 // Read the token attributes. 768 // Read the token attributes.
835 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); 769 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>());
836 literal_token.set_kind(token_kind); 770 literal_token.set_kind(token_kind);
837 771
838 // Set all the object fields. 772 // Set all the object fields.
839 // TODO(5411462): Need to assert No GC can happen here, even though 773 READ_OBJECT_FIELDS(literal_token,
840 // allocations may happen. 774 literal_token.raw()->from(), literal_token.raw()->to(),
841 intptr_t num_flds = (literal_token.raw()->to() - literal_token.raw()->from()); 775 kAsReference);
842 for (intptr_t i = 0; i <= num_flds; i++) {
843 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
844 literal_token.StorePointer((literal_token.raw()->from() + i),
845 reader->PassiveObjectHandle()->raw());
846 }
847 776
848 return literal_token.raw(); 777 return literal_token.raw();
849 } 778 }
850 779
851 780
852 void RawLiteralToken::WriteTo(SnapshotWriter* writer, 781 void RawLiteralToken::WriteTo(SnapshotWriter* writer,
853 intptr_t object_id, 782 intptr_t object_id,
854 Snapshot::Kind kind) { 783 Snapshot::Kind kind) {
855 ASSERT(writer != NULL); 784 ASSERT(writer != NULL);
856 ASSERT(kind != Snapshot::kMessage); 785 ASSERT(kind != Snapshot::kMessage);
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 reader->AddBackRef(object_id, &prefix, kIsDeserialized); 1046 reader->AddBackRef(object_id, &prefix, kIsDeserialized);
1118 1047
1119 // Set all non object fields. 1048 // Set all non object fields.
1120 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, 1049 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_,
1121 reader->Read<int16_t>()); 1050 reader->Read<int16_t>());
1122 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, 1051 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_,
1123 reader->Read<bool>()); 1052 reader->Read<bool>());
1124 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); 1053 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>());
1125 1054
1126 // Set all the object fields. 1055 // Set all the object fields.
1127 // TODO(5411462): Need to assert No GC can happen here, even though 1056 READ_OBJECT_FIELDS(prefix,
1128 // allocations may happen. 1057 prefix.raw()->from(), prefix.raw()->to(),
1129 intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from()); 1058 kAsReference);
1130 for (intptr_t i = 0; i <= num_flds; i++) {
1131 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1132 prefix.StorePointer((prefix.raw()->from() + i),
1133 reader->PassiveObjectHandle()->raw());
1134 }
1135 1059
1136 return prefix.raw(); 1060 return prefix.raw();
1137 } 1061 }
1138 1062
1139 1063
1140 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, 1064 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
1141 intptr_t object_id, 1065 intptr_t object_id,
1142 Snapshot::Kind kind) { 1066 Snapshot::Kind kind) {
1143 ASSERT(writer != NULL); 1067 ASSERT(writer != NULL);
1144 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1068 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
(...skipping 22 matching lines...) Expand all
1167 Snapshot::Kind kind) { 1091 Snapshot::Kind kind) {
1168 ASSERT(reader != NULL); 1092 ASSERT(reader != NULL);
1169 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1093 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1170 1094
1171 // Allocate Namespace object. 1095 // Allocate Namespace object.
1172 Namespace& ns = Namespace::ZoneHandle( 1096 Namespace& ns = Namespace::ZoneHandle(
1173 reader->zone(), NEW_OBJECT(Namespace)); 1097 reader->zone(), NEW_OBJECT(Namespace));
1174 reader->AddBackRef(object_id, &ns, kIsDeserialized); 1098 reader->AddBackRef(object_id, &ns, kIsDeserialized);
1175 1099
1176 // Set all the object fields. 1100 // Set all the object fields.
1177 // TODO(5411462): Need to assert No GC can happen here, even though 1101 READ_OBJECT_FIELDS(ns, ns.raw()->from(), ns.raw()->to(), kAsReference);
1178 // allocations may happen.
1179 intptr_t num_flds = (ns.raw()->to() - ns.raw()->from());
1180 for (intptr_t i = 0; i <= num_flds; i++) {
1181 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1182 ns.StorePointer((ns.raw()->from() + i),
1183 reader->PassiveObjectHandle()->raw());
1184 }
1185 1102
1186 return ns.raw(); 1103 return ns.raw();
1187 } 1104 }
1188 1105
1189 1106
1190 void RawNamespace::WriteTo(SnapshotWriter* writer, 1107 void RawNamespace::WriteTo(SnapshotWriter* writer,
1191 intptr_t object_id, 1108 intptr_t object_id,
1192 Snapshot::Kind kind) { 1109 Snapshot::Kind kind) {
1193 ASSERT(writer != NULL); 1110 ASSERT(writer != NULL);
1194 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1111 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1195 1112
1196 // Write out the serialization header value for this object. 1113 // Write out the serialization header value for this object.
1197 writer->WriteInlinedObjectHeader(object_id); 1114 writer->WriteInlinedObjectHeader(object_id);
1198 1115
1199 // Write out the class and tags information. 1116 // Write out the class and tags information.
1200 writer->WriteVMIsolateObject(kNamespaceCid); 1117 writer->WriteVMIsolateObject(kNamespaceCid);
1201 writer->WriteTags(writer->GetObjectTags(this)); 1118 writer->WriteTags(writer->GetObjectTags(this));
1202 1119
1203 // Write out all the object pointer fields. 1120 // Write out all the object pointer fields.
1204 SnapshotWriterVisitor visitor(writer); 1121 SnapshotWriterVisitor visitor(writer);
1205 visitor.VisitPointers(from(), to()); 1122 visitor.VisitPointers(from(), to());
1206 } 1123 }
1207 1124
1208 1125
1209 RawCode* Code::ReadFrom(SnapshotReader* reader, 1126 RawCode* Code::ReadFrom(SnapshotReader* reader,
1210 intptr_t object_id, 1127 intptr_t object_id,
1211 intptr_t tags, 1128 intptr_t tags,
1212 Snapshot::Kind kind) { 1129 Snapshot::Kind kind) {
1213 UNREACHABLE(); // Untested.
1214 ASSERT(reader->snapshot_code()); 1130 ASSERT(reader->snapshot_code());
1215 ASSERT(kind == Snapshot::kFull); 1131 ASSERT(kind == Snapshot::kFull);
1216 1132
1217 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0)); 1133 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0));
1218 reader->AddBackRef(object_id, &result, kIsDeserialized); 1134 reader->AddBackRef(object_id, &result, kIsDeserialized);
1219 1135
1220 result.set_compile_timestamp(reader->Read<int64_t>()); 1136 result.set_compile_timestamp(reader->Read<int64_t>());
1221 result.set_state_bits(reader->Read<int32_t>()); 1137 result.set_state_bits(reader->Read<int32_t>());
1222 result.set_entry_patch_pc_offset(reader->Read<int32_t>()); 1138 result.set_entry_patch_pc_offset(reader->Read<int32_t>());
1223 result.set_patch_code_pc_offset(reader->Read<int32_t>()); 1139 result.set_patch_code_pc_offset(reader->Read<int32_t>());
1224 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>()); 1140 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>());
1225 1141
1226 // Set all the object fields. 1142 // Set all the object fields.
1227 // TODO(5411462): Need to assert No GC can happen here, even though 1143 READ_OBJECT_FIELDS(result,
1228 // allocations may happen. 1144 result.raw()->from(), result.raw()->to(),
1229 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); 1145 kAsReference);
1230 for (intptr_t i = 0; i <= num_flds; i++) { 1146
1231 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); 1147 // TODO(rmacnak): Fix entry_point_.
1232 result.StorePointer((result.raw()->from() + i),
1233 reader->PassiveObjectHandle()->raw());
1234 }
1235 1148
1236 return result.raw(); 1149 return result.raw();
1237 } 1150 }
1238 1151
1239 1152
1240 void RawCode::WriteTo(SnapshotWriter* writer, 1153 void RawCode::WriteTo(SnapshotWriter* writer,
1241 intptr_t object_id, 1154 intptr_t object_id,
1242 Snapshot::Kind kind) { 1155 Snapshot::Kind kind) {
1243 ASSERT(writer->snapshot_code()); 1156 ASSERT(writer->snapshot_code());
1244 ASSERT(kind == Snapshot::kFull); 1157 ASSERT(kind == Snapshot::kFull);
(...skipping 22 matching lines...) Expand all
1267 // Write out all the object pointer fields. 1180 // Write out all the object pointer fields.
1268 SnapshotWriterVisitor visitor(writer); 1181 SnapshotWriterVisitor visitor(writer);
1269 visitor.VisitPointers(from(), to()); 1182 visitor.VisitPointers(from(), to());
1270 } 1183 }
1271 1184
1272 1185
1273 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, 1186 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
1274 intptr_t object_id, 1187 intptr_t object_id,
1275 intptr_t tags, 1188 intptr_t tags,
1276 Snapshot::Kind kind) { 1189 Snapshot::Kind kind) {
1277 UNREACHABLE(); // Untested.
1278 ASSERT(reader->snapshot_code()); 1190 ASSERT(reader->snapshot_code());
1279 ASSERT(kind == Snapshot::kFull); 1191 ASSERT(kind == Snapshot::kFull);
1280 1192
1281 intptr_t id = reader->Read<int32_t>(); 1193 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>());
1194 intptr_t offset = reader->Read<int32_t>();
1282 Instructions& result = 1195 Instructions& result =
1283 Instructions::ZoneHandle(reader->zone(), 1196 Instructions::ZoneHandle(reader->zone(),
1284 reader->GetInstructionsById(id)); 1197 reader->GetInstructionsAt(offset, full_tags));
1285 reader->AddBackRef(object_id, &result, kIsDeserialized); 1198 reader->AddBackRef(object_id, &result, kIsDeserialized);
1199
1200 {
1201 // TODO(rmacnak): Drop after calling convention change.
1202 Code::CheckedHandle(reader->ReadObjectImpl(kAsReference));
1203 ObjectPool::CheckedHandle(reader->ReadObjectImpl(kAsReference));
1204 }
1205
1286 return result.raw(); 1206 return result.raw();
1287 } 1207 }
1288 1208
1289 1209
1290 void RawInstructions::WriteTo(SnapshotWriter* writer, 1210 void RawInstructions::WriteTo(SnapshotWriter* writer,
1291 intptr_t object_id, 1211 intptr_t object_id,
1292 Snapshot::Kind kind) { 1212 Snapshot::Kind kind) {
1293 ASSERT(writer->snapshot_code()); 1213 ASSERT(writer->snapshot_code());
1294 ASSERT(kind == Snapshot::kFull); 1214 ASSERT(kind == Snapshot::kFull);
1295 1215
1296 { 1216 {
1297 // TODO(rmacnak): Drop after calling convention change. 1217 // TODO(rmacnak): Drop after calling convention change.
1298 writer->WriteInlinedObjectHeader(object_id); 1218 writer->WriteInlinedObjectHeader(object_id);
1299 writer->WriteVMIsolateObject(kInstructionsCid); 1219 writer->WriteVMIsolateObject(kInstructionsCid);
1300 writer->WriteTags(writer->GetObjectTags(this)); 1220 writer->WriteTags(writer->GetObjectTags(this));
1221 }
1222
1223 writer->Write<intptr_t>(writer->GetObjectTags(this)); // For sanity check.
1224
1225 // Temporarily restore the object header for writing to the text section.
1226 // TODO(asiva): Don't mutate object headers during serialization.
1227 uword object_tags = writer->GetObjectTags(this);
1228 uword snapshot_tags = ptr()->tags_;
1229 ptr()->tags_ = object_tags;
1230 writer->Write<int32_t>(writer->GetInstructionsId(this));
1231 ptr()->tags_ = snapshot_tags;
1232
1233 {
1234 // TODO(rmacnak): Drop after calling convention change.
1301 writer->WriteObjectImpl(ptr()->code_, kAsReference); 1235 writer->WriteObjectImpl(ptr()->code_, kAsReference);
1302 writer->WriteObjectImpl(ptr()->object_pool_, kAsReference); 1236 writer->WriteObjectImpl(ptr()->object_pool_, kAsReference);
1303 } 1237 }
1304
1305 writer->Write<int32_t>(writer->GetInstructionsId(this));
1306 } 1238 }
1307 1239
1308 1240
1309 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader, 1241 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader,
1310 intptr_t object_id, 1242 intptr_t object_id,
1311 intptr_t tags, 1243 intptr_t tags,
1312 Snapshot::Kind kind) { 1244 Snapshot::Kind kind) {
1313 UNREACHABLE(); // Untested.
1314 ASSERT(reader->snapshot_code()); 1245 ASSERT(reader->snapshot_code());
1315 ASSERT(kind == Snapshot::kFull); 1246 ASSERT(kind == Snapshot::kFull);
1316 1247
1317 intptr_t length = reader->Read<intptr_t>(); 1248 intptr_t length = reader->Read<intptr_t>();
1318 1249
1319 ObjectPool& result = 1250 ObjectPool& result =
1320 ObjectPool::ZoneHandle(reader->zone(), 1251 ObjectPool::ZoneHandle(reader->zone(),
1321 NEW_OBJECT_WITH_LEN(ObjectPool, length)); 1252 NEW_OBJECT_WITH_LEN(ObjectPool, length));
1322 reader->AddBackRef(object_id, &result, kIsDeserialized); 1253 reader->AddBackRef(object_id, &result, kIsDeserialized);
1323 1254
1324 RawTypedData* info_array = result.raw_ptr()->info_array_->ptr(); 1255 const TypedData& info_array =
1256 TypedData::Handle(reader->NewTypedData(kTypedDataInt8ArrayCid, length));
1257 result.set_info_array(info_array);
1325 1258
1326 // Set all the object fields. 1259 NoSafepointScope no_safepoint;
1327 // TODO(5411462): Need to assert No GC can happen here, even though
1328 // allocations may happen.
1329 for (intptr_t i = 0; i < length; i++) { 1260 for (intptr_t i = 0; i < length; i++) {
1330 ObjectPool::EntryType entry_type = 1261 ObjectPool::EntryType entry_type =
1331 static_cast<ObjectPool::EntryType>(reader->Read<uint8_t>()); 1262 static_cast<ObjectPool::EntryType>(reader->Read<int8_t>());
1332 info_array->data()[i] = entry_type; 1263 *reinterpret_cast<int8_t*>(info_array.DataAddr(i)) = entry_type;
1333 switch (entry_type) { 1264 switch (entry_type) {
1334 case ObjectPool::kTaggedObject: { 1265 case ObjectPool::kTaggedObject: {
1335 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); 1266 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1336 result.SetObjectAt(i, *(reader->PassiveObjectHandle())); 1267 result.SetObjectAt(i, *(reader->PassiveObjectHandle()));
1337 break; 1268 break;
1338 } 1269 }
1339 case ObjectPool::kImmediate: { 1270 case ObjectPool::kImmediate: {
1340 intptr_t raw_value = reader->Read<intptr_t>(); 1271 intptr_t raw_value = reader->Read<intptr_t>();
1341 result.SetRawValueAt(i, raw_value); 1272 result.SetRawValueAt(i, raw_value);
1342 break; 1273 break;
(...skipping 27 matching lines...) Expand all
1370 writer->WriteTags(writer->GetObjectTags(this)); 1301 writer->WriteTags(writer->GetObjectTags(this));
1371 1302
1372 intptr_t length = ptr()->length_; 1303 intptr_t length = ptr()->length_;
1373 RawTypedData* info_array = ptr()->info_array_->ptr(); 1304 RawTypedData* info_array = ptr()->info_array_->ptr();
1374 ASSERT(info_array != TypedData::null()); 1305 ASSERT(info_array != TypedData::null());
1375 1306
1376 writer->Write<intptr_t>(length); 1307 writer->Write<intptr_t>(length);
1377 for (intptr_t i = 0; i < length; i++) { 1308 for (intptr_t i = 0; i < length; i++) {
1378 ObjectPool::EntryType entry_type = 1309 ObjectPool::EntryType entry_type =
1379 static_cast<ObjectPool::EntryType>(info_array->data()[i]); 1310 static_cast<ObjectPool::EntryType>(info_array->data()[i]);
1380 writer->Write<uint8_t>(entry_type); 1311 writer->Write<int8_t>(entry_type);
1381 Entry& entry = ptr()->data()[i]; 1312 Entry& entry = ptr()->data()[i];
1382 switch (entry_type) { 1313 switch (entry_type) {
1383 case ObjectPool::kTaggedObject: 1314 case ObjectPool::kTaggedObject:
1384 writer->WriteObjectImpl(entry.raw_obj_, kAsReference); 1315 writer->WriteObjectImpl(entry.raw_obj_, kAsReference);
1385 break; 1316 break;
1386 case ObjectPool::kImmediate: 1317 case ObjectPool::kImmediate:
1387 writer->Write<intptr_t>(entry.raw_value_); 1318 writer->Write<intptr_t>(entry.raw_value_);
1388 break; 1319 break;
1389 case ObjectPool::kExternalLabel: 1320 case ObjectPool::kExternalLabel:
1390 // TODO(rmacnak): Write symbolically. 1321 // TODO(rmacnak): Write symbolically.
1391 writer->Write<intptr_t>(entry.raw_value_); 1322 writer->Write<intptr_t>(entry.raw_value_);
1392 break; 1323 break;
1393 default: 1324 default:
1394 UNREACHABLE(); 1325 UNREACHABLE();
1395 } 1326 }
1396 } 1327 }
1397 } 1328 }
1398 1329
1399 1330
1400 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, 1331 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader,
1401 intptr_t object_id, 1332 intptr_t object_id,
1402 intptr_t tags, 1333 intptr_t tags,
1403 Snapshot::Kind kind) { 1334 Snapshot::Kind kind) {
1404 UNREACHABLE(); // Untested.
1405 ASSERT(reader->snapshot_code()); 1335 ASSERT(reader->snapshot_code());
1336 ASSERT(kind == Snapshot::kFull);
1406 1337
1407 const int32_t length = reader->Read<int32_t>(); 1338 const int32_t length = reader->Read<int32_t>();
1408 PcDescriptors& result = PcDescriptors::ZoneHandle(reader->zone(), 1339 PcDescriptors& result =
1409 PcDescriptors::New(length)); 1340 PcDescriptors::ZoneHandle(reader->zone(),
1341 NEW_OBJECT_WITH_LEN(PcDescriptors, length));
1410 reader->AddBackRef(object_id, &result, kIsDeserialized); 1342 reader->AddBackRef(object_id, &result, kIsDeserialized);
1411 1343
1412 if (result.Length() > 0) { 1344 if (result.Length() > 0) {
1413 NoSafepointScope no_safepoint; 1345 NoSafepointScope no_safepoint;
1414 intptr_t len = result.Length(); 1346 intptr_t len = result.Length();
1415 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); 1347 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1416 reader->ReadBytes(data, len); 1348 reader->ReadBytes(data, len);
1417 } 1349 }
1418 1350
1419 return result.raw(); 1351 return result.raw();
1420 } 1352 }
1421 1353
1422 1354
1423 void RawPcDescriptors::WriteTo(SnapshotWriter* writer, 1355 void RawPcDescriptors::WriteTo(SnapshotWriter* writer,
1424 intptr_t object_id, 1356 intptr_t object_id,
1425 Snapshot::Kind kind) { 1357 Snapshot::Kind kind) {
1426 ASSERT(writer->snapshot_code()); 1358 ASSERT(writer->snapshot_code());
1359 ASSERT(kind == Snapshot::kFull);
1427 1360
1428 // Write out the serialization header value for this object. 1361 // Write out the serialization header value for this object.
1429 writer->WriteInlinedObjectHeader(object_id); 1362 writer->WriteInlinedObjectHeader(object_id);
1430 writer->WriteIndexedObject(kPcDescriptorsCid); 1363 writer->WriteIndexedObject(kPcDescriptorsCid);
1431 writer->WriteTags(writer->GetObjectTags(this)); 1364 writer->WriteTags(writer->GetObjectTags(this));
1432 writer->Write<int32_t>(ptr()->length_); 1365 writer->Write<int32_t>(ptr()->length_);
1433 if (ptr()->length_ > 0) { 1366 if (ptr()->length_ > 0) {
1434 intptr_t len = ptr()->length_; 1367 intptr_t len = ptr()->length_;
1435 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1368 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1436 writer->WriteBytes(data, len); 1369 writer->WriteBytes(data, len);
1437 } 1370 }
1438 } 1371 }
1439 1372
1440 1373
1441 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, 1374 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader,
1442 intptr_t object_id, 1375 intptr_t object_id,
1443 intptr_t tags, 1376 intptr_t tags,
1444 Snapshot::Kind kind) { 1377 Snapshot::Kind kind) {
1445 UNREACHABLE(); // Untested.
1446 ASSERT(reader->snapshot_code()); 1378 ASSERT(reader->snapshot_code());
1379 ASSERT(kind == Snapshot::kFull);
1447 1380
1448 const int32_t length = reader->Read<int32_t>(); 1381 const int32_t length = reader->Read<int32_t>();
1449 const int32_t register_bit_count = reader->Read<int32_t>();
1450 const uword pc_offset = reader->Read<uint32_t>();
1451
1452 Stackmap& result = 1382 Stackmap& result =
1453 Stackmap::ZoneHandle(reader->zone(), 1383 Stackmap::ZoneHandle(reader->zone(),
1454 Stackmap::New(length, register_bit_count, pc_offset)); 1384 reader->NewStackmap(length));
1455 reader->AddBackRef(object_id, &result, kIsDeserialized); 1385 reader->AddBackRef(object_id, &result, kIsDeserialized);
1456 1386
1457 if (result.Length() > 0) { 1387 result.SetRegisterBitCount(reader->Read<int32_t>());
1388 result.SetPcOffset(reader->Read<uint32_t>());
1389
1390 if (length > 0) {
1458 NoSafepointScope no_safepoint; 1391 NoSafepointScope no_safepoint;
1459 intptr_t len = (result.Length() + 7) / 8; 1392 intptr_t len = (result.Length() + 7) / 8;
1460 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); 1393 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1461 reader->ReadBytes(data, len); 1394 reader->ReadBytes(data, len);
1462 } 1395 }
1463 1396
1464 return result.raw(); 1397 return result.raw();
1465 } 1398 }
1466 1399
1467 1400
1468 void RawStackmap::WriteTo(SnapshotWriter* writer, 1401 void RawStackmap::WriteTo(SnapshotWriter* writer,
1469 intptr_t object_id, 1402 intptr_t object_id,
1470 Snapshot::Kind kind) { 1403 Snapshot::Kind kind) {
1471 ASSERT(writer->snapshot_code()); 1404 ASSERT(writer->snapshot_code());
1405 ASSERT(kind == Snapshot::kFull);
1472 1406
1473 // Write out the serialization header value for this object. 1407 // Write out the serialization header value for this object.
1474 writer->WriteInlinedObjectHeader(object_id); 1408 writer->WriteInlinedObjectHeader(object_id);
1475 writer->WriteIndexedObject(kStackmapCid); 1409 writer->WriteIndexedObject(kStackmapCid);
1476 writer->WriteTags(writer->GetObjectTags(this)); 1410 writer->WriteTags(writer->GetObjectTags(this));
1411
1477 writer->Write<int32_t>(ptr()->length_); 1412 writer->Write<int32_t>(ptr()->length_);
1478 writer->Write<int32_t>(ptr()->register_bit_count_); 1413 writer->Write<int32_t>(ptr()->register_bit_count_);
1479 writer->Write<uint32_t>(ptr()->pc_offset_); 1414 writer->Write<uint32_t>(ptr()->pc_offset_);
1480 if (ptr()->length_ > 0) { 1415 if (ptr()->length_ > 0) {
1481 intptr_t len = (ptr()->length_ + 7) / 8; 1416 intptr_t len = (ptr()->length_ + 7) / 8;
1482 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1417 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1483 writer->WriteBytes(data, len); 1418 writer->WriteBytes(data, len);
1484 } 1419 }
1485 } 1420 }
1486 1421
1487 1422
1488 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader, 1423 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader,
1489 intptr_t object_id, 1424 intptr_t object_id,
1490 intptr_t tags, 1425 intptr_t tags,
1491 Snapshot::Kind kind) { 1426 Snapshot::Kind kind) {
1492 UNREACHABLE(); // Untested.
1493 ASSERT(reader->snapshot_code()); 1427 ASSERT(reader->snapshot_code());
1428 ASSERT(kind == Snapshot::kFull);
1494 1429
1495 const int32_t num_entries = reader->Read<int32_t>(); 1430 const int32_t num_entries = reader->Read<int32_t>();
1496 1431
1497 LocalVarDescriptors& result = 1432 LocalVarDescriptors& result =
1498 LocalVarDescriptors::ZoneHandle(reader->zone(), 1433 LocalVarDescriptors::ZoneHandle(reader->zone(),
1499 LocalVarDescriptors::New(num_entries)); 1434 NEW_OBJECT_WITH_LEN(LocalVarDescriptors,
1435 num_entries));
1500 reader->AddBackRef(object_id, &result, kIsDeserialized); 1436 reader->AddBackRef(object_id, &result, kIsDeserialized);
1501 1437
1502 for (intptr_t i = 0; i < num_entries; i++) { 1438 for (intptr_t i = 0; i < num_entries; i++) {
1503 (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference); 1439 (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference);
1504 result.StorePointer(result.raw()->nameAddrAt(i), 1440 result.StorePointer(result.raw()->nameAddrAt(i),
1505 reader->StringHandle()->raw()); 1441 reader->StringHandle()->raw());
1506 } 1442 }
1507 1443
1508 if (num_entries > 0) { 1444 if (num_entries > 0) {
1509 NoSafepointScope no_safepoint; 1445 NoSafepointScope no_safepoint;
1510 intptr_t len = num_entries * sizeof(RawLocalVarDescriptors::VarInfo); 1446 intptr_t len = num_entries * sizeof(RawLocalVarDescriptors::VarInfo);
1511 uint8_t* data = result.UnsafeMutableNonPointer( 1447 uint8_t* data = result.UnsafeMutableNonPointer(
1512 reinterpret_cast<const uint8_t*>(result.raw()->data())); 1448 reinterpret_cast<const uint8_t*>(result.raw()->data()));
1513 reader->ReadBytes(data, len); 1449 reader->ReadBytes(data, len);
1514 } 1450 }
1515 1451
1516 return result.raw(); 1452 return result.raw();
1517 } 1453 }
1518 1454
1519 1455
1520 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer, 1456 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer,
1521 intptr_t object_id, 1457 intptr_t object_id,
1522 Snapshot::Kind kind) { 1458 Snapshot::Kind kind) {
1523 ASSERT(writer->snapshot_code()); 1459 ASSERT(writer->snapshot_code());
1460 ASSERT(kind == Snapshot::kFull);
1524 1461
1525 // Write out the serialization header value for this object. 1462 // Write out the serialization header value for this object.
1526 writer->WriteInlinedObjectHeader(object_id); 1463 writer->WriteInlinedObjectHeader(object_id);
1527 writer->WriteIndexedObject(kLocalVarDescriptorsCid); 1464 writer->WriteIndexedObject(kLocalVarDescriptorsCid);
1528 writer->WriteTags(writer->GetObjectTags(this)); 1465 writer->WriteTags(writer->GetObjectTags(this));
1529 writer->Write<int32_t>(ptr()->num_entries_); 1466 writer->Write<int32_t>(ptr()->num_entries_);
1530 for (intptr_t i = 0; i < ptr()->num_entries_; i++) { 1467 for (intptr_t i = 0; i < ptr()->num_entries_; i++) {
1531 writer->WriteObjectImpl(ptr()->names()[i], kAsInlinedObject); 1468 writer->WriteObjectImpl(ptr()->names()[i], kAsReference);
1532 } 1469 }
1533 if (ptr()->num_entries_ > 0) { 1470 if (ptr()->num_entries_ > 0) {
1534 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo); 1471 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo);
1535 uint8_t* data = reinterpret_cast<uint8_t*>(this->data()); 1472 uint8_t* data = reinterpret_cast<uint8_t*>(this->data());
1536 writer->WriteBytes(data, len); 1473 writer->WriteBytes(data, len);
1537 } 1474 }
1538 } 1475 }
1539 1476
1540 1477
1541 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader, 1478 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader,
1542 intptr_t object_id, 1479 intptr_t object_id,
1543 intptr_t tags, 1480 intptr_t tags,
1544 Snapshot::Kind kind) { 1481 Snapshot::Kind kind) {
1545 UNREACHABLE(); // Untested.
1546 ASSERT(reader->snapshot_code()); 1482 ASSERT(reader->snapshot_code());
1483 ASSERT(kind == Snapshot::kFull);
1547 1484
1548 // handled_types_data. 1485 const int32_t num_entries = reader->Read<int32_t>();
1549 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
1550
1551 ExceptionHandlers& result = 1486 ExceptionHandlers& result =
1552 ExceptionHandlers::ZoneHandle(reader->zone(), 1487 ExceptionHandlers::ZoneHandle(reader->zone(),
1553 ExceptionHandlers::New(*reader->ArrayHandle())); 1488 NEW_OBJECT_WITH_LEN(ExceptionHandlers,
1489 num_entries));
1554 reader->AddBackRef(object_id, &result, kIsDeserialized); 1490 reader->AddBackRef(object_id, &result, kIsDeserialized);
1555 1491
1556 if (result.num_entries() > 0) { 1492 if (result.num_entries() > 0) {
1557 NoSafepointScope no_safepoint; 1493 NoSafepointScope no_safepoint;
1558 const intptr_t len = 1494 const intptr_t len =
1559 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo); 1495 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo);
1560 uint8_t* data = result.UnsafeMutableNonPointer( 1496 uint8_t* data = result.UnsafeMutableNonPointer(
1561 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data())); 1497 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data()));
1562 reader->ReadBytes(data, len); 1498 reader->ReadBytes(data, len);
1563 } 1499 }
1564 1500
1501 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
1502 result.StorePointer(&result.raw_ptr()->handled_types_data_,
1503 reader->ArrayHandle()->raw());
1504
1565 return result.raw(); 1505 return result.raw();
1566 } 1506 }
1567 1507
1568 1508
1569 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer, 1509 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer,
1570 intptr_t object_id, 1510 intptr_t object_id,
1571 Snapshot::Kind kind) { 1511 Snapshot::Kind kind) {
1572 ASSERT(writer->snapshot_code()); 1512 ASSERT(writer->snapshot_code());
1513 ASSERT(kind == Snapshot::kFull);
1573 1514
1574 // Write out the serialization header value for this object. 1515 // Write out the serialization header value for this object.
1575 writer->WriteInlinedObjectHeader(object_id); 1516 writer->WriteInlinedObjectHeader(object_id);
1576 writer->WriteIndexedObject(kExceptionHandlersCid); 1517 writer->WriteIndexedObject(kExceptionHandlersCid);
1577 writer->WriteTags(writer->GetObjectTags(this)); 1518 writer->WriteTags(writer->GetObjectTags(this));
1578 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject); 1519 writer->Write<int32_t>(ptr()->num_entries_);
1579 1520
1580 if (ptr()->num_entries_ > 0) { 1521 if (ptr()->num_entries_ > 0) {
1581 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo); 1522 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo);
1582 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1523 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1583 writer->WriteBytes(data, len); 1524 writer->WriteBytes(data, len);
1584 } 1525 }
1526
1527 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject);
1585 } 1528 }
1586 1529
1587 1530
1588 RawContext* Context::ReadFrom(SnapshotReader* reader, 1531 RawContext* Context::ReadFrom(SnapshotReader* reader,
1589 intptr_t object_id, 1532 intptr_t object_id,
1590 intptr_t tags, 1533 intptr_t tags,
1591 Snapshot::Kind kind) { 1534 Snapshot::Kind kind) {
1592 ASSERT(reader != NULL); 1535 ASSERT(reader != NULL);
1593 1536
1594 // Allocate context object. 1537 // Allocate context object.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 1582
1640 RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader, 1583 RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader,
1641 intptr_t object_id, 1584 intptr_t object_id,
1642 intptr_t tags, 1585 intptr_t tags,
1643 Snapshot::Kind kind) { 1586 Snapshot::Kind kind) {
1644 ASSERT(reader != NULL); 1587 ASSERT(reader != NULL);
1645 1588
1646 // Allocate context object. 1589 // Allocate context object.
1647 bool is_implicit = reader->Read<bool>(); 1590 bool is_implicit = reader->Read<bool>();
1648 if (is_implicit) { 1591 if (is_implicit) {
1649 ContextScope& context_scope = 1592 ContextScope& context_scope = ContextScope::ZoneHandle();
1650 ContextScope::ZoneHandle(ContextScope::New(1, true)); 1593 if (kind == Snapshot::kFull) {
1594 context_scope = reader->NewContextScope(1);
1595 context_scope.set_is_implicit(true);
1596 } else {
1597 context_scope = ContextScope::New(1, true);
1598 }
1651 reader->AddBackRef(object_id, &context_scope, kIsDeserialized); 1599 reader->AddBackRef(object_id, &context_scope, kIsDeserialized);
1652 1600
1653 *reader->TypeHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); 1601 *reader->TypeHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
1654 1602
1655 // Create a descriptor for 'this' variable. 1603 // Create a descriptor for 'this' variable.
1656 context_scope.SetTokenIndexAt(0, 0); 1604 context_scope.SetTokenIndexAt(0, 0);
1657 context_scope.SetNameAt(0, Symbols::This()); 1605 context_scope.SetNameAt(0, Symbols::This());
1658 context_scope.SetIsFinalAt(0, true); 1606 context_scope.SetIsFinalAt(0, true);
1659 context_scope.SetIsConstAt(0, false); 1607 context_scope.SetIsConstAt(0, false);
1660 context_scope.SetTypeAt(0, *reader->TypeHandle()); 1608 context_scope.SetTypeAt(0, *reader->TypeHandle());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1692 return; 1640 return;
1693 } 1641 }
1694 UNREACHABLE(); 1642 UNREACHABLE();
1695 } 1643 }
1696 1644
1697 1645
1698 RawICData* ICData::ReadFrom(SnapshotReader* reader, 1646 RawICData* ICData::ReadFrom(SnapshotReader* reader,
1699 intptr_t object_id, 1647 intptr_t object_id,
1700 intptr_t tags, 1648 intptr_t tags,
1701 Snapshot::Kind kind) { 1649 Snapshot::Kind kind) {
1702 UNREACHABLE(); // Untested.
1703 ASSERT(reader->snapshot_code()); 1650 ASSERT(reader->snapshot_code());
1704 ASSERT(kind == Snapshot::kFull); 1651 ASSERT(kind == Snapshot::kFull);
1705 1652
1706 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); 1653 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData));
1707 reader->AddBackRef(object_id, &result, kIsDeserialized); 1654 reader->AddBackRef(object_id, &result, kIsDeserialized);
1708 1655
1709 result.set_deopt_id(reader->Read<int32_t>()); 1656 result.set_deopt_id(reader->Read<int32_t>());
1710 result.set_state_bits(reader->Read<uint32_t>()); 1657 result.set_state_bits(reader->Read<uint32_t>());
1711 1658
1712 // Set all the object fields. 1659 // Set all the object fields.
1713 // TODO(5411462): Need to assert No GC can happen here, even though 1660 READ_OBJECT_FIELDS(result,
1714 // allocations may happen. 1661 result.raw()->from(), result.raw()->to(),
1715 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); 1662 kAsReference);
1716 for (intptr_t i = 0; i <= num_flds; i++) {
1717 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1718 result.StorePointer((result.raw()->from() + i),
1719 reader->PassiveObjectHandle()->raw());
1720 }
1721 1663
1722 return result.raw(); 1664 return result.raw();
1723 } 1665 }
1724 1666
1725 1667
1726 void RawICData::WriteTo(SnapshotWriter* writer, 1668 void RawICData::WriteTo(SnapshotWriter* writer,
1727 intptr_t object_id, 1669 intptr_t object_id,
1728 Snapshot::Kind kind) { 1670 Snapshot::Kind kind) {
1729 ASSERT(writer->snapshot_code()); 1671 ASSERT(writer->snapshot_code());
1730 ASSERT(kind == Snapshot::kFull); 1672 ASSERT(kind == Snapshot::kFull);
(...skipping 12 matching lines...) Expand all
1743 // Write out all the object pointer fields. 1685 // Write out all the object pointer fields.
1744 SnapshotWriterVisitor visitor(writer); 1686 SnapshotWriterVisitor visitor(writer);
1745 visitor.VisitPointers(from(), to()); 1687 visitor.VisitPointers(from(), to());
1746 } 1688 }
1747 1689
1748 1690
1749 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader, 1691 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader,
1750 intptr_t object_id, 1692 intptr_t object_id,
1751 intptr_t tags, 1693 intptr_t tags,
1752 Snapshot::Kind kind) { 1694 Snapshot::Kind kind) {
1753 UNREACHABLE(); // Untested.
1754 ASSERT(reader->snapshot_code()); 1695 ASSERT(reader->snapshot_code());
1755 ASSERT(kind == Snapshot::kFull); 1696 ASSERT(kind == Snapshot::kFull);
1756 1697
1757 MegamorphicCache& result = 1698 MegamorphicCache& result =
1758 MegamorphicCache::ZoneHandle(reader->zone(), 1699 MegamorphicCache::ZoneHandle(reader->zone(),
1759 NEW_OBJECT(MegamorphicCache)); 1700 NEW_OBJECT(MegamorphicCache));
1760 reader->AddBackRef(object_id, &result, kIsDeserialized); 1701 reader->AddBackRef(object_id, &result, kIsDeserialized);
1761 1702
1762 result.set_filled_entry_count(reader->Read<int32_t>()); 1703 result.set_filled_entry_count(reader->Read<int32_t>());
1763 1704
1764 // Set all the object fields. 1705 // Set all the object fields.
1765 // TODO(5411462): Need to assert No GC can happen here, even though 1706 READ_OBJECT_FIELDS(result,
1766 // allocations may happen. 1707 result.raw()->from(), result.raw()->to(),
1767 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); 1708 kAsReference);
1768 for (intptr_t i = 0; i <= num_flds; i++) {
1769 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1770 result.StorePointer((result.raw()->from() + i),
1771 reader->PassiveObjectHandle()->raw());
1772 }
1773 1709
1774 return result.raw(); 1710 return result.raw();
1775 } 1711 }
1776 1712
1777 1713
1778 void RawMegamorphicCache::WriteTo(SnapshotWriter* writer, 1714 void RawMegamorphicCache::WriteTo(SnapshotWriter* writer,
1779 intptr_t object_id, 1715 intptr_t object_id,
1780 Snapshot::Kind kind) { 1716 Snapshot::Kind kind) {
1781 ASSERT(writer->snapshot_code()); 1717 ASSERT(writer->snapshot_code());
1782 ASSERT(kind == Snapshot::kFull); 1718 ASSERT(kind == Snapshot::kFull);
(...skipping 11 matching lines...) Expand all
1794 // Write out all the object pointer fields. 1730 // Write out all the object pointer fields.
1795 SnapshotWriterVisitor visitor(writer); 1731 SnapshotWriterVisitor visitor(writer);
1796 visitor.VisitPointers(from(), to()); 1732 visitor.VisitPointers(from(), to());
1797 } 1733 }
1798 1734
1799 1735
1800 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader, 1736 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader,
1801 intptr_t object_id, 1737 intptr_t object_id,
1802 intptr_t tags, 1738 intptr_t tags,
1803 Snapshot::Kind kind) { 1739 Snapshot::Kind kind) {
1804 UNREACHABLE(); // Untested.
1805 ASSERT(reader->snapshot_code()); 1740 ASSERT(reader->snapshot_code());
1806 ASSERT(kind == Snapshot::kFull); 1741 ASSERT(kind == Snapshot::kFull);
1807 1742
1808 SubtypeTestCache& result = 1743 SubtypeTestCache& result =
1809 SubtypeTestCache::ZoneHandle(reader->zone(), 1744 SubtypeTestCache::ZoneHandle(reader->zone(),
1810 NEW_OBJECT(SubtypeTestCache)); 1745 NEW_OBJECT(SubtypeTestCache));
1811 reader->AddBackRef(object_id, &result, kIsDeserialized); 1746 reader->AddBackRef(object_id, &result, kIsDeserialized);
1812 1747
1813 // Set all the object fields. 1748 // Set all the object fields.
1814 // TODO(5411462): Need to assert No GC can happen here, even though 1749 // TODO(5411462): Need to assert No GC can happen here, even though
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1860 intptr_t tags, 1795 intptr_t tags,
1861 Snapshot::Kind kind) { 1796 Snapshot::Kind kind) {
1862 ASSERT(reader != NULL); 1797 ASSERT(reader != NULL);
1863 1798
1864 // Allocate ApiError object. 1799 // Allocate ApiError object.
1865 ApiError& api_error = 1800 ApiError& api_error =
1866 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError)); 1801 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError));
1867 reader->AddBackRef(object_id, &api_error, kIsDeserialized); 1802 reader->AddBackRef(object_id, &api_error, kIsDeserialized);
1868 1803
1869 // Set all the object fields. 1804 // Set all the object fields.
1870 // TODO(5411462): Need to assert No GC can happen here, even though 1805 READ_OBJECT_FIELDS(api_error,
1871 // allocations may happen. 1806 api_error.raw()->from(), api_error.raw()->to(),
1872 intptr_t num_flds = (api_error.raw()->to() - api_error.raw()->from()); 1807 kAsReference);
1873 for (intptr_t i = 0; i <= num_flds; i++) {
1874 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1875 api_error.StorePointer((api_error.raw()->from() + i),
1876 reader->PassiveObjectHandle()->raw());
1877 }
1878 1808
1879 return api_error.raw(); 1809 return api_error.raw();
1880 } 1810 }
1881 1811
1882 1812
1883 void RawApiError::WriteTo(SnapshotWriter* writer, 1813 void RawApiError::WriteTo(SnapshotWriter* writer,
1884 intptr_t object_id, 1814 intptr_t object_id,
1885 Snapshot::Kind kind) { 1815 Snapshot::Kind kind) {
1886 ASSERT(writer != NULL); 1816 ASSERT(writer != NULL);
1887 1817
(...skipping 19 matching lines...) Expand all
1907 // Allocate LanguageError object. 1837 // Allocate LanguageError object.
1908 LanguageError& language_error = 1838 LanguageError& language_error =
1909 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError)); 1839 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError));
1910 reader->AddBackRef(object_id, &language_error, kIsDeserialized); 1840 reader->AddBackRef(object_id, &language_error, kIsDeserialized);
1911 1841
1912 // Set all non object fields. 1842 // Set all non object fields.
1913 language_error.set_token_pos(reader->Read<int32_t>()); 1843 language_error.set_token_pos(reader->Read<int32_t>());
1914 language_error.set_kind(reader->Read<uint8_t>()); 1844 language_error.set_kind(reader->Read<uint8_t>());
1915 1845
1916 // Set all the object fields. 1846 // Set all the object fields.
1917 // TODO(5411462): Need to assert No GC can happen here, even though 1847 READ_OBJECT_FIELDS(language_error,
1918 // allocations may happen. 1848 language_error.raw()->from(), language_error.raw()->to(),
1919 intptr_t num_flds = 1849 kAsReference);
1920 (language_error.raw()->to() - language_error.raw()->from());
1921 for (intptr_t i = 0; i <= num_flds; i++) {
1922 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1923 language_error.StorePointer((language_error.raw()->from() + i),
1924 reader->PassiveObjectHandle()->raw());
1925 }
1926 1850
1927 return language_error.raw(); 1851 return language_error.raw();
1928 } 1852 }
1929 1853
1930 1854
1931 void RawLanguageError::WriteTo(SnapshotWriter* writer, 1855 void RawLanguageError::WriteTo(SnapshotWriter* writer,
1932 intptr_t object_id, 1856 intptr_t object_id,
1933 Snapshot::Kind kind) { 1857 Snapshot::Kind kind) {
1934 ASSERT(writer != NULL); 1858 ASSERT(writer != NULL);
1935 1859
(...skipping 16 matching lines...) Expand all
1952 1876
1953 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, 1877 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader,
1954 intptr_t object_id, 1878 intptr_t object_id,
1955 intptr_t tags, 1879 intptr_t tags,
1956 Snapshot::Kind kind) { 1880 Snapshot::Kind kind) {
1957 UnhandledException& result = UnhandledException::ZoneHandle( 1881 UnhandledException& result = UnhandledException::ZoneHandle(
1958 reader->zone(), NEW_OBJECT(UnhandledException)); 1882 reader->zone(), NEW_OBJECT(UnhandledException));
1959 reader->AddBackRef(object_id, &result, kIsDeserialized); 1883 reader->AddBackRef(object_id, &result, kIsDeserialized);
1960 1884
1961 // Set all the object fields. 1885 // Set all the object fields.
1962 // TODO(5411462): Need to assert No GC can happen here, even though 1886 READ_OBJECT_FIELDS(result,
1963 // allocations may happen. 1887 result.raw()->from(), result.raw()->to(),
1964 intptr_t num_flds = (result.raw()->to() - result.raw()->from()); 1888 kAsReference);
1965 for (intptr_t i = 0; i <= num_flds; i++) {
1966 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1967 result.StorePointer((result.raw()->from() + i),
1968 reader->PassiveObjectHandle()->raw());
1969 }
1970 1889
1971 return result.raw(); 1890 return result.raw();
1972 } 1891 }
1973 1892
1974 1893
1975 void RawUnhandledException::WriteTo(SnapshotWriter* writer, 1894 void RawUnhandledException::WriteTo(SnapshotWriter* writer,
1976 intptr_t object_id, 1895 intptr_t object_id,
1977 Snapshot::Kind kind) { 1896 Snapshot::Kind kind) {
1978 // Write out the serialization header value for this object. 1897 // Write out the serialization header value for this object.
1979 writer->WriteInlinedObjectHeader(object_id); 1898 writer->WriteInlinedObjectHeader(object_id);
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2111 intptr_t object_id, 2030 intptr_t object_id,
2112 intptr_t tags, 2031 intptr_t tags,
2113 Snapshot::Kind kind) { 2032 Snapshot::Kind kind) {
2114 ASSERT(reader != NULL); 2033 ASSERT(reader != NULL);
2115 2034
2116 // Allocate bigint object. 2035 // Allocate bigint object.
2117 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint)); 2036 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint));
2118 reader->AddBackRef(object_id, &obj, kIsDeserialized); 2037 reader->AddBackRef(object_id, &obj, kIsDeserialized);
2119 2038
2120 // Set all the object fields. 2039 // Set all the object fields.
2121 // TODO(5411462): Need to assert No GC can happen here, even though 2040 READ_OBJECT_FIELDS(obj, obj.raw()->from(), obj.raw()->to(), kAsInlinedObject);
2122 // allocations may happen.
2123 intptr_t num_flds = (obj.raw()->to() - obj.raw()->from());
2124 for (intptr_t i = 0; i <= num_flds; i++) {
2125 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsInlinedObject);
2126 obj.StorePointer(obj.raw()->from() + i,
2127 reader->PassiveObjectHandle()->raw());
2128 }
2129 2041
2130 // If it is a canonical constant make it one. 2042 // If it is a canonical constant make it one.
2131 // When reading a full snapshot we don't need to canonicalize the object 2043 // When reading a full snapshot we don't need to canonicalize the object
2132 // as it would already be a canonical object. 2044 // as it would already be a canonical object.
2133 // When reading a script snapshot or a message snapshot we always have 2045 // When reading a script snapshot or a message snapshot we always have
2134 // to canonicalize the object. 2046 // to canonicalize the object.
2135 if (RawObject::IsCanonical(tags)) { 2047 if (RawObject::IsCanonical(tags)) {
2136 if (kind == Snapshot::kFull) { 2048 if (kind == Snapshot::kFull) {
2137 // Set the canonical bit. 2049 // Set the canonical bit.
2138 obj.SetCanonical(); 2050 obj.SetCanonical();
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 2508
2597 2509
2598 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, 2510 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader,
2599 intptr_t object_id, 2511 intptr_t object_id,
2600 intptr_t tags, 2512 intptr_t tags,
2601 Snapshot::Kind kind) { 2513 Snapshot::Kind kind) {
2602 ASSERT(reader != NULL); 2514 ASSERT(reader != NULL);
2603 2515
2604 LinkedHashMap& map = LinkedHashMap::ZoneHandle( 2516 LinkedHashMap& map = LinkedHashMap::ZoneHandle(
2605 reader->zone(), LinkedHashMap::null()); 2517 reader->zone(), LinkedHashMap::null());
2606 if (kind == Snapshot::kFull || kind == Snapshot::kScript) { 2518 if ((kind == Snapshot::kFull && !reader->snapshot_code()) ||
2519 kind == Snapshot::kScript) {
2607 // The immutable maps that seed map literals are not yet VM-internal, so 2520 // The immutable maps that seed map literals are not yet VM-internal, so
2608 // we don't reach this. 2521 // we don't reach this.
2609 UNREACHABLE(); 2522 UNREACHABLE();
2610 } else { 2523 } else {
2611 // Since the map might contain itself as a key or value, allocate first. 2524 // Since the map might contain itself as a key or value, allocate first.
2612 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); 2525 if (kind == Snapshot::kFull) {
2526 map = reader->NewLinkedHashMap();
2527 } else {
2528 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind));
2529 }
2613 } 2530 }
2614 reader->AddBackRef(object_id, &map, kIsDeserialized); 2531 reader->AddBackRef(object_id, &map, kIsDeserialized);
2615 2532
2616 // Read the type arguments. 2533 // Read the type arguments.
2617 const intptr_t typeargs_offset = 2534 const intptr_t typeargs_offset =
2618 GrowableObjectArray::type_arguments_offset() / kWordSize; 2535 GrowableObjectArray::type_arguments_offset() / kWordSize;
2619 *reader->TypeArgumentsHandle() ^= 2536 *reader->TypeArgumentsHandle() ^=
2620 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); 2537 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
2621 map.SetTypeArguments(*reader->TypeArgumentsHandle()); 2538 map.SetTypeArguments(*reader->TypeArgumentsHandle());
2622 2539
2623 // Read the number of key/value pairs. 2540 // Read the number of key/value pairs.
2624 intptr_t len = reader->ReadSmiValue(); 2541 intptr_t len = reader->ReadSmiValue();
2625 intptr_t used_data = (len << 1); 2542 intptr_t used_data = (len << 1);
2626 map.SetUsedData(used_data); 2543 map.SetUsedData(used_data);
2627 2544
2628 // Allocate the data array. 2545 // Allocate the data array.
2629 intptr_t data_size = Utils::Maximum( 2546 intptr_t data_size = Utils::Maximum(
2630 Utils::RoundUpToPowerOfTwo(used_data), 2547 Utils::RoundUpToPowerOfTwo(used_data),
2631 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); 2548 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize));
2632 Array& data = Array::ZoneHandle(reader->zone(), 2549 Array& data = Array::ZoneHandle(reader->zone(),
2633 Array::New(data_size, HEAP_SPACE(kind))); 2550 NEW_OBJECT_WITH_LEN_SPACE(Array,
2551 data_size,
2552 kind));
2634 map.SetData(data); 2553 map.SetData(data);
2635 map.SetDeletedKeys(0); 2554 map.SetDeletedKeys(0);
2636 2555
2637 // The index and hashMask is regenerated by the maps themselves on demand. 2556 // The index and hashMask is regenerated by the maps themselves on demand.
2638 // Thus, the index will probably be allocated in new space (unless it's huge). 2557 // Thus, the index will probably be allocated in new space (unless it's huge).
2639 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and 2558 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and
2640 // in particular, if/when (const) maps are needed in the VM isolate snapshot. 2559 // in particular, if/when (const) maps are needed in the VM isolate snapshot.
2641 ASSERT(reader->isolate() != Dart::vm_isolate()); 2560 ASSERT(reader->isolate() != Dart::vm_isolate());
2642 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. 2561 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback.
2643 2562
2644 // Read the keys and values. 2563 // Read the keys and values.
2645 bool as_reference = RawObject::IsCanonical(tags) ? false : true; 2564 bool as_reference = RawObject::IsCanonical(tags) ? false : true;
2646 for (intptr_t i = 0; i < used_data; i++) { 2565 for (intptr_t i = 0; i < used_data; i++) {
2647 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference); 2566 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference);
2648 data.SetAt(i, *reader->PassiveObjectHandle()); 2567 data.SetAt(i, *reader->PassiveObjectHandle());
2649 } 2568 }
2650 return map.raw(); 2569 return map.raw();
2651 } 2570 }
2652 2571
2653 2572
2654 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, 2573 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer,
2655 intptr_t object_id, 2574 intptr_t object_id,
2656 Snapshot::Kind kind) { 2575 Snapshot::Kind kind) {
2657 if (kind == Snapshot::kFull || kind == Snapshot::kScript) { 2576 if ((kind == Snapshot::kFull && !writer->snapshot_code()) ||
2577 kind == Snapshot::kScript) {
2658 // The immutable maps that seed map literals are not yet VM-internal, so 2578 // The immutable maps that seed map literals are not yet VM-internal, so
2659 // we don't reach this. 2579 // we don't reach this.
2660 UNREACHABLE();
2661 } 2580 }
2662 ASSERT(writer != NULL); 2581 ASSERT(writer != NULL);
2663 2582
2664 // Write out the serialization header value for this object. 2583 // Write out the serialization header value for this object.
2665 writer->WriteInlinedObjectHeader(object_id); 2584 writer->WriteInlinedObjectHeader(object_id);
2666 2585
2667 // Write out the class and tags information. 2586 // Write out the class and tags information.
2668 writer->WriteIndexedObject(kLinkedHashMapCid); 2587 writer->WriteIndexedObject(kLinkedHashMapCid);
2669 const uword tags = writer->GetObjectTags(this); 2588 const uword tags = writer->GetObjectTags(this);
2670 writer->WriteTags(tags); 2589 writer->WriteTags(tags);
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
3096 } else { 3015 } else {
3097 UNREACHABLE(); 3016 UNREACHABLE();
3098 } 3017 }
3099 } 3018 }
3100 3019
3101 3020
3102 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader, 3021 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader,
3103 intptr_t object_id, 3022 intptr_t object_id,
3104 intptr_t tags, 3023 intptr_t tags,
3105 Snapshot::Kind kind) { 3024 Snapshot::Kind kind) {
3025 ASSERT(kind == Snapshot::kMessage || reader->snapshot_code());
3026
3106 uint64_t id = reader->Read<uint64_t>(); 3027 uint64_t id = reader->Read<uint64_t>();
3107 uint64_t origin_id = reader->Read<uint64_t>(); 3028 uint64_t origin_id = reader->Read<uint64_t>();
3108 3029
3109 SendPort& result = SendPort::ZoneHandle(reader->zone(), 3030 SendPort& result = SendPort::ZoneHandle(reader->zone());
3110 SendPort::New(id, origin_id)); 3031 if (reader->snapshot_code()) {
3032 // TODO(rmacnak): Reset fields in precompiled snapshots and assert
3033 // this is unreachable.
3034 } else {
3035 result = SendPort::New(id, origin_id);
3036 }
3111 reader->AddBackRef(object_id, &result, kIsDeserialized); 3037 reader->AddBackRef(object_id, &result, kIsDeserialized);
3112 return result.raw(); 3038 return result.raw();
3113 } 3039 }
3114 3040
3115 3041
3116 void RawSendPort::WriteTo(SnapshotWriter* writer, 3042 void RawSendPort::WriteTo(SnapshotWriter* writer,
3117 intptr_t object_id, 3043 intptr_t object_id,
3118 Snapshot::Kind kind) { 3044 Snapshot::Kind kind) {
3119 // Write out the serialization header value for this object. 3045 // Write out the serialization header value for this object.
3120 writer->WriteInlinedObjectHeader(object_id); 3046 writer->WriteInlinedObjectHeader(object_id);
3121 3047
3122 // Write out the class and tags information. 3048 // Write out the class and tags information.
3123 writer->WriteIndexedObject(kSendPortCid); 3049 writer->WriteIndexedObject(kSendPortCid);
3124 writer->WriteTags(writer->GetObjectTags(this)); 3050 writer->WriteTags(writer->GetObjectTags(this));
3125 3051
3126 writer->Write<uint64_t>(ptr()->id_); 3052 writer->Write<uint64_t>(ptr()->id_);
3127 writer->Write<uint64_t>(ptr()->origin_id_); 3053 writer->Write<uint64_t>(ptr()->origin_id_);
3128 } 3054 }
3129 3055
3130 3056
3131 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader, 3057 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader,
3132 intptr_t object_id, 3058 intptr_t object_id,
3133 intptr_t tags, 3059 intptr_t tags,
3134 Snapshot::Kind kind) { 3060 Snapshot::Kind kind) {
3135 if (kind == Snapshot::kFull) { 3061 if (kind == Snapshot::kFull) {
3136 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(), 3062 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(),
3137 reader->NewStacktrace()); 3063 reader->NewStacktrace());
3138 reader->AddBackRef(object_id, &result, kIsDeserialized); 3064 reader->AddBackRef(object_id, &result, kIsDeserialized);
3139 3065
3140 // Set all the object fields.
3141 // TODO(5411462): Need to assert No GC can happen here, even though
3142 // allocations may happen.
3143 intptr_t num_flds = (result.raw()->to() - result.raw()->from());
3144 for (intptr_t i = 0; i <= num_flds; i++) {
3145 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
3146 result.StorePointer((result.raw()->from() + i),
3147 reader->PassiveObjectHandle()->raw());
3148 }
3149
3150 bool expand_inlined = reader->Read<bool>(); 3066 bool expand_inlined = reader->Read<bool>();
3151 result.set_expand_inlined(expand_inlined); 3067 result.set_expand_inlined(expand_inlined);
3152 3068
3069 // Set all the object fields.
3070 READ_OBJECT_FIELDS(result,
3071 result.raw()->from(), result.raw()->to(),
3072 kAsReference);
3073
3153 return result.raw(); 3074 return result.raw();
3154 } 3075 }
3155 UNREACHABLE(); // Stacktraces are not sent in a snapshot. 3076 UNREACHABLE(); // Stacktraces are not sent in a snapshot.
3156 return Stacktrace::null(); 3077 return Stacktrace::null();
3157 } 3078 }
3158 3079
3159 3080
3160 void RawStacktrace::WriteTo(SnapshotWriter* writer, 3081 void RawStacktrace::WriteTo(SnapshotWriter* writer,
3161 intptr_t object_id, 3082 intptr_t object_id,
3162 Snapshot::Kind kind) { 3083 Snapshot::Kind kind) {
3163 if (kind == Snapshot::kFull) { 3084 if (kind == Snapshot::kFull) {
3164 ASSERT(writer != NULL); 3085 ASSERT(writer != NULL);
3165 ASSERT(this == Isolate::Current()->object_store()-> 3086 ASSERT(this == Isolate::Current()->object_store()->
3166 preallocated_stack_trace()); 3087 preallocated_stack_trace());
3167 3088
3168 // Write out the serialization header value for this object. 3089 // Write out the serialization header value for this object.
3169 writer->WriteInlinedObjectHeader(object_id); 3090 writer->WriteInlinedObjectHeader(object_id);
3170 3091
3171 // Write out the class and tags information. 3092 // Write out the class and tags information.
3172 writer->WriteIndexedObject(kStacktraceCid); 3093 writer->WriteIndexedObject(kStacktraceCid);
3173 writer->WriteTags(writer->GetObjectTags(this)); 3094 writer->WriteTags(writer->GetObjectTags(this));
3174 3095
3096 writer->Write(ptr()->expand_inlined_);
3097
3175 // Write out all the object pointer fields. 3098 // Write out all the object pointer fields.
3176 SnapshotWriterVisitor visitor(writer); 3099 SnapshotWriterVisitor visitor(writer);
3177 visitor.VisitPointers(from(), to()); 3100 visitor.VisitPointers(from(), to());
3178
3179 writer->Write(ptr()->expand_inlined_);
3180 } else { 3101 } else {
3181 // Stacktraces are not allowed in other snapshot forms. 3102 // Stacktraces are not allowed in other snapshot forms.
3182 writer->SetWriteException(Exceptions::kArgument, 3103 writer->SetWriteException(Exceptions::kArgument,
3183 "Illegal argument in isolate message" 3104 "Illegal argument in isolate message"
3184 " : (object is a stacktrace)"); 3105 " : (object is a stacktrace)");
3185 } 3106 }
3186 } 3107 }
3187 3108
3188 3109
3189 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader, 3110 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3239 intptr_t tags, 3160 intptr_t tags,
3240 Snapshot::Kind kind) { 3161 Snapshot::Kind kind) {
3241 ASSERT(reader != NULL); 3162 ASSERT(reader != NULL);
3242 3163
3243 // Allocate the weak property object. 3164 // Allocate the weak property object.
3244 WeakProperty& weak_property = WeakProperty::ZoneHandle( 3165 WeakProperty& weak_property = WeakProperty::ZoneHandle(
3245 reader->zone(), WeakProperty::New(HEAP_SPACE(kind))); 3166 reader->zone(), WeakProperty::New(HEAP_SPACE(kind)));
3246 reader->AddBackRef(object_id, &weak_property, kIsDeserialized); 3167 reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
3247 3168
3248 // Set all the object fields. 3169 // Set all the object fields.
3249 // TODO(5411462): Need to assert No GC can happen here, even though 3170 READ_OBJECT_FIELDS(weak_property,
3250 // allocations may happen. 3171 weak_property.raw()->from(), weak_property.raw()->to(),
3251 intptr_t num_flds = (weak_property.raw()->to() - 3172 kAsReference);
3252 weak_property.raw()->from());
3253 for (intptr_t i = 0; i <= num_flds; i++) {
3254 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
3255 weak_property.StorePointer((weak_property.raw()->from() + i),
3256 reader->PassiveObjectHandle()->raw());
3257 }
3258 3173
3259 return weak_property.raw(); 3174 return weak_property.raw();
3260 } 3175 }
3261 3176
3262 3177
3263 void RawWeakProperty::WriteTo(SnapshotWriter* writer, 3178 void RawWeakProperty::WriteTo(SnapshotWriter* writer,
3264 intptr_t object_id, 3179 intptr_t object_id,
3265 Snapshot::Kind kind) { 3180 Snapshot::Kind kind) {
3266 ASSERT(writer != NULL); 3181 ASSERT(writer != NULL);
3267 3182
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3317 // We do not allow objects with native fields in an isolate message. 3232 // We do not allow objects with native fields in an isolate message.
3318 writer->SetWriteException(Exceptions::kArgument, 3233 writer->SetWriteException(Exceptions::kArgument,
3319 "Illegal argument in isolate message" 3234 "Illegal argument in isolate message"
3320 " : (object is a UserTag)"); 3235 " : (object is a UserTag)");
3321 } else { 3236 } else {
3322 UNREACHABLE(); 3237 UNREACHABLE();
3323 } 3238 }
3324 } 3239 }
3325 3240
3326 } // namespace dart 3241 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698