OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/native_entry.h" | 5 #include "vm/native_entry.h" |
6 #include "vm/object.h" | 6 #include "vm/object.h" |
7 #include "vm/object_store.h" | 7 #include "vm/object_store.h" |
8 #include "vm/snapshot.h" | 8 #include "vm/snapshot.h" |
9 #include "vm/stub_code.h" | 9 #include "vm/stub_code.h" |
10 #include "vm/symbols.h" | 10 #include "vm/symbols.h" |
11 #include "vm/visitor.h" | 11 #include "vm/visitor.h" |
12 | 12 |
13 namespace dart { | 13 namespace dart { |
14 | 14 |
15 DECLARE_FLAG(bool, remove_script_timestamps_for_test); | 15 DECLARE_FLAG(bool, remove_script_timestamps_for_test); |
16 | 16 |
17 #define NEW_OBJECT(type) \ | |
18 ((Snapshot::IsFull(kind)) ? reader->New##type() : type::New()) | |
19 | |
20 #define NEW_OBJECT_WITH_LEN(type, len) \ | |
21 ((Snapshot::IsFull(kind)) ? reader->New##type(len) : type::New(len)) | |
22 | |
23 #define NEW_OBJECT_WITH_LEN_SPACE(type, len, kind) \ | |
24 ((Snapshot::IsFull(kind)) ? \ | |
25 reader->New##type(len) : type::New(len, HEAP_SPACE(kind))) | |
26 | |
27 #define OFFSET_OF_FROM(obj) \ | 17 #define OFFSET_OF_FROM(obj) \ |
28 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr()) | 18 obj.raw()->from() - reinterpret_cast<RawObject**>(obj.raw()->ptr()) |
29 | 19 |
30 // TODO(18854): Need to assert No GC can happen here, even though | 20 // TODO(18854): Need to assert No GC can happen here, even though |
31 // allocations may happen. | 21 // allocations may happen. |
32 #define READ_OBJECT_FIELDS(object, from, to, as_reference) \ | 22 #define READ_OBJECT_FIELDS(object, from, to, as_reference) \ |
33 intptr_t num_flds = (to) - (from); \ | 23 intptr_t num_flds = (to) - (from); \ |
34 intptr_t from_offset = OFFSET_OF_FROM(object); \ | 24 intptr_t from_offset = OFFSET_OF_FROM(object); \ |
35 for (intptr_t i = 0; i <= num_flds; i++) { \ | 25 for (intptr_t i = 0; i <= num_flds; i++) { \ |
36 (*reader->PassiveObjectHandle()) = \ | 26 (*reader->PassiveObjectHandle()) = \ |
37 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \ | 27 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \ |
38 object.StorePointer(((from) + i), \ | 28 object.StorePointer(((from) + i), \ |
39 reader->PassiveObjectHandle()->raw()); \ | 29 reader->PassiveObjectHandle()->raw()); \ |
40 } | 30 } |
41 | 31 |
42 RawClass* Class::ReadFrom(SnapshotReader* reader, | 32 RawClass* Class::ReadFrom(SnapshotReader* reader, |
43 intptr_t object_id, | 33 intptr_t object_id, |
44 intptr_t tags, | 34 intptr_t tags, |
45 Snapshot::Kind kind, | 35 Snapshot::Kind kind, |
46 bool as_reference) { | 36 bool as_reference) { |
47 ASSERT(reader != NULL); | 37 ASSERT(reader != NULL); |
48 | 38 |
49 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); | 39 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); |
50 bool is_in_fullsnapshot = reader->Read<bool>(); | 40 bool is_in_fullsnapshot = reader->Read<bool>(); |
51 if (Snapshot::IsFull(kind) || | 41 if ((kind == Snapshot::kScript) && !is_in_fullsnapshot) { |
52 (kind == Snapshot::kScript && !is_in_fullsnapshot)) { | |
53 // Read in the base information. | 42 // Read in the base information. |
54 classid_t class_id = reader->ReadClassIDValue(); | 43 classid_t class_id = reader->ReadClassIDValue(); |
55 | 44 |
56 // Allocate class object of specified kind. | 45 // Allocate class object of specified kind. |
57 if (Snapshot::IsFull(kind)) { | 46 if (class_id < kNumPredefinedCids) { |
58 cls = reader->NewClass(class_id); | 47 ASSERT((class_id >= kInstanceCid) && (class_id <= kMirrorReferenceCid)); |
| 48 cls = reader->isolate()->class_table()->At(class_id); |
59 } else { | 49 } else { |
60 if (class_id < kNumPredefinedCids) { | 50 cls = Class::NewInstanceClass(); |
61 ASSERT((class_id >= kInstanceCid) && (class_id <= kMirrorReferenceCid)); | |
62 cls = reader->isolate()->class_table()->At(class_id); | |
63 } else { | |
64 cls = Class::NewInstanceClass(); | |
65 } | |
66 } | 51 } |
67 reader->AddBackRef(object_id, &cls, kIsDeserialized); | 52 reader->AddBackRef(object_id, &cls, kIsDeserialized); |
68 | 53 |
69 // Set all non object fields. | 54 // Set all non object fields. |
70 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { | 55 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { |
71 // Instance size of a VM defined class is already set up. | 56 // Instance size of a VM defined class is already set up. |
72 cls.set_instance_size_in_words(reader->Read<int32_t>()); | 57 cls.set_instance_size_in_words(reader->Read<int32_t>()); |
73 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); | 58 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); |
74 } | 59 } |
75 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); | 60 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); |
76 cls.set_num_type_arguments(reader->Read<int16_t>()); | 61 cls.set_num_type_arguments(reader->Read<int16_t>()); |
77 cls.set_num_own_type_arguments(reader->Read<int16_t>()); | 62 cls.set_num_own_type_arguments(reader->Read<int16_t>()); |
78 cls.set_num_native_fields(reader->Read<uint16_t>()); | 63 cls.set_num_native_fields(reader->Read<uint16_t>()); |
79 cls.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); | 64 cls.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
80 cls.set_state_bits(reader->Read<uint16_t>()); | 65 cls.set_state_bits(reader->Read<uint16_t>()); |
81 | 66 |
82 // Set all the object fields. | 67 // Set all the object fields. |
83 READ_OBJECT_FIELDS(cls, | 68 READ_OBJECT_FIELDS(cls, |
84 cls.raw()->from(), | 69 cls.raw()->from(), |
85 cls.raw()->to_snapshot(kind), | 70 cls.raw()->to_snapshot(kind), |
86 kAsReference); | 71 kAsReference); |
87 cls.StorePointer(&cls.raw_ptr()->dependent_code_, Array::null()); | 72 cls.StorePointer(&cls.raw_ptr()->dependent_code_, Array::null()); |
88 ASSERT(!cls.IsInFullSnapshot() || (Snapshot::IsFull(kind))); | 73 ASSERT(!cls.IsInFullSnapshot()); |
89 } else { | 74 } else { |
90 cls ^= reader->ReadClassId(object_id); | 75 cls ^= reader->ReadClassId(object_id); |
91 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); | 76 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); |
92 } | 77 } |
93 return cls.raw(); | 78 return cls.raw(); |
94 } | 79 } |
95 | 80 |
96 | 81 |
97 void RawClass::WriteTo(SnapshotWriter* writer, | 82 void RawClass::WriteTo(SnapshotWriter* writer, |
98 intptr_t object_id, | 83 intptr_t object_id, |
99 Snapshot::Kind kind, | 84 Snapshot::Kind kind, |
100 bool as_reference) { | 85 bool as_reference) { |
101 ASSERT(writer != NULL); | 86 ASSERT(writer != NULL); |
102 bool is_in_fullsnapshot = Class::IsInFullSnapshot(this); | 87 bool is_in_fullsnapshot = Class::IsInFullSnapshot(this); |
103 | 88 |
104 // Write out the serialization header value for this object. | 89 // Write out the serialization header value for this object. |
105 writer->WriteInlinedObjectHeader(object_id); | 90 writer->WriteInlinedObjectHeader(object_id); |
106 | 91 |
107 // Write out the class and tags information. | 92 // Write out the class and tags information. |
108 writer->WriteVMIsolateObject(kClassCid); | 93 writer->WriteVMIsolateObject(kClassCid); |
109 writer->WriteTags(writer->GetObjectTags(this)); | 94 writer->WriteTags(writer->GetObjectTags(this)); |
110 | 95 |
111 // Write out the boolean is_in_fullsnapshot first as this will | 96 // Write out the boolean is_in_fullsnapshot first as this will |
112 // help the reader decide how the rest of the information needs | 97 // help the reader decide how the rest of the information needs |
113 // to be interpreted. | 98 // to be interpreted. |
114 writer->Write<bool>(is_in_fullsnapshot); | 99 writer->Write<bool>(is_in_fullsnapshot); |
115 | 100 |
116 if (Snapshot::IsFull(kind) || | 101 if ((kind == Snapshot::kScript) && !is_in_fullsnapshot) { |
117 (kind == Snapshot::kScript && !is_in_fullsnapshot)) { | |
118 // Write out all the non object pointer fields. | 102 // Write out all the non object pointer fields. |
119 // NOTE: cpp_vtable_ is not written. | 103 // NOTE: cpp_vtable_ is not written. |
120 classid_t class_id = ptr()->id_; | 104 classid_t class_id = ptr()->id_; |
121 ASSERT(class_id != kIllegalCid); | 105 ASSERT(class_id != kIllegalCid); |
122 writer->Write<classid_t>(class_id); | 106 writer->Write<classid_t>(class_id); |
123 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { | 107 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { |
124 // We don't write the instance size of VM defined classes as they | 108 // We don't write the instance size of VM defined classes as they |
125 // are already setup during initialization as part of pre populating | 109 // are already setup during initialization as part of pre populating |
126 // the class table. | 110 // the class table. |
127 writer->Write<int32_t>(ptr()->instance_size_in_words_); | 111 writer->Write<int32_t>(ptr()->instance_size_in_words_); |
(...skipping 25 matching lines...) Expand all Loading... |
153 | 137 |
154 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader, | 138 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader, |
155 intptr_t object_id, | 139 intptr_t object_id, |
156 intptr_t tags, | 140 intptr_t tags, |
157 Snapshot::Kind kind, | 141 Snapshot::Kind kind, |
158 bool as_reference) { | 142 bool as_reference) { |
159 ASSERT(reader != NULL); | 143 ASSERT(reader != NULL); |
160 | 144 |
161 // Allocate unresolved class object. | 145 // Allocate unresolved class object. |
162 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( | 146 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( |
163 reader->zone(), NEW_OBJECT(UnresolvedClass)); | 147 reader->zone(), UnresolvedClass::New()); |
164 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); | 148 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); |
165 | 149 |
166 // Set all non object fields. | 150 // Set all non object fields. |
167 unresolved_class.set_token_pos( | 151 unresolved_class.set_token_pos( |
168 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); | 152 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
169 | 153 |
170 // Set all the object fields. | 154 // Set all the object fields. |
171 READ_OBJECT_FIELDS(unresolved_class, | 155 READ_OBJECT_FIELDS(unresolved_class, |
172 unresolved_class.raw()->from(), | 156 unresolved_class.raw()->from(), |
173 unresolved_class.raw()->to(), | 157 unresolved_class.raw()->to(), |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 intptr_t object_id, | 205 intptr_t object_id, |
222 intptr_t tags, | 206 intptr_t tags, |
223 Snapshot::Kind kind, | 207 Snapshot::Kind kind, |
224 bool as_reference) { | 208 bool as_reference) { |
225 ASSERT(reader != NULL); | 209 ASSERT(reader != NULL); |
226 | 210 |
227 // Determine if the type class of this type is in the full snapshot. | 211 // Determine if the type class of this type is in the full snapshot. |
228 bool typeclass_is_in_fullsnapshot = reader->Read<bool>(); | 212 bool typeclass_is_in_fullsnapshot = reader->Read<bool>(); |
229 | 213 |
230 // Allocate type object. | 214 // Allocate type object. |
231 Type& type = Type::ZoneHandle(reader->zone(), NEW_OBJECT(Type)); | 215 Type& type = Type::ZoneHandle(reader->zone(), Type::New()); |
232 bool is_canonical = RawObject::IsCanonical(tags); | 216 bool is_canonical = RawObject::IsCanonical(tags); |
233 bool defer_canonicalization = is_canonical && | 217 bool defer_canonicalization = is_canonical && |
234 (!Snapshot::IsFull(kind) && typeclass_is_in_fullsnapshot); | 218 (!Snapshot::IsFull(kind) && typeclass_is_in_fullsnapshot); |
235 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); | 219 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); |
236 | 220 |
237 // Set all non object fields. | 221 // Set all non object fields. |
238 type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); | 222 type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
239 type.set_type_state(reader->Read<int8_t>()); | 223 type.set_type_state(reader->Read<int8_t>()); |
240 | 224 |
241 // Set all the object fields. | 225 // Set all the object fields. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 | 286 |
303 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader, | 287 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader, |
304 intptr_t object_id, | 288 intptr_t object_id, |
305 intptr_t tags, | 289 intptr_t tags, |
306 Snapshot::Kind kind, | 290 Snapshot::Kind kind, |
307 bool as_reference) { | 291 bool as_reference) { |
308 ASSERT(reader != NULL); | 292 ASSERT(reader != NULL); |
309 | 293 |
310 // Allocate type ref object. | 294 // Allocate type ref object. |
311 TypeRef& type_ref = TypeRef::ZoneHandle( | 295 TypeRef& type_ref = TypeRef::ZoneHandle( |
312 reader->zone(), NEW_OBJECT(TypeRef)); | 296 reader->zone(), TypeRef::New()); |
313 reader->AddBackRef(object_id, &type_ref, kIsDeserialized); | 297 reader->AddBackRef(object_id, &type_ref, kIsDeserialized); |
314 | 298 |
315 // Set all the object fields. | 299 // Set all the object fields. |
316 READ_OBJECT_FIELDS(type_ref, | 300 READ_OBJECT_FIELDS(type_ref, |
317 type_ref.raw()->from(), type_ref.raw()->to(), | 301 type_ref.raw()->from(), type_ref.raw()->to(), |
318 kAsReference); | 302 kAsReference); |
319 | 303 |
320 return type_ref.raw(); | 304 return type_ref.raw(); |
321 } | 305 } |
322 | 306 |
(...skipping 19 matching lines...) Expand all Loading... |
342 | 326 |
343 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader, | 327 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader, |
344 intptr_t object_id, | 328 intptr_t object_id, |
345 intptr_t tags, | 329 intptr_t tags, |
346 Snapshot::Kind kind, | 330 Snapshot::Kind kind, |
347 bool as_reference) { | 331 bool as_reference) { |
348 ASSERT(reader != NULL); | 332 ASSERT(reader != NULL); |
349 | 333 |
350 // Allocate type parameter object. | 334 // Allocate type parameter object. |
351 TypeParameter& type_parameter = TypeParameter::ZoneHandle( | 335 TypeParameter& type_parameter = TypeParameter::ZoneHandle( |
352 reader->zone(), NEW_OBJECT(TypeParameter)); | 336 reader->zone(), TypeParameter::New()); |
353 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); | 337 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); |
354 | 338 |
355 // Set all non object fields. | 339 // Set all non object fields. |
356 type_parameter.set_token_pos( | 340 type_parameter.set_token_pos( |
357 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); | 341 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
358 type_parameter.set_index(reader->Read<int16_t>()); | 342 type_parameter.set_index(reader->Read<int16_t>()); |
359 type_parameter.set_type_state(reader->Read<int8_t>()); | 343 type_parameter.set_type_state(reader->Read<int8_t>()); |
360 | 344 |
361 // Set all the object fields. | 345 // Set all the object fields. |
362 READ_OBJECT_FIELDS(type_parameter, | 346 READ_OBJECT_FIELDS(type_parameter, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 | 390 |
407 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader, | 391 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader, |
408 intptr_t object_id, | 392 intptr_t object_id, |
409 intptr_t tags, | 393 intptr_t tags, |
410 Snapshot::Kind kind, | 394 Snapshot::Kind kind, |
411 bool as_reference) { | 395 bool as_reference) { |
412 ASSERT(reader != NULL); | 396 ASSERT(reader != NULL); |
413 | 397 |
414 // Allocate bounded type object. | 398 // Allocate bounded type object. |
415 BoundedType& bounded_type = BoundedType::ZoneHandle( | 399 BoundedType& bounded_type = BoundedType::ZoneHandle( |
416 reader->zone(), NEW_OBJECT(BoundedType)); | 400 reader->zone(), BoundedType::New()); |
417 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized); | 401 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized); |
418 | 402 |
419 // Set all the object fields. | 403 // Set all the object fields. |
420 READ_OBJECT_FIELDS(bounded_type, | 404 READ_OBJECT_FIELDS(bounded_type, |
421 bounded_type.raw()->from(), bounded_type.raw()->to(), | 405 bounded_type.raw()->from(), bounded_type.raw()->to(), |
422 kAsReference); | 406 kAsReference); |
423 | 407 |
424 return bounded_type.raw(); | 408 return bounded_type.raw(); |
425 } | 409 } |
426 | 410 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 intptr_t object_id, | 450 intptr_t object_id, |
467 intptr_t tags, | 451 intptr_t tags, |
468 Snapshot::Kind kind, | 452 Snapshot::Kind kind, |
469 bool as_reference) { | 453 bool as_reference) { |
470 ASSERT(reader != NULL); | 454 ASSERT(reader != NULL); |
471 | 455 |
472 // Read the length so that we can determine instance size to allocate. | 456 // Read the length so that we can determine instance size to allocate. |
473 intptr_t len = reader->ReadSmiValue(); | 457 intptr_t len = reader->ReadSmiValue(); |
474 | 458 |
475 TypeArguments& type_arguments = TypeArguments::ZoneHandle( | 459 TypeArguments& type_arguments = TypeArguments::ZoneHandle( |
476 reader->zone(), NEW_OBJECT_WITH_LEN_SPACE(TypeArguments, len, kind)); | 460 reader->zone(), TypeArguments::New(len, HEAP_SPACE(kind))); |
477 bool is_canonical = RawObject::IsCanonical(tags); | 461 bool is_canonical = RawObject::IsCanonical(tags); |
478 bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind)); | 462 bool defer_canonicalization = is_canonical && (!Snapshot::IsFull(kind)); |
479 reader->AddBackRef(object_id, | 463 reader->AddBackRef(object_id, |
480 &type_arguments, | 464 &type_arguments, |
481 kIsDeserialized, | 465 kIsDeserialized, |
482 defer_canonicalization); | 466 defer_canonicalization); |
483 | 467 |
484 // Set the instantiations field, which is only read from a full snapshot. | 468 // Set the instantiations field, which is only read from a full snapshot. |
485 if (Snapshot::IsFull(kind)) { | 469 type_arguments.set_instantiations(Object::zero_array()); |
486 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); | |
487 type_arguments.set_instantiations(*(reader->ArrayHandle())); | |
488 } else { | |
489 type_arguments.set_instantiations(Object::zero_array()); | |
490 } | |
491 | 470 |
492 // Now set all the type fields. | 471 // Now set all the type fields. |
493 intptr_t offset = type_arguments.TypeAddr(0) - | 472 intptr_t offset = type_arguments.TypeAddr(0) - |
494 reinterpret_cast<RawAbstractType**>(type_arguments.raw()->ptr()); | 473 reinterpret_cast<RawAbstractType**>(type_arguments.raw()->ptr()); |
495 for (intptr_t i = 0; i < len; i++) { | 474 for (intptr_t i = 0; i < len; i++) { |
496 *reader->TypeHandle() ^= | 475 *reader->TypeHandle() ^= |
497 reader->ReadObjectImpl(kAsReference, object_id, (i + offset)); | 476 reader->ReadObjectImpl(kAsReference, object_id, (i + offset)); |
498 type_arguments.SetTypeAt(i, *reader->TypeHandle()); | 477 type_arguments.SetTypeAt(i, *reader->TypeHandle()); |
499 } | 478 } |
500 | 479 |
(...skipping 15 matching lines...) Expand all Loading... |
516 // Write out the serialization header value for this object. | 495 // Write out the serialization header value for this object. |
517 writer->WriteInlinedObjectHeader(object_id); | 496 writer->WriteInlinedObjectHeader(object_id); |
518 | 497 |
519 // Write out the class and tags information. | 498 // Write out the class and tags information. |
520 writer->WriteVMIsolateObject(kTypeArgumentsCid); | 499 writer->WriteVMIsolateObject(kTypeArgumentsCid); |
521 writer->WriteTags(writer->GetObjectTags(this)); | 500 writer->WriteTags(writer->GetObjectTags(this)); |
522 | 501 |
523 // Write out the length field. | 502 // Write out the length field. |
524 writer->Write<RawObject*>(ptr()->length_); | 503 writer->Write<RawObject*>(ptr()->length_); |
525 | 504 |
526 // Write out the instantiations field, but only in a full snapshot. | |
527 if (Snapshot::IsFull(kind)) { | |
528 writer->WriteObjectImpl(ptr()->instantiations_, kAsInlinedObject); | |
529 } | |
530 | |
531 // Write out the individual types. | 505 // Write out the individual types. |
532 intptr_t len = Smi::Value(ptr()->length_); | 506 intptr_t len = Smi::Value(ptr()->length_); |
533 for (intptr_t i = 0; i < len; i++) { | 507 for (intptr_t i = 0; i < len; i++) { |
534 writer->WriteObjectImpl(ptr()->types()[i], kAsReference); | 508 writer->WriteObjectImpl(ptr()->types()[i], kAsReference); |
535 } | 509 } |
536 } | 510 } |
537 | 511 |
538 | 512 |
539 RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader, | 513 RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader, |
540 intptr_t object_id, | 514 intptr_t object_id, |
541 intptr_t tags, | 515 intptr_t tags, |
542 Snapshot::Kind kind, | 516 Snapshot::Kind kind, |
543 bool as_reference) { | 517 bool as_reference) { |
544 ASSERT(reader != NULL); | 518 ASSERT(reader != NULL); |
| 519 ASSERT(kind == Snapshot::kScript); |
545 | 520 |
546 // Allocate function object. | 521 // Allocate function object. |
547 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), | 522 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), |
548 NEW_OBJECT(PatchClass)); | 523 PatchClass::New()); |
549 reader->AddBackRef(object_id, &cls, kIsDeserialized); | 524 reader->AddBackRef(object_id, &cls, kIsDeserialized); |
550 | 525 |
551 // Set all the object fields. | 526 // Set all the object fields. |
552 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); | 527 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); |
553 | 528 |
554 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | |
555 return cls.raw(); | 529 return cls.raw(); |
556 } | 530 } |
557 | 531 |
558 | 532 |
559 void RawPatchClass::WriteTo(SnapshotWriter* writer, | 533 void RawPatchClass::WriteTo(SnapshotWriter* writer, |
560 intptr_t object_id, | 534 intptr_t object_id, |
561 Snapshot::Kind kind, | 535 Snapshot::Kind kind, |
562 bool as_reference) { | 536 bool as_reference) { |
563 ASSERT(writer != NULL); | 537 ASSERT(writer != NULL); |
564 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 538 ASSERT(kind == Snapshot::kScript); |
565 | 539 |
566 // Write out the serialization header value for this object. | 540 // Write out the serialization header value for this object. |
567 writer->WriteInlinedObjectHeader(object_id); | 541 writer->WriteInlinedObjectHeader(object_id); |
568 | 542 |
569 // Write out the class and tags information. | 543 // Write out the class and tags information. |
570 writer->WriteVMIsolateObject(kPatchClassCid); | 544 writer->WriteVMIsolateObject(kPatchClassCid); |
571 writer->WriteTags(writer->GetObjectTags(this)); | 545 writer->WriteTags(writer->GetObjectTags(this)); |
572 // Write out all the object pointer fields. | 546 // Write out all the object pointer fields. |
573 SnapshotWriterVisitor visitor(writer, kAsReference); | 547 SnapshotWriterVisitor visitor(writer, kAsReference); |
574 visitor.VisitPointers(from(), to()); | 548 visitor.VisitPointers(from(), to()); |
575 } | 549 } |
576 | 550 |
577 | 551 |
578 RawClosure* Closure::ReadFrom(SnapshotReader* reader, | 552 RawClosure* Closure::ReadFrom(SnapshotReader* reader, |
579 intptr_t object_id, | 553 intptr_t object_id, |
580 intptr_t tags, | 554 intptr_t tags, |
581 Snapshot::Kind kind, | 555 Snapshot::Kind kind, |
582 bool as_reference) { | 556 bool as_reference) { |
583 ASSERT(reader != NULL); | 557 UNREACHABLE(); |
584 ASSERT(Snapshot::IsFull(kind)); | 558 return Closure::null(); |
585 | |
586 // Allocate closure object. | |
587 Closure& closure = Closure::ZoneHandle( | |
588 reader->zone(), NEW_OBJECT(Closure)); | |
589 reader->AddBackRef(object_id, &closure, kIsDeserialized); | |
590 | |
591 // Set all the object fields. | |
592 READ_OBJECT_FIELDS(closure, | |
593 closure.raw()->from(), closure.raw()->to(), | |
594 kAsReference); | |
595 | |
596 // Set the canonical bit. | |
597 if (RawObject::IsCanonical(tags)) { | |
598 closure.SetCanonical(); | |
599 } | |
600 return closure.raw(); | |
601 } | 559 } |
602 | 560 |
603 | 561 |
604 void RawClosure::WriteTo(SnapshotWriter* writer, | 562 void RawClosure::WriteTo(SnapshotWriter* writer, |
605 intptr_t object_id, | 563 intptr_t object_id, |
606 Snapshot::Kind kind, | 564 Snapshot::Kind kind, |
607 bool as_reference) { | 565 bool as_reference) { |
608 ASSERT(writer != NULL); | 566 ASSERT(writer != NULL); |
609 if ((kind == Snapshot::kMessage) || (kind == Snapshot::kScript)) { | 567 ASSERT((kind == Snapshot::kMessage) || (kind == Snapshot::kScript)); |
610 // Check if closure is serializable, throw an exception otherwise. | 568 |
611 RawFunction* func = writer->IsSerializableClosure(this); | 569 // Check if closure is serializable, throw an exception otherwise. |
612 if (func != Function::null()) { | 570 RawFunction* func = writer->IsSerializableClosure(this); |
613 writer->WriteStaticImplicitClosure(object_id, | 571 if (func != Function::null()) { |
614 func, | 572 writer->WriteStaticImplicitClosure(object_id, |
615 writer->GetObjectTags(this)); | 573 func, |
616 return; | 574 writer->GetObjectTags(this)); |
617 } | 575 return; |
618 } | 576 } |
619 | 577 |
620 // Write out the serialization header value for this object. | 578 UNREACHABLE(); |
621 writer->WriteInlinedObjectHeader(object_id); | |
622 | |
623 // Write out the class and tags information. | |
624 writer->WriteIndexedObject(kClosureCid); | |
625 writer->WriteTags(writer->GetObjectTags(this)); | |
626 | |
627 // Write out all the object pointer fields. | |
628 SnapshotWriterVisitor visitor(writer, kAsReference); | |
629 visitor.VisitPointers(from(), to()); | |
630 } | 579 } |
631 | 580 |
632 | 581 |
633 RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader, | 582 RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader, |
634 intptr_t object_id, | 583 intptr_t object_id, |
635 intptr_t tags, | 584 intptr_t tags, |
636 Snapshot::Kind kind, | 585 Snapshot::Kind kind, |
637 bool as_reference) { | 586 bool as_reference) { |
638 ASSERT(reader != NULL); | 587 ASSERT(reader != NULL); |
639 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 588 ASSERT(kind == Snapshot::kScript); |
640 | 589 |
641 // Allocate closure data object. | 590 // Allocate closure data object. |
642 ClosureData& data = ClosureData::ZoneHandle( | 591 ClosureData& data = ClosureData::ZoneHandle(reader->zone(), |
643 reader->zone(), NEW_OBJECT(ClosureData)); | 592 ClosureData::New()); |
644 reader->AddBackRef(object_id, &data, kIsDeserialized); | 593 reader->AddBackRef(object_id, &data, kIsDeserialized); |
645 | 594 |
646 // Set all the object fields. | 595 // Set all the object fields. |
647 READ_OBJECT_FIELDS(data, | 596 READ_OBJECT_FIELDS(data, |
648 data.raw()->from(), data.raw()->to(), | 597 data.raw()->from(), data.raw()->to(), |
649 kAsInlinedObject); | 598 kAsInlinedObject); |
650 | 599 |
651 return data.raw(); | 600 return data.raw(); |
652 } | 601 } |
653 | 602 |
654 | 603 |
655 void RawClosureData::WriteTo(SnapshotWriter* writer, | 604 void RawClosureData::WriteTo(SnapshotWriter* writer, |
656 intptr_t object_id, | 605 intptr_t object_id, |
657 Snapshot::Kind kind, | 606 Snapshot::Kind kind, |
658 bool as_reference) { | 607 bool as_reference) { |
659 ASSERT(writer != NULL); | 608 ASSERT(writer != NULL); |
660 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 609 ASSERT(kind == Snapshot::kScript); |
661 | 610 |
662 // Write out the serialization header value for this object. | 611 // Write out the serialization header value for this object. |
663 writer->WriteInlinedObjectHeader(object_id); | 612 writer->WriteInlinedObjectHeader(object_id); |
664 | 613 |
665 // Write out the class and tags information. | 614 // Write out the class and tags information. |
666 writer->WriteVMIsolateObject(kClosureDataCid); | 615 writer->WriteVMIsolateObject(kClosureDataCid); |
667 writer->WriteTags(writer->GetObjectTags(this)); | 616 writer->WriteTags(writer->GetObjectTags(this)); |
668 | 617 |
669 // Context scope. | 618 // Context scope. |
670 if (ptr()->context_scope_ == Object::empty_context_scope().raw()) { | 619 if (ptr()->context_scope_ == Object::empty_context_scope().raw()) { |
671 writer->WriteVMIsolateObject(kEmptyContextScopeObject); | 620 writer->WriteVMIsolateObject(kEmptyContextScopeObject); |
672 } else if (ptr()->context_scope_->ptr()->is_implicit_ || | 621 } else if (ptr()->context_scope_->ptr()->is_implicit_) { |
673 (kind == Snapshot::kAppWithJIT)) { | |
674 writer->WriteObjectImpl(ptr()->context_scope_, kAsInlinedObject); | 622 writer->WriteObjectImpl(ptr()->context_scope_, kAsInlinedObject); |
675 } else { | 623 } else { |
676 // We don't write non implicit context scopes in the snapshot. | 624 // We don't write non implicit context scopes in the snapshot. |
677 writer->WriteVMIsolateObject(kNullObject); | 625 writer->WriteVMIsolateObject(kNullObject); |
678 } | 626 } |
679 | 627 |
680 // Parent function. | 628 // Parent function. |
681 writer->WriteObjectImpl(ptr()->parent_function_, kAsInlinedObject); | 629 writer->WriteObjectImpl(ptr()->parent_function_, kAsInlinedObject); |
682 | 630 |
683 // Signature type. | 631 // Signature type. |
684 writer->WriteObjectImpl(ptr()->signature_type_, kAsInlinedObject); | 632 writer->WriteObjectImpl(ptr()->signature_type_, kAsInlinedObject); |
685 | 633 |
686 // Canonical static closure. | 634 // Canonical static closure. |
687 writer->WriteObjectImpl(ptr()->closure_, kAsInlinedObject); | 635 writer->WriteObjectImpl(ptr()->closure_, kAsInlinedObject); |
688 } | 636 } |
689 | 637 |
690 | 638 |
691 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader, | 639 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader, |
692 intptr_t object_id, | 640 intptr_t object_id, |
693 intptr_t tags, | 641 intptr_t tags, |
694 Snapshot::Kind kind, | 642 Snapshot::Kind kind, |
695 bool as_reference) { | 643 bool as_reference) { |
696 ASSERT(reader != NULL); | 644 ASSERT(reader != NULL); |
697 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 645 ASSERT(kind == Snapshot::kScript); |
698 | 646 |
699 // Allocate redirection data object. | 647 // Allocate redirection data object. |
700 RedirectionData& data = RedirectionData::ZoneHandle( | 648 RedirectionData& data = RedirectionData::ZoneHandle(reader->zone(), |
701 reader->zone(), NEW_OBJECT(RedirectionData)); | 649 RedirectionData::New()); |
702 reader->AddBackRef(object_id, &data, kIsDeserialized); | 650 reader->AddBackRef(object_id, &data, kIsDeserialized); |
703 | 651 |
704 // Set all the object fields. | 652 // Set all the object fields. |
705 READ_OBJECT_FIELDS(data, | 653 READ_OBJECT_FIELDS(data, |
706 data.raw()->from(), data.raw()->to(), | 654 data.raw()->from(), data.raw()->to(), |
707 kAsReference); | 655 kAsReference); |
708 | 656 |
709 return data.raw(); | 657 return data.raw(); |
710 } | 658 } |
711 | 659 |
712 | 660 |
713 void RawRedirectionData::WriteTo(SnapshotWriter* writer, | 661 void RawRedirectionData::WriteTo(SnapshotWriter* writer, |
714 intptr_t object_id, | 662 intptr_t object_id, |
715 Snapshot::Kind kind, | 663 Snapshot::Kind kind, |
716 bool as_reference) { | 664 bool as_reference) { |
717 ASSERT(writer != NULL); | 665 ASSERT(writer != NULL); |
718 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 666 ASSERT(kind == Snapshot::kScript); |
719 | 667 |
720 // Write out the serialization header value for this object. | 668 // Write out the serialization header value for this object. |
721 writer->WriteInlinedObjectHeader(object_id); | 669 writer->WriteInlinedObjectHeader(object_id); |
722 | 670 |
723 // Write out the class and tags information. | 671 // Write out the class and tags information. |
724 writer->WriteVMIsolateObject(kRedirectionDataCid); | 672 writer->WriteVMIsolateObject(kRedirectionDataCid); |
725 writer->WriteTags(writer->GetObjectTags(this)); | 673 writer->WriteTags(writer->GetObjectTags(this)); |
726 | 674 |
727 // Write out all the object pointer fields. | 675 // Write out all the object pointer fields. |
728 SnapshotWriterVisitor visitor(writer, kAsReference); | 676 SnapshotWriterVisitor visitor(writer, kAsReference); |
729 visitor.VisitPointers(from(), to()); | 677 visitor.VisitPointers(from(), to()); |
730 } | 678 } |
731 | 679 |
732 | 680 |
733 RawFunction* Function::ReadFrom(SnapshotReader* reader, | 681 RawFunction* Function::ReadFrom(SnapshotReader* reader, |
734 intptr_t object_id, | 682 intptr_t object_id, |
735 intptr_t tags, | 683 intptr_t tags, |
736 Snapshot::Kind kind, | 684 Snapshot::Kind kind, |
737 bool as_reference) { | 685 bool as_reference) { |
738 ASSERT(reader != NULL); | 686 ASSERT(reader != NULL); |
739 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 687 ASSERT(kind == Snapshot::kScript); |
740 | 688 |
741 bool is_in_fullsnapshot = reader->Read<bool>(); | 689 bool is_in_fullsnapshot = reader->Read<bool>(); |
742 if ((Snapshot::IsFull(kind)) || !is_in_fullsnapshot) { | 690 if (!is_in_fullsnapshot) { |
743 // Allocate function object. | 691 // Allocate function object. |
744 Function& func = Function::ZoneHandle( | 692 Function& func = Function::ZoneHandle(reader->zone(), |
745 reader->zone(), NEW_OBJECT(Function)); | 693 Function::New()); |
746 reader->AddBackRef(object_id, &func, kIsDeserialized); | 694 reader->AddBackRef(object_id, &func, kIsDeserialized); |
747 | 695 |
748 // Set all the non object fields. Read the token positions now but | 696 // Set all the non object fields. Read the token positions now but |
749 // don't set them until after setting the kind. | 697 // don't set them until after setting the kind. |
750 const int32_t token_pos = reader->Read<int32_t>(); | 698 const int32_t token_pos = reader->Read<int32_t>(); |
751 const int32_t end_token_pos = reader->Read<uint32_t>(); | 699 const int32_t end_token_pos = reader->Read<uint32_t>(); |
752 func.set_num_fixed_parameters(reader->Read<int16_t>()); | 700 func.set_num_fixed_parameters(reader->Read<int16_t>()); |
753 func.set_num_optional_parameters(reader->Read<int16_t>()); | 701 func.set_num_optional_parameters(reader->Read<int16_t>()); |
754 func.set_kind_tag(reader->Read<uint32_t>()); | 702 func.set_kind_tag(reader->Read<uint32_t>()); |
755 func.set_token_pos(TokenPosition::SnapshotDecode(token_pos)); | 703 func.set_token_pos(TokenPosition::SnapshotDecode(token_pos)); |
756 func.set_end_token_pos(TokenPosition::SnapshotDecode(end_token_pos)); | 704 func.set_end_token_pos(TokenPosition::SnapshotDecode(end_token_pos)); |
757 if (kind == Snapshot::kAppNoJIT) { | 705 func.set_usage_counter(reader->Read<int32_t>()); |
758 func.set_usage_counter(0); | 706 func.set_deoptimization_counter(reader->Read<int8_t>()); |
759 func.set_deoptimization_counter(0); | 707 func.set_optimized_instruction_count(reader->Read<uint16_t>()); |
760 func.set_optimized_instruction_count(0); | 708 func.set_optimized_call_site_count(reader->Read<uint16_t>()); |
761 func.set_optimized_call_site_count(0); | |
762 } else { | |
763 func.set_usage_counter(reader->Read<int32_t>()); | |
764 func.set_deoptimization_counter(reader->Read<int8_t>()); | |
765 func.set_optimized_instruction_count(reader->Read<uint16_t>()); | |
766 func.set_optimized_call_site_count(reader->Read<uint16_t>()); | |
767 } | |
768 func.set_was_compiled(false); | 709 func.set_was_compiled(false); |
769 | 710 |
770 // Set all the object fields. | 711 // Set all the object fields. |
771 READ_OBJECT_FIELDS(func, | 712 READ_OBJECT_FIELDS(func, |
772 func.raw()->from(), func.raw()->to_snapshot(), | 713 func.raw()->from(), func.raw()->to_snapshot(), |
773 kAsReference); | 714 kAsReference); |
774 // Initialize all fields that are not part of the snapshot. | 715 // Initialize all fields that are not part of the snapshot. |
775 if (kind == Snapshot::kAppNoJIT) { | 716 bool is_optimized = func.usage_counter() != 0; |
776 // Read the code object and fixup entry point. | 717 if (is_optimized) { |
777 func.ClearICDataArray(); | 718 // Read the ic data array as the function is an optimized one. |
778 func.ClearCode(); | |
779 (*reader->CodeHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); | |
780 func.SetInstructions(*reader->CodeHandle()); | |
781 } else if (kind == Snapshot::kAppWithJIT) { | |
782 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference); | 719 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference); |
783 func.set_ic_data_array(*reader->ArrayHandle()); | 720 func.set_ic_data_array(*reader->ArrayHandle()); |
784 (*reader->CodeHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); | |
785 func.set_unoptimized_code(*reader->CodeHandle()); | |
786 if (!reader->CodeHandle()->IsNull()) { | |
787 func.SetInstructions(*reader->CodeHandle()); | |
788 func.set_was_compiled(true); | |
789 } else { | |
790 func.ClearCode(); | |
791 } | |
792 } else { | 721 } else { |
793 bool is_optimized = func.usage_counter() != 0; | 722 func.ClearICDataArray(); |
794 if (is_optimized) { | |
795 // Read the ic data array as the function is an optimized one. | |
796 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference); | |
797 func.set_ic_data_array(*reader->ArrayHandle()); | |
798 } else { | |
799 func.ClearICDataArray(); | |
800 } | |
801 func.ClearCode(); | |
802 } | 723 } |
| 724 func.ClearCode(); |
803 return func.raw(); | 725 return func.raw(); |
804 } else { | 726 } else { |
805 return reader->ReadFunctionId(object_id); | 727 return reader->ReadFunctionId(object_id); |
806 } | 728 } |
807 } | 729 } |
808 | 730 |
809 | 731 |
810 void RawFunction::WriteTo(SnapshotWriter* writer, | 732 void RawFunction::WriteTo(SnapshotWriter* writer, |
811 intptr_t object_id, | 733 intptr_t object_id, |
812 Snapshot::Kind kind, | 734 Snapshot::Kind kind, |
813 bool as_reference) { | 735 bool as_reference) { |
814 ASSERT(writer != NULL); | 736 ASSERT(writer != NULL); |
815 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 737 ASSERT(kind == Snapshot::kScript); |
816 bool is_in_fullsnapshot = false; | 738 bool is_in_fullsnapshot = false; |
817 bool owner_is_class = false; | 739 bool owner_is_class = false; |
818 if ((kind == Snapshot::kScript) && !Function::IsSignatureFunction(this)) { | 740 if ((kind == Snapshot::kScript) && !Function::IsSignatureFunction(this)) { |
819 intptr_t tags = writer->GetObjectTags(ptr()->owner_); | 741 intptr_t tags = writer->GetObjectTags(ptr()->owner_); |
820 intptr_t cid = ClassIdTag::decode(tags); | 742 intptr_t cid = ClassIdTag::decode(tags); |
821 owner_is_class = (cid == kClassCid); | 743 owner_is_class = (cid == kClassCid); |
822 is_in_fullsnapshot = owner_is_class ? | 744 is_in_fullsnapshot = owner_is_class ? |
823 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) : | 745 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) : |
824 PatchClass::IsInFullSnapshot( | 746 PatchClass::IsInFullSnapshot( |
825 reinterpret_cast<RawPatchClass*>(ptr()->owner_)); | 747 reinterpret_cast<RawPatchClass*>(ptr()->owner_)); |
826 } | 748 } |
827 | 749 |
828 // Write out the serialization header value for this object. | 750 // Write out the serialization header value for this object. |
829 writer->WriteInlinedObjectHeader(object_id); | 751 writer->WriteInlinedObjectHeader(object_id); |
830 | 752 |
831 // Write out the class and tags information. | 753 // Write out the class and tags information. |
832 writer->WriteVMIsolateObject(kFunctionCid); | 754 writer->WriteVMIsolateObject(kFunctionCid); |
833 writer->WriteTags(writer->GetObjectTags(this)); | 755 writer->WriteTags(writer->GetObjectTags(this)); |
834 | 756 |
835 // Write out the boolean is_in_fullsnapshot first as this will | 757 // Write out the boolean is_in_fullsnapshot first as this will |
836 // help the reader decide how the rest of the information needs | 758 // help the reader decide how the rest of the information needs |
837 // to be interpreted. | 759 // to be interpreted. |
838 writer->Write<bool>(is_in_fullsnapshot); | 760 writer->Write<bool>(is_in_fullsnapshot); |
839 | 761 |
840 if (Snapshot::IsFull(kind) || !is_in_fullsnapshot) { | 762 if (!is_in_fullsnapshot) { |
841 bool is_optimized = Code::IsOptimized(ptr()->code_); | 763 bool is_optimized = Code::IsOptimized(ptr()->code_); |
842 | 764 |
843 // Write out all the non object fields. | 765 // Write out all the non object fields. |
844 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); | 766 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
845 writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode()); | 767 writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode()); |
846 writer->Write<int16_t>(ptr()->num_fixed_parameters_); | 768 writer->Write<int16_t>(ptr()->num_fixed_parameters_); |
847 writer->Write<int16_t>(ptr()->num_optional_parameters_); | 769 writer->Write<int16_t>(ptr()->num_optional_parameters_); |
848 writer->Write<uint32_t>(ptr()->kind_tag_); | 770 writer->Write<uint32_t>(ptr()->kind_tag_); |
849 if (kind == Snapshot::kAppNoJIT) { | 771 if (is_optimized) { |
850 // Omit fields used to support de/reoptimization. | 772 writer->Write<int32_t>(FLAG_optimization_counter_threshold); |
851 } else { | 773 } else { |
852 if (is_optimized) { | 774 writer->Write<int32_t>(0); |
853 writer->Write<int32_t>(FLAG_optimization_counter_threshold); | |
854 } else { | |
855 writer->Write<int32_t>(0); | |
856 } | |
857 writer->Write<int8_t>(ptr()->deoptimization_counter_); | |
858 writer->Write<uint16_t>(ptr()->optimized_instruction_count_); | |
859 writer->Write<uint16_t>(ptr()->optimized_call_site_count_); | |
860 } | 775 } |
| 776 writer->Write<int8_t>(ptr()->deoptimization_counter_); |
| 777 writer->Write<uint16_t>(ptr()->optimized_instruction_count_); |
| 778 writer->Write<uint16_t>(ptr()->optimized_call_site_count_); |
861 | 779 |
862 // Write out all the object pointer fields. | 780 // Write out all the object pointer fields. |
863 SnapshotWriterVisitor visitor(writer, kAsReference); | 781 SnapshotWriterVisitor visitor(writer, kAsReference); |
864 visitor.VisitPointers(from(), to_snapshot()); | 782 visitor.VisitPointers(from(), to_snapshot()); |
865 if (kind == Snapshot::kAppNoJIT) { | 783 if (is_optimized) { |
866 ASSERT(ptr()->ic_data_array_ == Array::null()); | |
867 ASSERT((ptr()->code_ == ptr()->unoptimized_code_) || | |
868 (ptr()->unoptimized_code_ == Code::null())); | |
869 writer->WriteObjectImpl(ptr()->code_, kAsInlinedObject); | |
870 } else if (kind == Snapshot::kAppWithJIT) { | |
871 writer->WriteObjectImpl(ptr()->ic_data_array_, kAsReference); | |
872 writer->WriteObjectImpl(ptr()->unoptimized_code_, kAsInlinedObject); | |
873 } else if (is_optimized) { | |
874 // Write out the ic data array as the function is optimized. | 784 // Write out the ic data array as the function is optimized. |
875 writer->WriteObjectImpl(ptr()->ic_data_array_, kAsReference); | 785 writer->WriteObjectImpl(ptr()->ic_data_array_, kAsReference); |
876 } | 786 } |
877 } else { | 787 } else { |
878 writer->WriteFunctionId(this, owner_is_class); | 788 writer->WriteFunctionId(this, owner_is_class); |
879 } | 789 } |
880 } | 790 } |
881 | 791 |
882 | 792 |
883 RawField* Field::ReadFrom(SnapshotReader* reader, | 793 RawField* Field::ReadFrom(SnapshotReader* reader, |
884 intptr_t object_id, | 794 intptr_t object_id, |
885 intptr_t tags, | 795 intptr_t tags, |
886 Snapshot::Kind kind, | 796 Snapshot::Kind kind, |
887 bool as_reference) { | 797 bool as_reference) { |
888 ASSERT(reader != NULL); | 798 ASSERT(reader != NULL); |
889 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 799 ASSERT(kind == Snapshot::kScript); |
890 | 800 |
891 // Allocate field object. | 801 // Allocate field object. |
892 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field)); | 802 Field& field = Field::ZoneHandle(reader->zone(), Field::New()); |
893 reader->AddBackRef(object_id, &field, kIsDeserialized); | 803 reader->AddBackRef(object_id, &field, kIsDeserialized); |
894 | 804 |
895 // Set all non object fields. | 805 // Set all non object fields. |
896 if (kind == Snapshot::kAppNoJIT) { | 806 field.set_token_pos( |
897 field.set_token_pos(TokenPosition::kNoSource); | 807 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
898 ASSERT(!FLAG_use_field_guards); | 808 field.set_guarded_cid(reader->Read<int32_t>()); |
899 } else { | 809 field.set_is_nullable(reader->Read<int32_t>()); |
900 field.set_token_pos( | |
901 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); | |
902 field.set_guarded_cid(reader->Read<int32_t>()); | |
903 field.set_is_nullable(reader->Read<int32_t>()); | |
904 } | |
905 field.set_kind_bits(reader->Read<uint8_t>()); | 810 field.set_kind_bits(reader->Read<uint8_t>()); |
906 | 811 |
907 // Set all the object fields. | 812 // Set all the object fields. |
908 READ_OBJECT_FIELDS(field, | 813 READ_OBJECT_FIELDS(field, |
909 field.raw()->from(), | 814 field.raw()->from(), |
910 field.raw()->to_snapshot(kind), | 815 field.raw()->to_snapshot(kind), |
911 kAsReference); | 816 kAsReference); |
912 field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null()); | 817 field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null()); |
913 | 818 |
914 if (!FLAG_use_field_guards) { | 819 if (!FLAG_use_field_guards) { |
915 field.set_guarded_cid(kDynamicCid); | 820 field.set_guarded_cid(kDynamicCid); |
916 field.set_is_nullable(true); | 821 field.set_is_nullable(true); |
917 field.set_guarded_list_length(Field::kNoFixedLength); | 822 field.set_guarded_list_length(Field::kNoFixedLength); |
918 field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); | 823 field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); |
919 } else { | 824 } else { |
920 field.InitializeGuardedListLengthInObjectOffset(); | 825 field.InitializeGuardedListLengthInObjectOffset(); |
921 } | 826 } |
922 | 827 |
923 return field.raw(); | 828 return field.raw(); |
924 } | 829 } |
925 | 830 |
926 | 831 |
927 void RawField::WriteTo(SnapshotWriter* writer, | 832 void RawField::WriteTo(SnapshotWriter* writer, |
928 intptr_t object_id, | 833 intptr_t object_id, |
929 Snapshot::Kind kind, | 834 Snapshot::Kind kind, |
930 bool as_reference) { | 835 bool as_reference) { |
931 ASSERT(writer != NULL); | 836 ASSERT(writer != NULL); |
932 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 837 ASSERT(kind == Snapshot::kScript); |
933 | 838 |
934 // Write out the serialization header value for this object. | 839 // Write out the serialization header value for this object. |
935 writer->WriteInlinedObjectHeader(object_id); | 840 writer->WriteInlinedObjectHeader(object_id); |
936 | 841 |
937 // Write out the class and tags information. | 842 // Write out the class and tags information. |
938 writer->WriteVMIsolateObject(kFieldCid); | 843 writer->WriteVMIsolateObject(kFieldCid); |
939 writer->WriteTags(writer->GetObjectTags(this)); | 844 writer->WriteTags(writer->GetObjectTags(this)); |
940 | 845 |
941 // Write out all the non object fields. | 846 // Write out all the non object fields. |
942 if (kind != Snapshot::kAppNoJIT) { | 847 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
943 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); | 848 writer->Write<int32_t>(ptr()->guarded_cid_); |
944 writer->Write<int32_t>(ptr()->guarded_cid_); | 849 writer->Write<int32_t>(ptr()->is_nullable_); |
945 writer->Write<int32_t>(ptr()->is_nullable_); | |
946 } | |
947 writer->Write<uint8_t>(ptr()->kind_bits_); | 850 writer->Write<uint8_t>(ptr()->kind_bits_); |
948 | 851 |
949 // Write out the name. | 852 // Write out the name. |
950 writer->WriteObjectImpl(ptr()->name_, kAsReference); | 853 writer->WriteObjectImpl(ptr()->name_, kAsReference); |
951 // Write out the owner. | 854 // Write out the owner. |
952 writer->WriteObjectImpl(ptr()->owner_, kAsReference); | 855 writer->WriteObjectImpl(ptr()->owner_, kAsReference); |
953 // Write out the type. | 856 // Write out the type. |
954 writer->WriteObjectImpl(ptr()->type_, kAsReference); | 857 writer->WriteObjectImpl(ptr()->type_, kAsReference); |
955 // Write out the initial static value or field offset. | 858 // Write out the initial static value or field offset. |
956 if (Field::StaticBit::decode(ptr()->kind_bits_)) { | 859 if (Field::StaticBit::decode(ptr()->kind_bits_)) { |
957 if (kind == Snapshot::kAppNoJIT) { | 860 if (Field::ConstBit::decode(ptr()->kind_bits_)) { |
958 // For precompiled static fields, the value was already reset and | |
959 // initializer_ now contains a Function. | |
960 writer->WriteObjectImpl(ptr()->value_.static_value_, kAsReference); | |
961 } else if (Field::ConstBit::decode(ptr()->kind_bits_)) { | |
962 // Do not reset const fields. | 861 // Do not reset const fields. |
963 writer->WriteObjectImpl(ptr()->value_.static_value_, kAsReference); | 862 writer->WriteObjectImpl(ptr()->value_.static_value_, kAsReference); |
964 } else { | 863 } else { |
965 // Otherwise, for static fields we write out the initial static value. | 864 // Otherwise, for static fields we write out the initial static value. |
966 writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference); | 865 writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference); |
967 } | 866 } |
968 } else { | 867 } else { |
969 writer->WriteObjectImpl(ptr()->value_.offset_, kAsReference); | 868 writer->WriteObjectImpl(ptr()->value_.offset_, kAsReference); |
970 } | 869 } |
971 // Write out the initializer function or saved initial value. | 870 // Write out the initializer function or saved initial value. |
972 if (kind == Snapshot::kAppNoJIT) { | 871 writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference); |
973 writer->WriteObjectImpl(ptr()->initializer_.precompiled_, kAsReference); | 872 // Write out the guarded list length. |
974 } else { | 873 writer->WriteObjectImpl(ptr()->guarded_list_length_, kAsReference); |
975 writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference); | |
976 } | |
977 if (kind != Snapshot::kAppNoJIT) { | |
978 // Write out the guarded list length. | |
979 writer->WriteObjectImpl(ptr()->guarded_list_length_, kAsReference); | |
980 } | |
981 } | 874 } |
982 | 875 |
983 | 876 |
984 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, | 877 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, |
985 intptr_t object_id, | 878 intptr_t object_id, |
986 intptr_t tags, | 879 intptr_t tags, |
987 Snapshot::Kind kind, | 880 Snapshot::Kind kind, |
988 bool as_reference) { | 881 bool as_reference) { |
989 ASSERT(reader != NULL); | 882 ASSERT(reader != NULL); |
990 ASSERT(kind != Snapshot::kMessage); | 883 ASSERT(kind != Snapshot::kMessage); |
991 | 884 |
992 // Create the literal token object. | 885 // Create the literal token object. |
993 LiteralToken& literal_token = LiteralToken::ZoneHandle( | 886 LiteralToken& literal_token = LiteralToken::ZoneHandle(reader->zone(), |
994 reader->zone(), NEW_OBJECT(LiteralToken)); | 887 LiteralToken::New()); |
995 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); | 888 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); |
996 | 889 |
997 // Read the token attributes. | 890 // Read the token attributes. |
998 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); | 891 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); |
999 literal_token.set_kind(token_kind); | 892 literal_token.set_kind(token_kind); |
1000 | 893 |
1001 // Set all the object fields. | 894 // Set all the object fields. |
1002 READ_OBJECT_FIELDS(literal_token, | 895 READ_OBJECT_FIELDS(literal_token, |
1003 literal_token.raw()->from(), literal_token.raw()->to(), | 896 literal_token.raw()->from(), literal_token.raw()->to(), |
1004 kAsReference); | 897 kAsReference); |
(...skipping 24 matching lines...) Expand all Loading... |
1029 visitor.VisitPointers(from(), to()); | 922 visitor.VisitPointers(from(), to()); |
1030 } | 923 } |
1031 | 924 |
1032 | 925 |
1033 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, | 926 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, |
1034 intptr_t object_id, | 927 intptr_t object_id, |
1035 intptr_t tags, | 928 intptr_t tags, |
1036 Snapshot::Kind kind, | 929 Snapshot::Kind kind, |
1037 bool as_reference) { | 930 bool as_reference) { |
1038 ASSERT(reader != NULL); | 931 ASSERT(reader != NULL); |
1039 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 932 ASSERT(kind == Snapshot::kScript); |
1040 | 933 |
1041 // Read the length so that we can determine number of tokens to read. | 934 // Read the length so that we can determine number of tokens to read. |
1042 intptr_t len = reader->ReadSmiValue(); | 935 intptr_t len = reader->ReadSmiValue(); |
1043 | 936 |
1044 // Create the token stream object. | 937 // Create the token stream object. |
1045 TokenStream& token_stream = TokenStream::ZoneHandle( | 938 TokenStream& token_stream = TokenStream::ZoneHandle(reader->zone(), |
1046 reader->zone(), NEW_OBJECT_WITH_LEN(TokenStream, len)); | 939 TokenStream::New(len)); |
1047 reader->AddBackRef(object_id, &token_stream, kIsDeserialized); | 940 reader->AddBackRef(object_id, &token_stream, kIsDeserialized); |
1048 | 941 |
1049 // Read the stream of tokens into the TokenStream object for script | 942 // Read the stream of tokens into the TokenStream object for script |
1050 // snapshots as we made a copy of token stream. | 943 // snapshots as we made a copy of token stream. |
1051 if (kind == Snapshot::kScript) { | 944 if (kind == Snapshot::kScript) { |
1052 NoSafepointScope no_safepoint; | 945 NoSafepointScope no_safepoint; |
1053 RawExternalTypedData* stream = token_stream.GetStream(); | 946 RawExternalTypedData* stream = token_stream.GetStream(); |
1054 reader->ReadBytes(stream->ptr()->data_, len); | 947 reader->ReadBytes(stream->ptr()->data_, len); |
1055 } | 948 } |
1056 | 949 |
1057 // Read in the literal/identifier token array. | 950 // Read in the literal/identifier token array. |
1058 *(reader->TokensHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); | 951 *(reader->TokensHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); |
1059 token_stream.SetTokenObjects(*(reader->TokensHandle())); | 952 token_stream.SetTokenObjects(*(reader->TokensHandle())); |
1060 // Read in the private key in use by the token stream. | 953 // Read in the private key in use by the token stream. |
1061 *(reader->StringHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); | 954 *(reader->StringHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); |
1062 token_stream.SetPrivateKey(*(reader->StringHandle())); | 955 token_stream.SetPrivateKey(*(reader->StringHandle())); |
1063 | 956 |
1064 return token_stream.raw(); | 957 return token_stream.raw(); |
1065 } | 958 } |
1066 | 959 |
1067 | 960 |
1068 void RawTokenStream::WriteTo(SnapshotWriter* writer, | 961 void RawTokenStream::WriteTo(SnapshotWriter* writer, |
1069 intptr_t object_id, | 962 intptr_t object_id, |
1070 Snapshot::Kind kind, | 963 Snapshot::Kind kind, |
1071 bool as_reference) { | 964 bool as_reference) { |
1072 ASSERT(writer != NULL); | 965 ASSERT(writer != NULL); |
1073 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 966 ASSERT(kind == Snapshot::kScript); |
1074 | 967 |
1075 // Write out the serialization header value for this object. | 968 // Write out the serialization header value for this object. |
1076 writer->WriteInlinedObjectHeader(object_id); | 969 writer->WriteInlinedObjectHeader(object_id); |
1077 | 970 |
1078 // Write out the class and tags information. | 971 // Write out the class and tags information. |
1079 writer->WriteVMIsolateObject(kTokenStreamCid); | 972 writer->WriteVMIsolateObject(kTokenStreamCid); |
1080 writer->WriteTags(writer->GetObjectTags(this)); | 973 writer->WriteTags(writer->GetObjectTags(this)); |
1081 | 974 |
1082 // Write out the length field and the token stream. | 975 // Write out the length field and the token stream. |
1083 RawExternalTypedData* stream = ptr()->stream_; | 976 RawExternalTypedData* stream = ptr()->stream_; |
1084 intptr_t len = Smi::Value(stream->ptr()->length_); | 977 intptr_t len = Smi::Value(stream->ptr()->length_); |
1085 writer->Write<RawObject*>(stream->ptr()->length_); | 978 writer->Write<RawObject*>(stream->ptr()->length_); |
1086 writer->WriteBytes(stream->ptr()->data_, len); | 979 writer->WriteBytes(stream->ptr()->data_, len); |
1087 | 980 |
1088 // Write out the literal/identifier token array. | 981 // Write out the literal/identifier token array. |
1089 writer->WriteObjectImpl(ptr()->token_objects_, kAsInlinedObject); | 982 writer->WriteObjectImpl(ptr()->token_objects_, kAsInlinedObject); |
1090 // Write out the private key in use by the token stream. | 983 // Write out the private key in use by the token stream. |
1091 writer->WriteObjectImpl(ptr()->private_key_, kAsInlinedObject); | 984 writer->WriteObjectImpl(ptr()->private_key_, kAsInlinedObject); |
1092 } | 985 } |
1093 | 986 |
1094 | 987 |
1095 RawScript* Script::ReadFrom(SnapshotReader* reader, | 988 RawScript* Script::ReadFrom(SnapshotReader* reader, |
1096 intptr_t object_id, | 989 intptr_t object_id, |
1097 intptr_t tags, | 990 intptr_t tags, |
1098 Snapshot::Kind kind, | 991 Snapshot::Kind kind, |
1099 bool as_reference) { | 992 bool as_reference) { |
1100 ASSERT(reader != NULL); | 993 ASSERT(reader != NULL); |
1101 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 994 ASSERT(kind == Snapshot::kScript); |
1102 | 995 |
1103 // Allocate script object. | 996 // Allocate script object. |
1104 Script& script = Script::ZoneHandle(reader->zone(), NEW_OBJECT(Script)); | 997 Script& script = Script::ZoneHandle(reader->zone(), Script::New()); |
1105 reader->AddBackRef(object_id, &script, kIsDeserialized); | 998 reader->AddBackRef(object_id, &script, kIsDeserialized); |
1106 | 999 |
1107 script.StoreNonPointer(&script.raw_ptr()->line_offset_, | 1000 script.StoreNonPointer(&script.raw_ptr()->line_offset_, |
1108 reader->Read<int32_t>()); | 1001 reader->Read<int32_t>()); |
1109 script.StoreNonPointer(&script.raw_ptr()->col_offset_, | 1002 script.StoreNonPointer(&script.raw_ptr()->col_offset_, |
1110 reader->Read<int32_t>()); | 1003 reader->Read<int32_t>()); |
1111 script.StoreNonPointer(&script.raw_ptr()->kind_, | 1004 script.StoreNonPointer(&script.raw_ptr()->kind_, |
1112 reader->Read<int8_t>()); | 1005 reader->Read<int8_t>()); |
1113 | 1006 |
1114 *reader->StringHandle() ^= String::null(); | 1007 *reader->StringHandle() ^= String::null(); |
(...skipping 17 matching lines...) Expand all Loading... |
1132 return script.raw(); | 1025 return script.raw(); |
1133 } | 1026 } |
1134 | 1027 |
1135 | 1028 |
1136 void RawScript::WriteTo(SnapshotWriter* writer, | 1029 void RawScript::WriteTo(SnapshotWriter* writer, |
1137 intptr_t object_id, | 1030 intptr_t object_id, |
1138 Snapshot::Kind kind, | 1031 Snapshot::Kind kind, |
1139 bool as_reference) { | 1032 bool as_reference) { |
1140 ASSERT(writer != NULL); | 1033 ASSERT(writer != NULL); |
1141 ASSERT(tokens_ != TokenStream::null()); | 1034 ASSERT(tokens_ != TokenStream::null()); |
1142 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1035 ASSERT(kind == Snapshot::kScript); |
1143 | 1036 |
1144 // Write out the serialization header value for this object. | 1037 // Write out the serialization header value for this object. |
1145 writer->WriteInlinedObjectHeader(object_id); | 1038 writer->WriteInlinedObjectHeader(object_id); |
1146 | 1039 |
1147 // Write out the class and tags information. | 1040 // Write out the class and tags information. |
1148 writer->WriteVMIsolateObject(kScriptCid); | 1041 writer->WriteVMIsolateObject(kScriptCid); |
1149 writer->WriteTags(writer->GetObjectTags(this)); | 1042 writer->WriteTags(writer->GetObjectTags(this)); |
1150 | 1043 |
1151 // Write out all the non object fields. | 1044 // Write out all the non object fields. |
1152 writer->Write<int32_t>(ptr()->line_offset_); | 1045 writer->Write<int32_t>(ptr()->line_offset_); |
(...skipping 18 matching lines...) Expand all Loading... |
1171 reader->AddBackRef(object_id, &library, kIsDeserialized); | 1064 reader->AddBackRef(object_id, &library, kIsDeserialized); |
1172 | 1065 |
1173 bool is_in_fullsnapshot = reader->Read<bool>(); | 1066 bool is_in_fullsnapshot = reader->Read<bool>(); |
1174 if ((kind == Snapshot::kScript) && is_in_fullsnapshot) { | 1067 if ((kind == Snapshot::kScript) && is_in_fullsnapshot) { |
1175 // Lookup the object as it should already exist in the heap. | 1068 // Lookup the object as it should already exist in the heap. |
1176 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); | 1069 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); |
1177 library = Library::LookupLibrary(reader->thread(), *reader->StringHandle()); | 1070 library = Library::LookupLibrary(reader->thread(), *reader->StringHandle()); |
1178 ASSERT(library.is_in_fullsnapshot()); | 1071 ASSERT(library.is_in_fullsnapshot()); |
1179 } else { | 1072 } else { |
1180 // Allocate library object. | 1073 // Allocate library object. |
1181 library = NEW_OBJECT(Library); | 1074 library = Library::New(); |
1182 | 1075 |
1183 // Set all non object fields. | 1076 // Set all non object fields. |
1184 library.StoreNonPointer(&library.raw_ptr()->index_, | 1077 library.StoreNonPointer(&library.raw_ptr()->index_, |
1185 reader->ReadClassIDValue()); | 1078 reader->ReadClassIDValue()); |
1186 library.StoreNonPointer(&library.raw_ptr()->num_imports_, | 1079 library.StoreNonPointer(&library.raw_ptr()->num_imports_, |
1187 reader->Read<uint16_t>()); | 1080 reader->Read<uint16_t>()); |
1188 library.StoreNonPointer(&library.raw_ptr()->load_state_, | 1081 library.StoreNonPointer(&library.raw_ptr()->load_state_, |
1189 reader->Read<int8_t>()); | 1082 reader->Read<int8_t>()); |
1190 library.StoreNonPointer(&library.raw_ptr()->corelib_imported_, | 1083 library.StoreNonPointer(&library.raw_ptr()->corelib_imported_, |
1191 reader->Read<bool>()); | 1084 reader->Read<bool>()); |
1192 library.StoreNonPointer(&library.raw_ptr()->is_dart_scheme_, | 1085 library.StoreNonPointer(&library.raw_ptr()->is_dart_scheme_, |
1193 reader->Read<bool>()); | 1086 reader->Read<bool>()); |
1194 library.StoreNonPointer(&library.raw_ptr()->debuggable_, | 1087 library.StoreNonPointer(&library.raw_ptr()->debuggable_, |
1195 reader->Read<bool>()); | 1088 reader->Read<bool>()); |
1196 if (Snapshot::IsFull(kind)) { | |
1197 is_in_fullsnapshot = true; | |
1198 } | |
1199 library.StoreNonPointer(&library.raw_ptr()->is_in_fullsnapshot_, | 1089 library.StoreNonPointer(&library.raw_ptr()->is_in_fullsnapshot_, |
1200 is_in_fullsnapshot); | 1090 is_in_fullsnapshot); |
1201 // The native resolver and symbolizer are not serialized. | 1091 // The native resolver and symbolizer are not serialized. |
1202 library.set_native_entry_resolver(NULL); | 1092 library.set_native_entry_resolver(NULL); |
1203 library.set_native_entry_symbol_resolver(NULL); | 1093 library.set_native_entry_symbol_resolver(NULL); |
1204 | 1094 |
1205 // Set all the object fields. | 1095 // Set all the object fields. |
1206 // TODO(5411462): Need to assert No GC can happen here, even though | 1096 // TODO(5411462): Need to assert No GC can happen here, even though |
1207 // allocations may happen. | 1097 // allocations may happen. |
1208 intptr_t num_flds = (library.raw()->to_snapshot() - library.raw()->from()); | 1098 intptr_t num_flds = (library.raw()->to_snapshot() - library.raw()->from()); |
1209 for (intptr_t i = 0; i <= num_flds; i++) { | 1099 for (intptr_t i = 0; i <= num_flds; i++) { |
1210 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); | 1100 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); |
1211 library.StorePointer((library.raw()->from() + i), | 1101 library.StorePointer((library.raw()->from() + i), |
1212 reader->PassiveObjectHandle()->raw()); | 1102 reader->PassiveObjectHandle()->raw()); |
1213 } | 1103 } |
1214 // Initialize cache of resolved names. | 1104 // Initialize cache of resolved names. |
1215 const intptr_t kInitialNameCacheSize = 64; | 1105 const intptr_t kInitialNameCacheSize = 64; |
1216 if (!Snapshot::IsFull(kind)) { | 1106 // The cache of resolved names in library scope is not serialized. |
1217 // The cache of resolved names in library scope is not serialized. | 1107 library.InitResolvedNamesCache(kInitialNameCacheSize); |
1218 library.InitResolvedNamesCache(kInitialNameCacheSize); | 1108 library.Register(reader->thread()); |
1219 library.Register(reader->thread()); | |
1220 } else { | |
1221 library.InitResolvedNamesCache(kInitialNameCacheSize, reader); | |
1222 } | |
1223 library.StorePointer(&library.raw_ptr()->exported_names_, Array::null()); | 1109 library.StorePointer(&library.raw_ptr()->exported_names_, Array::null()); |
1224 // Initialize cache of loaded scripts. | 1110 // Initialize cache of loaded scripts. |
1225 library.StorePointer(&library.raw_ptr()->loaded_scripts_, Array::null()); | 1111 library.StorePointer(&library.raw_ptr()->loaded_scripts_, Array::null()); |
1226 } | 1112 } |
1227 return library.raw(); | 1113 return library.raw(); |
1228 } | 1114 } |
1229 | 1115 |
1230 | 1116 |
1231 void RawLibrary::WriteTo(SnapshotWriter* writer, | 1117 void RawLibrary::WriteTo(SnapshotWriter* writer, |
1232 intptr_t object_id, | 1118 intptr_t object_id, |
(...skipping 11 matching lines...) Expand all Loading... |
1244 | 1130 |
1245 // Write out the boolean is_in_fullsnapshot_ first as this will | 1131 // Write out the boolean is_in_fullsnapshot_ first as this will |
1246 // help the reader decide how the rest of the information needs | 1132 // help the reader decide how the rest of the information needs |
1247 // to be interpreted. | 1133 // to be interpreted. |
1248 writer->Write<bool>(ptr()->is_in_fullsnapshot_); | 1134 writer->Write<bool>(ptr()->is_in_fullsnapshot_); |
1249 | 1135 |
1250 if ((kind == Snapshot::kScript) && ptr()->is_in_fullsnapshot_) { | 1136 if ((kind == Snapshot::kScript) && ptr()->is_in_fullsnapshot_) { |
1251 // Write out library URL so that it can be looked up when reading. | 1137 // Write out library URL so that it can be looked up when reading. |
1252 writer->WriteObjectImpl(ptr()->url_, kAsInlinedObject); | 1138 writer->WriteObjectImpl(ptr()->url_, kAsInlinedObject); |
1253 } else { | 1139 } else { |
1254 ASSERT((Snapshot::IsFull(kind)) || !ptr()->is_in_fullsnapshot_); | 1140 ASSERT(!ptr()->is_in_fullsnapshot_); |
1255 // Write out all non object fields. | 1141 // Write out all non object fields. |
1256 ASSERT(ptr()->index_ != static_cast<classid_t>(-1)); | 1142 ASSERT(ptr()->index_ != static_cast<classid_t>(-1)); |
1257 writer->WriteClassIDValue(ptr()->index_); | 1143 writer->WriteClassIDValue(ptr()->index_); |
1258 writer->Write<uint16_t>(ptr()->num_imports_); | 1144 writer->Write<uint16_t>(ptr()->num_imports_); |
1259 writer->Write<int8_t>(ptr()->load_state_); | 1145 writer->Write<int8_t>(ptr()->load_state_); |
1260 writer->Write<bool>(ptr()->corelib_imported_); | 1146 writer->Write<bool>(ptr()->corelib_imported_); |
1261 writer->Write<bool>(ptr()->is_dart_scheme_); | 1147 writer->Write<bool>(ptr()->is_dart_scheme_); |
1262 writer->Write<bool>(ptr()->debuggable_); | 1148 writer->Write<bool>(ptr()->debuggable_); |
1263 // We do not serialize the native resolver or symbolizer. These need to be | 1149 // We do not serialize the native resolver or symbolizer. These need to be |
1264 // explicitly set after deserialization. | 1150 // explicitly set after deserialization. |
1265 | 1151 |
1266 // We do not write the loaded_scripts_ and resolved_names_ caches to the | 1152 // We do not write the loaded_scripts_ and resolved_names_ caches to the |
1267 // snapshot. They get initialized when reading the library from the | 1153 // snapshot. They get initialized when reading the library from the |
1268 // snapshot and will be rebuilt lazily. | 1154 // snapshot and will be rebuilt lazily. |
1269 // Write out all the object pointer fields. | 1155 // Write out all the object pointer fields. |
1270 SnapshotWriterVisitor visitor(writer, kAsReference); | 1156 SnapshotWriterVisitor visitor(writer, kAsReference); |
1271 visitor.VisitPointers(from(), to_snapshot()); | 1157 visitor.VisitPointers(from(), to_snapshot()); |
1272 } | 1158 } |
1273 } | 1159 } |
1274 | 1160 |
1275 | 1161 |
1276 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, | 1162 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, |
1277 intptr_t object_id, | 1163 intptr_t object_id, |
1278 intptr_t tags, | 1164 intptr_t tags, |
1279 Snapshot::Kind kind, | 1165 Snapshot::Kind kind, |
1280 bool as_reference) { | 1166 bool as_reference) { |
1281 ASSERT(reader != NULL); | 1167 ASSERT(reader != NULL); |
1282 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1168 ASSERT(kind == Snapshot::kScript); |
1283 | 1169 |
1284 // Allocate library prefix object. | 1170 // Allocate library prefix object. |
1285 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle( | 1171 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(reader->zone(), |
1286 reader->zone(), NEW_OBJECT(LibraryPrefix)); | 1172 LibraryPrefix::New()); |
1287 reader->AddBackRef(object_id, &prefix, kIsDeserialized); | 1173 reader->AddBackRef(object_id, &prefix, kIsDeserialized); |
1288 | 1174 |
1289 // Set all non object fields. | 1175 // Set all non object fields. |
1290 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, | 1176 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, |
1291 reader->Read<int16_t>()); | 1177 reader->Read<int16_t>()); |
1292 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, | 1178 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, |
1293 reader->Read<bool>()); | 1179 reader->Read<bool>()); |
1294 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); | 1180 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); |
1295 | 1181 |
1296 // Set all the object fields. | 1182 // Set all the object fields. |
1297 READ_OBJECT_FIELDS(prefix, | 1183 READ_OBJECT_FIELDS(prefix, |
1298 prefix.raw()->from(), | 1184 prefix.raw()->from(), |
1299 prefix.raw()->to_snapshot(kind), | 1185 prefix.raw()->to_snapshot(kind), |
1300 kAsReference); | 1186 kAsReference); |
1301 if (kind == Snapshot::kAppNoJIT) { | |
1302 prefix.StorePointer(&prefix.raw_ptr()->imports_, | |
1303 Object::empty_array().raw()); | |
1304 } | |
1305 prefix.StorePointer(&prefix.raw_ptr()->dependent_code_, | 1187 prefix.StorePointer(&prefix.raw_ptr()->dependent_code_, |
1306 Array::null()); | 1188 Array::null()); |
1307 | 1189 |
1308 return prefix.raw(); | 1190 return prefix.raw(); |
1309 } | 1191 } |
1310 | 1192 |
1311 | 1193 |
1312 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, | 1194 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, |
1313 intptr_t object_id, | 1195 intptr_t object_id, |
1314 Snapshot::Kind kind, | 1196 Snapshot::Kind kind, |
1315 bool as_reference) { | 1197 bool as_reference) { |
1316 ASSERT(writer != NULL); | 1198 ASSERT(writer != NULL); |
1317 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1199 ASSERT(kind == Snapshot::kScript); |
1318 | 1200 |
1319 // Write out the serialization header value for this object. | 1201 // Write out the serialization header value for this object. |
1320 writer->WriteInlinedObjectHeader(object_id); | 1202 writer->WriteInlinedObjectHeader(object_id); |
1321 | 1203 |
1322 // Write out the class and tags information. | 1204 // Write out the class and tags information. |
1323 writer->WriteIndexedObject(kLibraryPrefixCid); | 1205 writer->WriteIndexedObject(kLibraryPrefixCid); |
1324 writer->WriteTags(writer->GetObjectTags(this)); | 1206 writer->WriteTags(writer->GetObjectTags(this)); |
1325 | 1207 |
1326 // Write out all non object fields. | 1208 // Write out all non object fields. |
1327 writer->Write<int16_t>(ptr()->num_imports_); | 1209 writer->Write<int16_t>(ptr()->num_imports_); |
1328 writer->Write<bool>(ptr()->is_deferred_load_); | 1210 writer->Write<bool>(ptr()->is_deferred_load_); |
1329 writer->Write<bool>(ptr()->is_loaded_); | 1211 writer->Write<bool>(ptr()->is_loaded_); |
1330 | 1212 |
1331 // Write out all the object pointer fields. | 1213 // Write out all the object pointer fields. |
1332 SnapshotWriterVisitor visitor(writer, kAsReference); | 1214 SnapshotWriterVisitor visitor(writer, kAsReference); |
1333 visitor.VisitPointers(from(), to_snapshot(kind)); | 1215 visitor.VisitPointers(from(), to_snapshot(kind)); |
1334 } | 1216 } |
1335 | 1217 |
1336 | 1218 |
1337 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader, | 1219 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader, |
1338 intptr_t object_id, | 1220 intptr_t object_id, |
1339 intptr_t tags, | 1221 intptr_t tags, |
1340 Snapshot::Kind kind, | 1222 Snapshot::Kind kind, |
1341 bool as_reference) { | 1223 bool as_reference) { |
1342 ASSERT(reader != NULL); | 1224 ASSERT(reader != NULL); |
1343 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1225 ASSERT(kind == Snapshot::kScript); |
1344 | 1226 |
1345 // Allocate Namespace object. | 1227 // Allocate Namespace object. |
1346 Namespace& ns = Namespace::ZoneHandle( | 1228 Namespace& ns = Namespace::ZoneHandle(reader->zone(), Namespace::New()); |
1347 reader->zone(), NEW_OBJECT(Namespace)); | |
1348 reader->AddBackRef(object_id, &ns, kIsDeserialized); | 1229 reader->AddBackRef(object_id, &ns, kIsDeserialized); |
1349 | 1230 |
1350 // Set all the object fields. | 1231 // Set all the object fields. |
1351 READ_OBJECT_FIELDS(ns, ns.raw()->from(), ns.raw()->to(), kAsReference); | 1232 READ_OBJECT_FIELDS(ns, ns.raw()->from(), ns.raw()->to(), kAsReference); |
1352 | 1233 |
1353 return ns.raw(); | 1234 return ns.raw(); |
1354 } | 1235 } |
1355 | 1236 |
1356 | 1237 |
1357 void RawNamespace::WriteTo(SnapshotWriter* writer, | 1238 void RawNamespace::WriteTo(SnapshotWriter* writer, |
1358 intptr_t object_id, | 1239 intptr_t object_id, |
1359 Snapshot::Kind kind, | 1240 Snapshot::Kind kind, |
1360 bool as_reference) { | 1241 bool as_reference) { |
1361 ASSERT(writer != NULL); | 1242 ASSERT(writer != NULL); |
1362 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1243 ASSERT(kind == Snapshot::kScript); |
1363 | 1244 |
1364 // Write out the serialization header value for this object. | 1245 // Write out the serialization header value for this object. |
1365 writer->WriteInlinedObjectHeader(object_id); | 1246 writer->WriteInlinedObjectHeader(object_id); |
1366 | 1247 |
1367 // Write out the class and tags information. | 1248 // Write out the class and tags information. |
1368 writer->WriteVMIsolateObject(kNamespaceCid); | 1249 writer->WriteVMIsolateObject(kNamespaceCid); |
1369 writer->WriteTags(writer->GetObjectTags(this)); | 1250 writer->WriteTags(writer->GetObjectTags(this)); |
1370 | 1251 |
1371 // Write out all the object pointer fields. | 1252 // Write out all the object pointer fields. |
1372 SnapshotWriterVisitor visitor(writer, kAsReference); | 1253 SnapshotWriterVisitor visitor(writer, kAsReference); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 bool as_reference) { | 1406 bool as_reference) { |
1526 ASSERT(reader != NULL); | 1407 ASSERT(reader != NULL); |
1527 | 1408 |
1528 // Allocate context object. | 1409 // Allocate context object. |
1529 int32_t num_vars = reader->Read<int32_t>(); | 1410 int32_t num_vars = reader->Read<int32_t>(); |
1530 Context& context = Context::ZoneHandle(reader->zone()); | 1411 Context& context = Context::ZoneHandle(reader->zone()); |
1531 reader->AddBackRef(object_id, &context, kIsDeserialized); | 1412 reader->AddBackRef(object_id, &context, kIsDeserialized); |
1532 if (num_vars == 0) { | 1413 if (num_vars == 0) { |
1533 context ^= reader->object_store()->empty_context(); | 1414 context ^= reader->object_store()->empty_context(); |
1534 } else { | 1415 } else { |
1535 context ^= NEW_OBJECT_WITH_LEN(Context, num_vars); | 1416 context ^= Context::New(num_vars); |
1536 | 1417 |
1537 // Set all the object fields. | 1418 // Set all the object fields. |
1538 // TODO(5411462): Need to assert No GC can happen here, even though | 1419 // TODO(5411462): Need to assert No GC can happen here, even though |
1539 // allocations may happen. | 1420 // allocations may happen. |
1540 intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from()); | 1421 intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from()); |
1541 for (intptr_t i = 0; i <= num_flds; i++) { | 1422 for (intptr_t i = 0; i <= num_flds; i++) { |
1542 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); | 1423 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); |
1543 context.StorePointer((context.raw()->from() + i), | 1424 context.StorePointer((context.raw()->from() + i), |
1544 reader->PassiveObjectHandle()->raw()); | 1425 reader->PassiveObjectHandle()->raw()); |
1545 } | 1426 } |
(...skipping 30 matching lines...) Expand all Loading... |
1576 intptr_t object_id, | 1457 intptr_t object_id, |
1577 intptr_t tags, | 1458 intptr_t tags, |
1578 Snapshot::Kind kind, | 1459 Snapshot::Kind kind, |
1579 bool as_reference) { | 1460 bool as_reference) { |
1580 ASSERT(reader != NULL); | 1461 ASSERT(reader != NULL); |
1581 | 1462 |
1582 // Allocate context object. | 1463 // Allocate context object. |
1583 bool is_implicit = reader->Read<bool>(); | 1464 bool is_implicit = reader->Read<bool>(); |
1584 if (is_implicit) { | 1465 if (is_implicit) { |
1585 ContextScope& context_scope = ContextScope::ZoneHandle(reader->zone()); | 1466 ContextScope& context_scope = ContextScope::ZoneHandle(reader->zone()); |
1586 if (Snapshot::IsFull(kind)) { | 1467 context_scope = ContextScope::New(1, true); |
1587 context_scope = reader->NewContextScope(1); | |
1588 context_scope.set_is_implicit(true); | |
1589 } else { | |
1590 context_scope = ContextScope::New(1, true); | |
1591 } | |
1592 reader->AddBackRef(object_id, &context_scope, kIsDeserialized); | 1468 reader->AddBackRef(object_id, &context_scope, kIsDeserialized); |
1593 | 1469 |
1594 *reader->TypeHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); | 1470 *reader->TypeHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); |
1595 | 1471 |
1596 // Create a descriptor for 'this' variable. | 1472 // Create a descriptor for 'this' variable. |
1597 context_scope.SetTokenIndexAt(0, TokenPosition::kMinSource); | 1473 context_scope.SetTokenIndexAt(0, TokenPosition::kMinSource); |
1598 context_scope.SetNameAt(0, Symbols::This()); | 1474 context_scope.SetNameAt(0, Symbols::This()); |
1599 context_scope.SetIsFinalAt(0, true); | 1475 context_scope.SetIsFinalAt(0, true); |
1600 context_scope.SetIsConstAt(0, false); | 1476 context_scope.SetIsConstAt(0, false); |
1601 context_scope.SetTypeAt(0, *reader->TypeHandle()); | 1477 context_scope.SetTypeAt(0, *reader->TypeHandle()); |
1602 context_scope.SetContextIndexAt(0, 0); | 1478 context_scope.SetContextIndexAt(0, 0); |
1603 context_scope.SetContextLevelAt(0, 0); | 1479 context_scope.SetContextLevelAt(0, 0); |
1604 return context_scope.raw(); | 1480 return context_scope.raw(); |
1605 } else if (kind == Snapshot::kAppWithJIT) { | |
1606 int32_t num_vars = reader->Read<int32_t>(); | |
1607 | |
1608 ContextScope& context_scope = ContextScope::ZoneHandle(reader->zone()); | |
1609 context_scope = reader->NewContextScope(num_vars); | |
1610 context_scope.set_is_implicit(false); | |
1611 reader->AddBackRef(object_id, &context_scope, kIsDeserialized); | |
1612 | |
1613 READ_OBJECT_FIELDS(context_scope, | |
1614 context_scope.raw()->from(), | |
1615 context_scope.raw()->to(num_vars), | |
1616 kAsInlinedObject); | |
1617 return context_scope.raw(); | |
1618 } | 1481 } |
1619 UNREACHABLE(); | 1482 UNREACHABLE(); |
1620 return NULL; | 1483 return NULL; |
1621 } | 1484 } |
1622 | 1485 |
1623 | 1486 |
1624 void RawContextScope::WriteTo(SnapshotWriter* writer, | 1487 void RawContextScope::WriteTo(SnapshotWriter* writer, |
1625 intptr_t object_id, | 1488 intptr_t object_id, |
1626 Snapshot::Kind kind, | 1489 Snapshot::Kind kind, |
1627 bool as_reference) { | 1490 bool as_reference) { |
(...skipping 10 matching lines...) Expand all Loading... |
1638 writer->WriteVMIsolateObject(kContextScopeCid); | 1501 writer->WriteVMIsolateObject(kContextScopeCid); |
1639 writer->WriteTags(writer->GetObjectTags(this)); | 1502 writer->WriteTags(writer->GetObjectTags(this)); |
1640 | 1503 |
1641 // Write out is_implicit flag for the context scope. | 1504 // Write out is_implicit flag for the context scope. |
1642 writer->Write<bool>(true); | 1505 writer->Write<bool>(true); |
1643 | 1506 |
1644 // Write out the type of 'this' the variable. | 1507 // Write out the type of 'this' the variable. |
1645 writer->WriteObjectImpl(var->type, kAsInlinedObject); | 1508 writer->WriteObjectImpl(var->type, kAsInlinedObject); |
1646 | 1509 |
1647 return; | 1510 return; |
1648 } else if (kind == Snapshot::kAppWithJIT) { | |
1649 // Write out the serialization header value for this object. | |
1650 writer->WriteInlinedObjectHeader(object_id); | |
1651 | |
1652 // Write out the class and tags information. | |
1653 writer->WriteVMIsolateObject(kContextScopeCid); | |
1654 writer->WriteTags(writer->GetObjectTags(this)); | |
1655 | |
1656 // Write out is_implicit flag for the context scope. | |
1657 writer->Write<bool>(false); | |
1658 int32_t num_vars = ptr()->num_variables_; | |
1659 writer->Write<int32_t>(num_vars); | |
1660 | |
1661 SnapshotWriterVisitor visitor(writer, kAsInlinedObject); | |
1662 visitor.VisitPointers(from(), to(num_vars)); | |
1663 | |
1664 return; | |
1665 } | 1511 } |
1666 UNREACHABLE(); | 1512 UNREACHABLE(); |
1667 } | 1513 } |
1668 | 1514 |
1669 | 1515 |
1670 RawICData* ICData::ReadFrom(SnapshotReader* reader, | 1516 RawICData* ICData::ReadFrom(SnapshotReader* reader, |
1671 intptr_t object_id, | 1517 intptr_t object_id, |
1672 intptr_t tags, | 1518 intptr_t tags, |
1673 Snapshot::Kind kind, | 1519 Snapshot::Kind kind, |
1674 bool as_reference) { | 1520 bool as_reference) { |
1675 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1521 ASSERT(kind == Snapshot::kScript); |
1676 | 1522 |
1677 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); | 1523 ICData& result = ICData::ZoneHandle(reader->zone(), ICData::New()); |
1678 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1524 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1679 | 1525 |
1680 result.set_deopt_id(reader->Read<int32_t>()); | 1526 result.set_deopt_id(reader->Read<int32_t>()); |
1681 result.set_state_bits(reader->Read<uint32_t>()); | 1527 result.set_state_bits(reader->Read<uint32_t>()); |
1682 #if defined(TAG_IC_DATA) | 1528 #if defined(TAG_IC_DATA) |
1683 result.set_tag(reader->Read<int16_t>()); | 1529 result.set_tag(reader->Read<int16_t>()); |
1684 #endif | 1530 #endif |
1685 | 1531 |
1686 // Set all the object fields. | 1532 // Set all the object fields. |
1687 READ_OBJECT_FIELDS(result, | 1533 READ_OBJECT_FIELDS(result, |
1688 result.raw()->from(), | 1534 result.raw()->from(), |
1689 result.raw()->to_snapshot(kind), | 1535 result.raw()->to_snapshot(kind), |
1690 kAsReference); | 1536 kAsReference); |
1691 if (kind == Snapshot::kAppNoJIT) { | |
1692 result.set_owner(Function::Handle(reader->zone())); | |
1693 } | |
1694 | 1537 |
1695 return result.raw(); | 1538 return result.raw(); |
1696 } | 1539 } |
1697 | 1540 |
1698 | 1541 |
1699 void RawICData::WriteTo(SnapshotWriter* writer, | 1542 void RawICData::WriteTo(SnapshotWriter* writer, |
1700 intptr_t object_id, | 1543 intptr_t object_id, |
1701 Snapshot::Kind kind, | 1544 Snapshot::Kind kind, |
1702 bool as_reference) { | 1545 bool as_reference) { |
1703 ASSERT((kind == Snapshot::kScript) || (Snapshot::IsFull(kind))); | 1546 ASSERT(kind == Snapshot::kScript); |
1704 | 1547 |
1705 // Write out the serialization header value for this object. | 1548 // Write out the serialization header value for this object. |
1706 writer->WriteInlinedObjectHeader(object_id); | 1549 writer->WriteInlinedObjectHeader(object_id); |
1707 | 1550 |
1708 // Write out the class and tags information. | 1551 // Write out the class and tags information. |
1709 writer->WriteVMIsolateObject(kICDataCid); | 1552 writer->WriteVMIsolateObject(kICDataCid); |
1710 writer->WriteTags(writer->GetObjectTags(this)); | 1553 writer->WriteTags(writer->GetObjectTags(this)); |
1711 | 1554 |
1712 // Write out all the non object fields. | 1555 // Write out all the non object fields. |
1713 writer->Write<int32_t>(ptr()->deopt_id_); | 1556 writer->Write<int32_t>(ptr()->deopt_id_); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1780 | 1623 |
1781 RawApiError* ApiError::ReadFrom(SnapshotReader* reader, | 1624 RawApiError* ApiError::ReadFrom(SnapshotReader* reader, |
1782 intptr_t object_id, | 1625 intptr_t object_id, |
1783 intptr_t tags, | 1626 intptr_t tags, |
1784 Snapshot::Kind kind, | 1627 Snapshot::Kind kind, |
1785 bool as_reference) { | 1628 bool as_reference) { |
1786 ASSERT(reader != NULL); | 1629 ASSERT(reader != NULL); |
1787 | 1630 |
1788 // Allocate ApiError object. | 1631 // Allocate ApiError object. |
1789 ApiError& api_error = | 1632 ApiError& api_error = |
1790 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError)); | 1633 ApiError::ZoneHandle(reader->zone(), ApiError::New()); |
1791 reader->AddBackRef(object_id, &api_error, kIsDeserialized); | 1634 reader->AddBackRef(object_id, &api_error, kIsDeserialized); |
1792 | 1635 |
1793 // Set all the object fields. | 1636 // Set all the object fields. |
1794 READ_OBJECT_FIELDS(api_error, | 1637 READ_OBJECT_FIELDS(api_error, |
1795 api_error.raw()->from(), api_error.raw()->to(), | 1638 api_error.raw()->from(), api_error.raw()->to(), |
1796 kAsReference); | 1639 kAsReference); |
1797 | 1640 |
1798 return api_error.raw(); | 1641 return api_error.raw(); |
1799 } | 1642 } |
1800 | 1643 |
(...skipping 19 matching lines...) Expand all Loading... |
1820 | 1663 |
1821 RawLanguageError* LanguageError::ReadFrom(SnapshotReader* reader, | 1664 RawLanguageError* LanguageError::ReadFrom(SnapshotReader* reader, |
1822 intptr_t object_id, | 1665 intptr_t object_id, |
1823 intptr_t tags, | 1666 intptr_t tags, |
1824 Snapshot::Kind kind, | 1667 Snapshot::Kind kind, |
1825 bool as_reference) { | 1668 bool as_reference) { |
1826 ASSERT(reader != NULL); | 1669 ASSERT(reader != NULL); |
1827 | 1670 |
1828 // Allocate LanguageError object. | 1671 // Allocate LanguageError object. |
1829 LanguageError& language_error = | 1672 LanguageError& language_error = |
1830 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError)); | 1673 LanguageError::ZoneHandle(reader->zone(), LanguageError::New()); |
1831 reader->AddBackRef(object_id, &language_error, kIsDeserialized); | 1674 reader->AddBackRef(object_id, &language_error, kIsDeserialized); |
1832 | 1675 |
1833 // Set all non object fields. | 1676 // Set all non object fields. |
1834 language_error.set_token_pos( | 1677 language_error.set_token_pos( |
1835 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); | 1678 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
1836 language_error.set_report_after_token(reader->Read<bool>()); | 1679 language_error.set_report_after_token(reader->Read<bool>()); |
1837 language_error.set_kind(reader->Read<uint8_t>()); | 1680 language_error.set_kind(reader->Read<uint8_t>()); |
1838 | 1681 |
1839 // Set all the object fields. | 1682 // Set all the object fields. |
1840 READ_OBJECT_FIELDS(language_error, | 1683 READ_OBJECT_FIELDS(language_error, |
(...skipping 27 matching lines...) Expand all Loading... |
1868 visitor.VisitPointers(from(), to()); | 1711 visitor.VisitPointers(from(), to()); |
1869 } | 1712 } |
1870 | 1713 |
1871 | 1714 |
1872 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, | 1715 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, |
1873 intptr_t object_id, | 1716 intptr_t object_id, |
1874 intptr_t tags, | 1717 intptr_t tags, |
1875 Snapshot::Kind kind, | 1718 Snapshot::Kind kind, |
1876 bool as_reference) { | 1719 bool as_reference) { |
1877 UnhandledException& result = UnhandledException::ZoneHandle( | 1720 UnhandledException& result = UnhandledException::ZoneHandle( |
1878 reader->zone(), NEW_OBJECT(UnhandledException)); | 1721 reader->zone(), UnhandledException::New()); |
1879 reader->AddBackRef(object_id, &result, kIsDeserialized); | 1722 reader->AddBackRef(object_id, &result, kIsDeserialized); |
1880 | 1723 |
1881 // Set all the object fields. | 1724 // Set all the object fields. |
1882 READ_OBJECT_FIELDS(result, | 1725 READ_OBJECT_FIELDS(result, |
1883 result.raw()->from(), result.raw()->to(), | 1726 result.raw()->from(), result.raw()->to(), |
1884 kAsReference); | 1727 kAsReference); |
1885 | 1728 |
1886 return result.raw(); | 1729 return result.raw(); |
1887 } | 1730 } |
1888 | 1731 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1924 RawInstance* Instance::ReadFrom(SnapshotReader* reader, | 1767 RawInstance* Instance::ReadFrom(SnapshotReader* reader, |
1925 intptr_t object_id, | 1768 intptr_t object_id, |
1926 intptr_t tags, | 1769 intptr_t tags, |
1927 Snapshot::Kind kind, | 1770 Snapshot::Kind kind, |
1928 bool as_reference) { | 1771 bool as_reference) { |
1929 ASSERT(reader != NULL); | 1772 ASSERT(reader != NULL); |
1930 | 1773 |
1931 // Create an Instance object or get canonical one if it is a canonical | 1774 // Create an Instance object or get canonical one if it is a canonical |
1932 // constant. | 1775 // constant. |
1933 Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null()); | 1776 Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null()); |
1934 if (Snapshot::IsFull(kind)) { | 1777 obj ^= Object::Allocate(kInstanceCid, |
1935 obj = reader->NewInstance(); | 1778 Instance::InstanceSize(), |
1936 // Set the canonical bit. | 1779 HEAP_SPACE(kind)); |
1937 if (RawObject::IsCanonical(tags)) { | 1780 if (RawObject::IsCanonical(tags)) { |
1938 obj.SetCanonical(); | 1781 obj = obj.CheckAndCanonicalize(reader->thread(), NULL); |
1939 } | |
1940 } else { | |
1941 obj ^= Object::Allocate(kInstanceCid, | |
1942 Instance::InstanceSize(), | |
1943 HEAP_SPACE(kind)); | |
1944 if (RawObject::IsCanonical(tags)) { | |
1945 obj = obj.CheckAndCanonicalize(reader->thread(), NULL); | |
1946 } | |
1947 } | 1782 } |
1948 reader->AddBackRef(object_id, &obj, kIsDeserialized); | 1783 reader->AddBackRef(object_id, &obj, kIsDeserialized); |
1949 | 1784 |
1950 return obj.raw(); | 1785 return obj.raw(); |
1951 } | 1786 } |
1952 | 1787 |
1953 | 1788 |
1954 void RawInstance::WriteTo(SnapshotWriter* writer, | 1789 void RawInstance::WriteTo(SnapshotWriter* writer, |
1955 intptr_t object_id, | 1790 intptr_t object_id, |
1956 Snapshot::Kind kind, | 1791 Snapshot::Kind kind, |
(...skipping 23 matching lines...) Expand all Loading... |
1980 // architecture, if so return the object as a Smi. | 1815 // architecture, if so return the object as a Smi. |
1981 if (Smi::IsValid(value)) { | 1816 if (Smi::IsValid(value)) { |
1982 Smi& smi = Smi::ZoneHandle(reader->zone(), | 1817 Smi& smi = Smi::ZoneHandle(reader->zone(), |
1983 Smi::New(static_cast<intptr_t>(value))); | 1818 Smi::New(static_cast<intptr_t>(value))); |
1984 reader->AddBackRef(object_id, &smi, kIsDeserialized); | 1819 reader->AddBackRef(object_id, &smi, kIsDeserialized); |
1985 return smi.raw(); | 1820 return smi.raw(); |
1986 } | 1821 } |
1987 | 1822 |
1988 // Create a Mint object or get canonical one if it is a canonical constant. | 1823 // Create a Mint object or get canonical one if it is a canonical constant. |
1989 Mint& mint = Mint::ZoneHandle(reader->zone(), Mint::null()); | 1824 Mint& mint = Mint::ZoneHandle(reader->zone(), Mint::null()); |
1990 if (Snapshot::IsFull(kind)) { | 1825 // When reading a script snapshot we need to canonicalize only those object |
1991 mint = reader->NewMint(value); | 1826 // references that are objects from the core library (loaded from a |
1992 // Set the canonical bit. | 1827 // full snapshot). Objects that are only in the script need not be |
1993 if (RawObject::IsCanonical(tags)) { | 1828 // canonicalized as they are already canonical. |
1994 mint.SetCanonical(); | 1829 // When reading a message snapshot we always have to canonicalize. |
1995 } | 1830 if (RawObject::IsCanonical(tags)) { |
| 1831 mint = Mint::NewCanonical(value); |
| 1832 ASSERT(mint.IsCanonical()); |
1996 } else { | 1833 } else { |
1997 // When reading a script snapshot we need to canonicalize only those object | 1834 mint = Mint::New(value, HEAP_SPACE(kind)); |
1998 // references that are objects from the core library (loaded from a | |
1999 // full snapshot). Objects that are only in the script need not be | |
2000 // canonicalized as they are already canonical. | |
2001 // When reading a message snapshot we always have to canonicalize. | |
2002 if (RawObject::IsCanonical(tags)) { | |
2003 mint = Mint::NewCanonical(value); | |
2004 ASSERT(mint.IsCanonical()); | |
2005 } else { | |
2006 mint = Mint::New(value, HEAP_SPACE(kind)); | |
2007 } | |
2008 } | 1835 } |
2009 reader->AddBackRef(object_id, &mint, kIsDeserialized); | 1836 reader->AddBackRef(object_id, &mint, kIsDeserialized); |
2010 return mint.raw(); | 1837 return mint.raw(); |
2011 } | 1838 } |
2012 | 1839 |
2013 | 1840 |
2014 void RawMint::WriteTo(SnapshotWriter* writer, | 1841 void RawMint::WriteTo(SnapshotWriter* writer, |
2015 intptr_t object_id, | 1842 intptr_t object_id, |
2016 Snapshot::Kind kind, | 1843 Snapshot::Kind kind, |
2017 bool as_reference) { | 1844 bool as_reference) { |
(...skipping 12 matching lines...) Expand all Loading... |
2030 | 1857 |
2031 | 1858 |
2032 RawBigint* Bigint::ReadFrom(SnapshotReader* reader, | 1859 RawBigint* Bigint::ReadFrom(SnapshotReader* reader, |
2033 intptr_t object_id, | 1860 intptr_t object_id, |
2034 intptr_t tags, | 1861 intptr_t tags, |
2035 Snapshot::Kind kind, | 1862 Snapshot::Kind kind, |
2036 bool as_reference) { | 1863 bool as_reference) { |
2037 ASSERT(reader != NULL); | 1864 ASSERT(reader != NULL); |
2038 | 1865 |
2039 // Allocate bigint object. | 1866 // Allocate bigint object. |
2040 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint)); | 1867 Bigint& obj = Bigint::ZoneHandle(reader->zone(), Bigint::New()); |
2041 reader->AddBackRef(object_id, &obj, kIsDeserialized); | 1868 reader->AddBackRef(object_id, &obj, kIsDeserialized); |
2042 | 1869 |
2043 // Set all the object fields. | 1870 // Set all the object fields. |
2044 READ_OBJECT_FIELDS(obj, obj.raw()->from(), obj.raw()->to(), kAsInlinedObject); | 1871 READ_OBJECT_FIELDS(obj, obj.raw()->from(), obj.raw()->to(), kAsInlinedObject); |
2045 | 1872 |
2046 // If it is a canonical constant make it one. | 1873 // If it is a canonical constant make it one. |
2047 // When reading a full snapshot we don't need to canonicalize the object | 1874 // When reading a full snapshot we don't need to canonicalize the object |
2048 // as it would already be a canonical object. | 1875 // as it would already be a canonical object. |
2049 // When reading a script snapshot or a message snapshot we always have | 1876 // When reading a script snapshot or a message snapshot we always have |
2050 // to canonicalize the object. | 1877 // to canonicalize the object. |
2051 if (RawObject::IsCanonical(tags)) { | 1878 if (RawObject::IsCanonical(tags)) { |
2052 if (Snapshot::IsFull(kind)) { | 1879 obj ^= obj.CheckAndCanonicalize(reader->thread(), NULL); |
2053 // Set the canonical bit. | 1880 ASSERT(!obj.IsNull()); |
2054 obj.SetCanonical(); | 1881 ASSERT(obj.IsCanonical()); |
2055 } else { | |
2056 obj ^= obj.CheckAndCanonicalize(reader->thread(), NULL); | |
2057 ASSERT(!obj.IsNull()); | |
2058 ASSERT(obj.IsCanonical()); | |
2059 } | |
2060 } | 1882 } |
2061 return obj.raw(); | 1883 return obj.raw(); |
2062 } | 1884 } |
2063 | 1885 |
2064 | 1886 |
2065 void RawBigint::WriteTo(SnapshotWriter* writer, | 1887 void RawBigint::WriteTo(SnapshotWriter* writer, |
2066 intptr_t object_id, | 1888 intptr_t object_id, |
2067 Snapshot::Kind kind, | 1889 Snapshot::Kind kind, |
2068 bool as_reference) { | 1890 bool as_reference) { |
2069 ASSERT(writer != NULL); | 1891 ASSERT(writer != NULL); |
(...skipping 16 matching lines...) Expand all Loading... |
2086 intptr_t tags, | 1908 intptr_t tags, |
2087 Snapshot::Kind kind, | 1909 Snapshot::Kind kind, |
2088 bool as_reference) { | 1910 bool as_reference) { |
2089 ASSERT(reader != NULL); | 1911 ASSERT(reader != NULL); |
2090 ASSERT(kind != Snapshot::kMessage); | 1912 ASSERT(kind != Snapshot::kMessage); |
2091 // Read the double value for the object. | 1913 // Read the double value for the object. |
2092 double value = reader->ReadDouble(); | 1914 double value = reader->ReadDouble(); |
2093 | 1915 |
2094 // Create a Double object or get canonical one if it is a canonical constant. | 1916 // Create a Double object or get canonical one if it is a canonical constant. |
2095 Double& dbl = Double::ZoneHandle(reader->zone(), Double::null()); | 1917 Double& dbl = Double::ZoneHandle(reader->zone(), Double::null()); |
2096 if (Snapshot::IsFull(kind)) { | 1918 // When reading a script snapshot we need to canonicalize only those object |
2097 dbl = reader->NewDouble(value); | 1919 // references that are objects from the core library (loaded from a |
2098 // Set the canonical bit. | 1920 // full snapshot). Objects that are only in the script need not be |
2099 if (RawObject::IsCanonical(tags)) { | 1921 // canonicalized as they are already canonical. |
2100 dbl.SetCanonical(); | 1922 if (RawObject::IsCanonical(tags)) { |
2101 } | 1923 dbl = Double::NewCanonical(value); |
| 1924 ASSERT(dbl.IsCanonical()); |
2102 } else { | 1925 } else { |
2103 // When reading a script snapshot we need to canonicalize only those object | 1926 dbl = Double::New(value, HEAP_SPACE(kind)); |
2104 // references that are objects from the core library (loaded from a | |
2105 // full snapshot). Objects that are only in the script need not be | |
2106 // canonicalized as they are already canonical. | |
2107 if (RawObject::IsCanonical(tags)) { | |
2108 dbl = Double::NewCanonical(value); | |
2109 ASSERT(dbl.IsCanonical()); | |
2110 } else { | |
2111 dbl = Double::New(value, HEAP_SPACE(kind)); | |
2112 } | |
2113 } | 1927 } |
2114 reader->AddBackRef(object_id, &dbl, kIsDeserialized); | 1928 reader->AddBackRef(object_id, &dbl, kIsDeserialized); |
2115 return dbl.raw(); | 1929 return dbl.raw(); |
2116 } | 1930 } |
2117 | 1931 |
2118 | 1932 |
2119 void RawDouble::WriteTo(SnapshotWriter* writer, | 1933 void RawDouble::WriteTo(SnapshotWriter* writer, |
2120 intptr_t object_id, | 1934 intptr_t object_id, |
2121 Snapshot::Kind kind, | 1935 Snapshot::Kind kind, |
2122 bool as_reference) { | 1936 bool as_reference) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2186 | 2000 |
2187 | 2001 |
2188 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader, | 2002 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader, |
2189 intptr_t object_id, | 2003 intptr_t object_id, |
2190 intptr_t tags, | 2004 intptr_t tags, |
2191 Snapshot::Kind kind, | 2005 Snapshot::Kind kind, |
2192 bool as_reference) { | 2006 bool as_reference) { |
2193 // Read the length so that we can determine instance size to allocate. | 2007 // Read the length so that we can determine instance size to allocate. |
2194 ASSERT(reader != NULL); | 2008 ASSERT(reader != NULL); |
2195 intptr_t len = reader->ReadSmiValue(); | 2009 intptr_t len = reader->ReadSmiValue(); |
2196 intptr_t hash = reader->ReadSmiValue(); | |
2197 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); | 2010 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); |
2198 | 2011 |
2199 if (Snapshot::IsFull(kind)) { | 2012 String::ReadFromImpl<OneByteString, uint8_t>( |
2200 // We currently only expect the Dart mutator to read snapshots. | 2013 reader, &str_obj, len, tags, Symbols::FromLatin1, kind); |
2201 reader->isolate()->AssertCurrentThreadIsMutator(); | |
2202 ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0); | |
2203 RawOneByteString* obj = reader->NewOneByteString(len); | |
2204 str_obj = obj; | |
2205 if (RawObject::IsCanonical(tags)) { | |
2206 str_obj.SetCanonical(); | |
2207 } | |
2208 str_obj.SetHash(hash); | |
2209 if (len > 0) { | |
2210 uint8_t* raw_ptr = CharAddr(str_obj, 0); | |
2211 reader->ReadBytes(raw_ptr, len); | |
2212 } | |
2213 ASSERT((hash == 0) || (String::Hash(str_obj, 0, str_obj.Length()) == hash)); | |
2214 } else { | |
2215 String::ReadFromImpl<OneByteString, uint8_t>( | |
2216 reader, &str_obj, len, tags, Symbols::FromLatin1, kind); | |
2217 } | |
2218 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); | 2014 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); |
2219 return raw(str_obj); | 2015 return raw(str_obj); |
2220 } | 2016 } |
2221 | 2017 |
2222 | 2018 |
2223 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader, | 2019 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader, |
2224 intptr_t object_id, | 2020 intptr_t object_id, |
2225 intptr_t tags, | 2021 intptr_t tags, |
2226 Snapshot::Kind kind, | 2022 Snapshot::Kind kind, |
2227 bool as_reference) { | 2023 bool as_reference) { |
2228 // Read the length so that we can determine instance size to allocate. | 2024 // Read the length so that we can determine instance size to allocate. |
2229 ASSERT(reader != NULL); | 2025 ASSERT(reader != NULL); |
2230 intptr_t len = reader->ReadSmiValue(); | 2026 intptr_t len = reader->ReadSmiValue(); |
2231 intptr_t hash = reader->ReadSmiValue(); | |
2232 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); | 2027 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); |
2233 | 2028 |
2234 if (Snapshot::IsFull(kind)) { | 2029 String::ReadFromImpl<TwoByteString, uint16_t>( |
2235 RawTwoByteString* obj = reader->NewTwoByteString(len); | 2030 reader, &str_obj, len, tags, Symbols::FromUTF16, kind); |
2236 str_obj = obj; | |
2237 if (RawObject::IsCanonical(tags)) { | |
2238 str_obj.SetCanonical(); | |
2239 } | |
2240 str_obj.SetHash(hash); | |
2241 NoSafepointScope no_safepoint; | |
2242 uint16_t* raw_ptr = (len > 0)? CharAddr(str_obj, 0) : NULL; | |
2243 for (intptr_t i = 0; i < len; i++) { | |
2244 ASSERT(CharAddr(str_obj, i) == raw_ptr); // Will trigger assertions. | |
2245 *raw_ptr = reader->Read<uint16_t>(); | |
2246 raw_ptr += 1; | |
2247 } | |
2248 ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash); | |
2249 } else { | |
2250 String::ReadFromImpl<TwoByteString, uint16_t>( | |
2251 reader, &str_obj, len, tags, Symbols::FromUTF16, kind); | |
2252 } | |
2253 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); | 2031 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); |
2254 return raw(str_obj); | 2032 return raw(str_obj); |
2255 } | 2033 } |
2256 | 2034 |
2257 | 2035 |
2258 template<typename T> | 2036 template<typename T> |
2259 static void StringWriteTo(SnapshotWriter* writer, | 2037 static void StringWriteTo(SnapshotWriter* writer, |
2260 intptr_t object_id, | 2038 intptr_t object_id, |
2261 Snapshot::Kind kind, | 2039 Snapshot::Kind kind, |
2262 intptr_t class_id, | 2040 intptr_t class_id, |
2263 intptr_t tags, | 2041 intptr_t tags, |
2264 RawSmi* length, | 2042 RawSmi* length, |
2265 RawSmi* hash, | |
2266 T* data) { | 2043 T* data) { |
2267 ASSERT(writer != NULL); | 2044 ASSERT(writer != NULL); |
2268 intptr_t len = Smi::Value(length); | 2045 intptr_t len = Smi::Value(length); |
2269 | 2046 |
2270 // Write out the serialization header value for this object. | 2047 // Write out the serialization header value for this object. |
2271 writer->WriteInlinedObjectHeader(object_id); | 2048 writer->WriteInlinedObjectHeader(object_id); |
2272 | 2049 |
2273 // Write out the class and tags information. | 2050 // Write out the class and tags information. |
2274 writer->WriteIndexedObject(class_id); | 2051 writer->WriteIndexedObject(class_id); |
2275 writer->WriteTags(tags); | 2052 writer->WriteTags(tags); |
2276 | 2053 |
2277 // Write out the length field. | 2054 // Write out the length field. |
2278 writer->Write<RawObject*>(length); | 2055 writer->Write<RawObject*>(length); |
2279 | 2056 |
2280 // Write out the hash field. | |
2281 writer->Write<RawObject*>(hash); | |
2282 | |
2283 // Write out the string. | 2057 // Write out the string. |
2284 if (len > 0) { | 2058 if (len > 0) { |
2285 if (class_id == kOneByteStringCid) { | 2059 if (class_id == kOneByteStringCid) { |
2286 writer->WriteBytes(reinterpret_cast<const uint8_t*>(data), len); | 2060 writer->WriteBytes(reinterpret_cast<const uint8_t*>(data), len); |
2287 } else { | 2061 } else { |
2288 for (intptr_t i = 0; i < len; i++) { | 2062 for (intptr_t i = 0; i < len; i++) { |
2289 writer->Write(data[i]); | 2063 writer->Write(data[i]); |
2290 } | 2064 } |
2291 } | 2065 } |
2292 } | 2066 } |
2293 } | 2067 } |
2294 | 2068 |
2295 | 2069 |
2296 void RawOneByteString::WriteTo(SnapshotWriter* writer, | 2070 void RawOneByteString::WriteTo(SnapshotWriter* writer, |
2297 intptr_t object_id, | 2071 intptr_t object_id, |
2298 Snapshot::Kind kind, | 2072 Snapshot::Kind kind, |
2299 bool as_reference) { | 2073 bool as_reference) { |
2300 StringWriteTo(writer, | 2074 StringWriteTo(writer, |
2301 object_id, | 2075 object_id, |
2302 kind, | 2076 kind, |
2303 kOneByteStringCid, | 2077 kOneByteStringCid, |
2304 writer->GetObjectTags(this), | 2078 writer->GetObjectTags(this), |
2305 ptr()->length_, | 2079 ptr()->length_, |
2306 ptr()->hash_, | |
2307 ptr()->data()); | 2080 ptr()->data()); |
2308 } | 2081 } |
2309 | 2082 |
2310 | 2083 |
2311 void RawTwoByteString::WriteTo(SnapshotWriter* writer, | 2084 void RawTwoByteString::WriteTo(SnapshotWriter* writer, |
2312 intptr_t object_id, | 2085 intptr_t object_id, |
2313 Snapshot::Kind kind, | 2086 Snapshot::Kind kind, |
2314 bool as_reference) { | 2087 bool as_reference) { |
2315 StringWriteTo(writer, | 2088 StringWriteTo(writer, |
2316 object_id, | 2089 object_id, |
2317 kind, | 2090 kind, |
2318 kTwoByteStringCid, | 2091 kTwoByteStringCid, |
2319 writer->GetObjectTags(this), | 2092 writer->GetObjectTags(this), |
2320 ptr()->length_, | 2093 ptr()->length_, |
2321 ptr()->hash_, | |
2322 ptr()->data()); | 2094 ptr()->data()); |
2323 } | 2095 } |
2324 | 2096 |
2325 | 2097 |
2326 RawExternalOneByteString* ExternalOneByteString::ReadFrom( | 2098 RawExternalOneByteString* ExternalOneByteString::ReadFrom( |
2327 SnapshotReader* reader, | 2099 SnapshotReader* reader, |
2328 intptr_t object_id, | 2100 intptr_t object_id, |
2329 intptr_t tags, | 2101 intptr_t tags, |
2330 Snapshot::Kind kind, | 2102 Snapshot::Kind kind, |
2331 bool as_reference) { | 2103 bool as_reference) { |
(...skipping 17 matching lines...) Expand all Loading... |
2349 intptr_t object_id, | 2121 intptr_t object_id, |
2350 Snapshot::Kind kind, | 2122 Snapshot::Kind kind, |
2351 bool as_reference) { | 2123 bool as_reference) { |
2352 // Serialize as a non-external one byte string. | 2124 // Serialize as a non-external one byte string. |
2353 StringWriteTo(writer, | 2125 StringWriteTo(writer, |
2354 object_id, | 2126 object_id, |
2355 kind, | 2127 kind, |
2356 kOneByteStringCid, | 2128 kOneByteStringCid, |
2357 writer->GetObjectTags(this), | 2129 writer->GetObjectTags(this), |
2358 ptr()->length_, | 2130 ptr()->length_, |
2359 ptr()->hash_, | |
2360 ptr()->external_data_->data()); | 2131 ptr()->external_data_->data()); |
2361 } | 2132 } |
2362 | 2133 |
2363 | 2134 |
2364 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer, | 2135 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer, |
2365 intptr_t object_id, | 2136 intptr_t object_id, |
2366 Snapshot::Kind kind, | 2137 Snapshot::Kind kind, |
2367 bool as_reference) { | 2138 bool as_reference) { |
2368 // Serialize as a non-external two byte string. | 2139 // Serialize as a non-external two byte string. |
2369 StringWriteTo(writer, | 2140 StringWriteTo(writer, |
2370 object_id, | 2141 object_id, |
2371 kind, | 2142 kind, |
2372 kTwoByteStringCid, | 2143 kTwoByteStringCid, |
2373 writer->GetObjectTags(this), | 2144 writer->GetObjectTags(this), |
2374 ptr()->length_, | 2145 ptr()->length_, |
2375 ptr()->hash_, | |
2376 ptr()->external_data_->data()); | 2146 ptr()->external_data_->data()); |
2377 } | 2147 } |
2378 | 2148 |
2379 | 2149 |
2380 RawBool* Bool::ReadFrom(SnapshotReader* reader, | 2150 RawBool* Bool::ReadFrom(SnapshotReader* reader, |
2381 intptr_t object_id, | 2151 intptr_t object_id, |
2382 intptr_t tags, | 2152 intptr_t tags, |
2383 Snapshot::Kind kind, | 2153 Snapshot::Kind kind, |
2384 bool as_reference) { | 2154 bool as_reference) { |
2385 UNREACHABLE(); | 2155 UNREACHABLE(); |
(...skipping 21 matching lines...) Expand all Loading... |
2407 Array* array = NULL; | 2177 Array* array = NULL; |
2408 DeserializeState state; | 2178 DeserializeState state; |
2409 if (!as_reference) { | 2179 if (!as_reference) { |
2410 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); | 2180 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); |
2411 state = kIsDeserialized; | 2181 state = kIsDeserialized; |
2412 } else { | 2182 } else { |
2413 state = kIsNotDeserialized; | 2183 state = kIsNotDeserialized; |
2414 } | 2184 } |
2415 if (array == NULL) { | 2185 if (array == NULL) { |
2416 array = &(Array::ZoneHandle(reader->zone(), | 2186 array = &(Array::ZoneHandle(reader->zone(), |
2417 NEW_OBJECT_WITH_LEN_SPACE(Array, len, kind))); | 2187 Array::New(len, HEAP_SPACE(kind)))); |
2418 reader->AddBackRef(object_id, array, state); | 2188 reader->AddBackRef(object_id, array, state); |
2419 } | 2189 } |
2420 if (!as_reference) { | 2190 if (!as_reference) { |
2421 // Read all the individual elements for inlined objects. | 2191 // Read all the individual elements for inlined objects. |
2422 ASSERT(!RawObject::IsCanonical(tags)); | 2192 ASSERT(!RawObject::IsCanonical(tags)); |
2423 reader->ArrayReadFrom(object_id, *array, len, tags); | 2193 reader->ArrayReadFrom(object_id, *array, len, tags); |
2424 } | 2194 } |
2425 return array->raw(); | 2195 return array->raw(); |
2426 } | 2196 } |
2427 | 2197 |
(...skipping 11 matching lines...) Expand all Loading... |
2439 DeserializeState state; | 2209 DeserializeState state; |
2440 if (!as_reference) { | 2210 if (!as_reference) { |
2441 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); | 2211 array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); |
2442 state = kIsDeserialized; | 2212 state = kIsDeserialized; |
2443 } else { | 2213 } else { |
2444 state = kIsNotDeserialized; | 2214 state = kIsNotDeserialized; |
2445 } | 2215 } |
2446 if (array == NULL) { | 2216 if (array == NULL) { |
2447 array = &(Array::ZoneHandle( | 2217 array = &(Array::ZoneHandle( |
2448 reader->zone(), | 2218 reader->zone(), |
2449 NEW_OBJECT_WITH_LEN_SPACE(ImmutableArray, len, kind))); | 2219 ImmutableArray::New(len, HEAP_SPACE(kind)))); |
2450 reader->AddBackRef(object_id, array, state); | 2220 reader->AddBackRef(object_id, array, state); |
2451 } | 2221 } |
2452 if (!as_reference) { | 2222 if (!as_reference) { |
2453 // Read all the individual elements for inlined objects. | 2223 // Read all the individual elements for inlined objects. |
2454 reader->ArrayReadFrom(object_id, *array, len, tags); | 2224 reader->ArrayReadFrom(object_id, *array, len, tags); |
2455 if (RawObject::IsCanonical(tags)) { | 2225 if (RawObject::IsCanonical(tags)) { |
2456 if (Snapshot::IsFull(kind)) { | 2226 *array ^= array->CheckAndCanonicalize(reader->thread(), NULL); |
2457 array->SetCanonical(); | |
2458 } else { | |
2459 *array ^= array->CheckAndCanonicalize(reader->thread(), NULL); | |
2460 } | |
2461 } | 2227 } |
2462 } | 2228 } |
2463 return raw(*array); | 2229 return raw(*array); |
2464 } | 2230 } |
2465 | 2231 |
2466 | 2232 |
2467 void RawArray::WriteTo(SnapshotWriter* writer, | 2233 void RawArray::WriteTo(SnapshotWriter* writer, |
2468 intptr_t object_id, | 2234 intptr_t object_id, |
2469 Snapshot::Kind kind, | 2235 Snapshot::Kind kind, |
2470 bool as_reference) { | 2236 bool as_reference) { |
(...skipping 25 matching lines...) Expand all Loading... |
2496 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader, | 2262 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader, |
2497 intptr_t object_id, | 2263 intptr_t object_id, |
2498 intptr_t tags, | 2264 intptr_t tags, |
2499 Snapshot::Kind kind, | 2265 Snapshot::Kind kind, |
2500 bool as_reference) { | 2266 bool as_reference) { |
2501 ASSERT(reader != NULL); | 2267 ASSERT(reader != NULL); |
2502 | 2268 |
2503 // Read the length so that we can determine instance size to allocate. | 2269 // Read the length so that we can determine instance size to allocate. |
2504 GrowableObjectArray& array = GrowableObjectArray::ZoneHandle( | 2270 GrowableObjectArray& array = GrowableObjectArray::ZoneHandle( |
2505 reader->zone(), GrowableObjectArray::null()); | 2271 reader->zone(), GrowableObjectArray::null()); |
2506 if (Snapshot::IsFull(kind)) { | 2272 array = GrowableObjectArray::New(0, HEAP_SPACE(kind)); |
2507 array = reader->NewGrowableObjectArray(); | |
2508 } else { | |
2509 array = GrowableObjectArray::New(0, HEAP_SPACE(kind)); | |
2510 } | |
2511 reader->AddBackRef(object_id, &array, kIsDeserialized); | 2273 reader->AddBackRef(object_id, &array, kIsDeserialized); |
2512 | 2274 |
2513 // Read type arguments of growable array object. | 2275 // Read type arguments of growable array object. |
2514 const intptr_t typeargs_offset = | 2276 const intptr_t typeargs_offset = |
2515 GrowableObjectArray::type_arguments_offset() / kWordSize; | 2277 GrowableObjectArray::type_arguments_offset() / kWordSize; |
2516 *reader->TypeArgumentsHandle() ^= | 2278 *reader->TypeArgumentsHandle() ^= |
2517 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); | 2279 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); |
2518 array.StorePointer(&array.raw_ptr()->type_arguments_, | 2280 array.StorePointer(&array.raw_ptr()->type_arguments_, |
2519 reader->TypeArgumentsHandle()->raw()); | 2281 reader->TypeArgumentsHandle()->raw()); |
2520 | 2282 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2555 | 2317 |
2556 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, | 2318 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, |
2557 intptr_t object_id, | 2319 intptr_t object_id, |
2558 intptr_t tags, | 2320 intptr_t tags, |
2559 Snapshot::Kind kind, | 2321 Snapshot::Kind kind, |
2560 bool as_reference) { | 2322 bool as_reference) { |
2561 ASSERT(reader != NULL); | 2323 ASSERT(reader != NULL); |
2562 | 2324 |
2563 LinkedHashMap& map = LinkedHashMap::ZoneHandle( | 2325 LinkedHashMap& map = LinkedHashMap::ZoneHandle( |
2564 reader->zone(), LinkedHashMap::null()); | 2326 reader->zone(), LinkedHashMap::null()); |
2565 if (Snapshot::IsFull(kind) || kind == Snapshot::kScript) { | 2327 if (kind == Snapshot::kScript) { |
2566 // The immutable maps that seed map literals are not yet VM-internal, so | 2328 // The immutable maps that seed map literals are not yet VM-internal, so |
2567 // we don't reach this. | 2329 // we don't reach this. |
2568 UNREACHABLE(); | 2330 UNREACHABLE(); |
2569 } else { | 2331 } else { |
2570 // Since the map might contain itself as a key or value, allocate first. | 2332 // Since the map might contain itself as a key or value, allocate first. |
2571 if (Snapshot::IsFull(kind)) { | 2333 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); |
2572 map = reader->NewLinkedHashMap(); | |
2573 } else { | |
2574 map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind)); | |
2575 } | |
2576 } | 2334 } |
2577 reader->AddBackRef(object_id, &map, kIsDeserialized); | 2335 reader->AddBackRef(object_id, &map, kIsDeserialized); |
2578 | 2336 |
2579 // Read the type arguments. | 2337 // Read the type arguments. |
2580 const intptr_t typeargs_offset = | 2338 const intptr_t typeargs_offset = |
2581 GrowableObjectArray::type_arguments_offset() / kWordSize; | 2339 GrowableObjectArray::type_arguments_offset() / kWordSize; |
2582 *reader->TypeArgumentsHandle() ^= | 2340 *reader->TypeArgumentsHandle() ^= |
2583 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); | 2341 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); |
2584 map.SetTypeArguments(*reader->TypeArgumentsHandle()); | 2342 map.SetTypeArguments(*reader->TypeArgumentsHandle()); |
2585 | 2343 |
2586 // Read the number of key/value pairs. | 2344 // Read the number of key/value pairs. |
2587 intptr_t len = reader->ReadSmiValue(); | 2345 intptr_t len = reader->ReadSmiValue(); |
2588 intptr_t used_data = (len << 1); | 2346 intptr_t used_data = (len << 1); |
2589 map.SetUsedData(used_data); | 2347 map.SetUsedData(used_data); |
2590 | 2348 |
2591 // Allocate the data array. | 2349 // Allocate the data array. |
2592 intptr_t data_size = Utils::Maximum( | 2350 intptr_t data_size = Utils::Maximum( |
2593 Utils::RoundUpToPowerOfTwo(used_data), | 2351 Utils::RoundUpToPowerOfTwo(used_data), |
2594 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); | 2352 static_cast<uintptr_t>(LinkedHashMap::kInitialIndexSize)); |
2595 Array& data = Array::ZoneHandle(reader->zone(), | 2353 Array& data = Array::ZoneHandle(reader->zone(), |
2596 NEW_OBJECT_WITH_LEN_SPACE(Array, | 2354 Array::New(data_size, HEAP_SPACE(kind))); |
2597 data_size, | |
2598 kind)); | |
2599 map.SetData(data); | 2355 map.SetData(data); |
2600 map.SetDeletedKeys(0); | 2356 map.SetDeletedKeys(0); |
2601 | 2357 |
2602 // The index and hashMask is regenerated by the maps themselves on demand. | 2358 // The index and hashMask is regenerated by the maps themselves on demand. |
2603 // Thus, the index will probably be allocated in new space (unless it's huge). | 2359 // Thus, the index will probably be allocated in new space (unless it's huge). |
2604 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and | 2360 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and |
2605 // in particular, if/when (const) maps are needed in the VM isolate snapshot. | 2361 // in particular, if/when (const) maps are needed in the VM isolate snapshot. |
2606 ASSERT(reader->isolate() != Dart::vm_isolate()); | 2362 ASSERT(reader->isolate() != Dart::vm_isolate()); |
2607 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. | 2363 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. |
2608 | 2364 |
2609 // Read the keys and values. | 2365 // Read the keys and values. |
2610 bool read_as_reference = RawObject::IsCanonical(tags) ? false : true; | 2366 bool read_as_reference = RawObject::IsCanonical(tags) ? false : true; |
2611 for (intptr_t i = 0; i < used_data; i++) { | 2367 for (intptr_t i = 0; i < used_data; i++) { |
2612 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(read_as_reference); | 2368 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(read_as_reference); |
2613 data.SetAt(i, *reader->PassiveObjectHandle()); | 2369 data.SetAt(i, *reader->PassiveObjectHandle()); |
2614 } | 2370 } |
2615 return map.raw(); | 2371 return map.raw(); |
2616 } | 2372 } |
2617 | 2373 |
2618 | 2374 |
2619 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, | 2375 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, |
2620 intptr_t object_id, | 2376 intptr_t object_id, |
2621 Snapshot::Kind kind, | 2377 Snapshot::Kind kind, |
2622 bool as_reference) { | 2378 bool as_reference) { |
2623 if (Snapshot::IsFull(kind) || kind == Snapshot::kScript) { | 2379 if (kind == Snapshot::kScript) { |
2624 // The immutable maps that seed map literals are not yet VM-internal, so | 2380 // The immutable maps that seed map literals are not yet VM-internal, so |
2625 // we don't reach this. | 2381 // we don't reach this. |
2626 } | 2382 } |
2627 ASSERT(writer != NULL); | 2383 ASSERT(writer != NULL); |
2628 | 2384 |
2629 // Write out the serialization header value for this object. | 2385 // Write out the serialization header value for this object. |
2630 writer->WriteInlinedObjectHeader(object_id); | 2386 writer->WriteInlinedObjectHeader(object_id); |
2631 | 2387 |
2632 // Write out the class and tags information. | 2388 // Write out the class and tags information. |
2633 writer->WriteIndexedObject(kLinkedHashMapCid); | 2389 writer->WriteIndexedObject(kLinkedHashMapCid); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2675 ASSERT(reader != NULL); | 2431 ASSERT(reader != NULL); |
2676 // Read the values. | 2432 // Read the values. |
2677 float value0 = reader->Read<float>(); | 2433 float value0 = reader->Read<float>(); |
2678 float value1 = reader->Read<float>(); | 2434 float value1 = reader->Read<float>(); |
2679 float value2 = reader->Read<float>(); | 2435 float value2 = reader->Read<float>(); |
2680 float value3 = reader->Read<float>(); | 2436 float value3 = reader->Read<float>(); |
2681 | 2437 |
2682 // Create a Float32x4 object. | 2438 // Create a Float32x4 object. |
2683 Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), | 2439 Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), |
2684 Float32x4::null()); | 2440 Float32x4::null()); |
2685 if (Snapshot::IsFull(kind)) { | 2441 simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); |
2686 simd = reader->NewFloat32x4(value0, value1, value2, value3); | |
2687 } else { | |
2688 simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); | |
2689 } | |
2690 reader->AddBackRef(object_id, &simd, kIsDeserialized); | 2442 reader->AddBackRef(object_id, &simd, kIsDeserialized); |
2691 return simd.raw(); | 2443 return simd.raw(); |
2692 } | 2444 } |
2693 | 2445 |
2694 | 2446 |
2695 void RawFloat32x4::WriteTo(SnapshotWriter* writer, | 2447 void RawFloat32x4::WriteTo(SnapshotWriter* writer, |
2696 intptr_t object_id, | 2448 intptr_t object_id, |
2697 Snapshot::Kind kind, | 2449 Snapshot::Kind kind, |
2698 bool as_reference) { | 2450 bool as_reference) { |
2699 ASSERT(writer != NULL); | 2451 ASSERT(writer != NULL); |
(...skipping 20 matching lines...) Expand all Loading... |
2720 bool as_reference) { | 2472 bool as_reference) { |
2721 ASSERT(reader != NULL); | 2473 ASSERT(reader != NULL); |
2722 // Read the values. | 2474 // Read the values. |
2723 uint32_t value0 = reader->Read<uint32_t>(); | 2475 uint32_t value0 = reader->Read<uint32_t>(); |
2724 uint32_t value1 = reader->Read<uint32_t>(); | 2476 uint32_t value1 = reader->Read<uint32_t>(); |
2725 uint32_t value2 = reader->Read<uint32_t>(); | 2477 uint32_t value2 = reader->Read<uint32_t>(); |
2726 uint32_t value3 = reader->Read<uint32_t>(); | 2478 uint32_t value3 = reader->Read<uint32_t>(); |
2727 | 2479 |
2728 // Create a Float32x4 object. | 2480 // Create a Float32x4 object. |
2729 Int32x4& simd = Int32x4::ZoneHandle(reader->zone(), Int32x4::null()); | 2481 Int32x4& simd = Int32x4::ZoneHandle(reader->zone(), Int32x4::null()); |
2730 | 2482 simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); |
2731 if (Snapshot::IsFull(kind)) { | |
2732 simd = reader->NewInt32x4(value0, value1, value2, value3); | |
2733 } else { | |
2734 simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); | |
2735 } | |
2736 reader->AddBackRef(object_id, &simd, kIsDeserialized); | 2483 reader->AddBackRef(object_id, &simd, kIsDeserialized); |
2737 return simd.raw(); | 2484 return simd.raw(); |
2738 } | 2485 } |
2739 | 2486 |
2740 | 2487 |
2741 void RawInt32x4::WriteTo(SnapshotWriter* writer, | 2488 void RawInt32x4::WriteTo(SnapshotWriter* writer, |
2742 intptr_t object_id, | 2489 intptr_t object_id, |
2743 Snapshot::Kind kind, | 2490 Snapshot::Kind kind, |
2744 bool as_reference) { | 2491 bool as_reference) { |
2745 ASSERT(writer != NULL); | 2492 ASSERT(writer != NULL); |
(...skipping 19 matching lines...) Expand all Loading... |
2765 Snapshot::Kind kind, | 2512 Snapshot::Kind kind, |
2766 bool as_reference) { | 2513 bool as_reference) { |
2767 ASSERT(reader != NULL); | 2514 ASSERT(reader != NULL); |
2768 // Read the values. | 2515 // Read the values. |
2769 double value0 = reader->Read<double>(); | 2516 double value0 = reader->Read<double>(); |
2770 double value1 = reader->Read<double>(); | 2517 double value1 = reader->Read<double>(); |
2771 | 2518 |
2772 // Create a Float64x2 object. | 2519 // Create a Float64x2 object. |
2773 Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), | 2520 Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), |
2774 Float64x2::null()); | 2521 Float64x2::null()); |
2775 if (Snapshot::IsFull(kind)) { | 2522 simd = Float64x2::New(value0, value1, HEAP_SPACE(kind)); |
2776 simd = reader->NewFloat64x2(value0, value1); | |
2777 } else { | |
2778 simd = Float64x2::New(value0, value1, HEAP_SPACE(kind)); | |
2779 } | |
2780 reader->AddBackRef(object_id, &simd, kIsDeserialized); | 2523 reader->AddBackRef(object_id, &simd, kIsDeserialized); |
2781 return simd.raw(); | 2524 return simd.raw(); |
2782 } | 2525 } |
2783 | 2526 |
2784 | 2527 |
2785 void RawFloat64x2::WriteTo(SnapshotWriter* writer, | 2528 void RawFloat64x2::WriteTo(SnapshotWriter* writer, |
2786 intptr_t object_id, | 2529 intptr_t object_id, |
2787 Snapshot::Kind kind, | 2530 Snapshot::Kind kind, |
2788 bool as_reference) { | 2531 bool as_reference) { |
2789 ASSERT(writer != NULL); | 2532 ASSERT(writer != NULL); |
(...skipping 19 matching lines...) Expand all Loading... |
2809 | 2552 |
2810 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader, | 2553 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader, |
2811 intptr_t object_id, | 2554 intptr_t object_id, |
2812 intptr_t tags, | 2555 intptr_t tags, |
2813 Snapshot::Kind kind, | 2556 Snapshot::Kind kind, |
2814 bool as_reference) { | 2557 bool as_reference) { |
2815 ASSERT(reader != NULL); | 2558 ASSERT(reader != NULL); |
2816 | 2559 |
2817 intptr_t cid = RawObject::ClassIdTag::decode(tags); | 2560 intptr_t cid = RawObject::ClassIdTag::decode(tags); |
2818 intptr_t len = reader->ReadSmiValue(); | 2561 intptr_t len = reader->ReadSmiValue(); |
2819 TypedData& result = TypedData::ZoneHandle(reader->zone(), | 2562 TypedData& result = TypedData::ZoneHandle( |
2820 (Snapshot::IsFull(kind)) ? reader->NewTypedData(cid, len) | 2563 reader->zone(), TypedData::New(cid, len, HEAP_SPACE(kind))); |
2821 : TypedData::New(cid, len, HEAP_SPACE(kind))); | |
2822 reader->AddBackRef(object_id, &result, kIsDeserialized); | 2564 reader->AddBackRef(object_id, &result, kIsDeserialized); |
2823 | 2565 |
2824 // Setup the array elements. | 2566 // Setup the array elements. |
2825 intptr_t element_size = ElementSizeInBytes(cid); | 2567 intptr_t element_size = ElementSizeInBytes(cid); |
2826 intptr_t length_in_bytes = len * element_size; | 2568 intptr_t length_in_bytes = len * element_size; |
2827 switch (cid) { | 2569 switch (cid) { |
2828 case kTypedDataInt8ArrayCid: | 2570 case kTypedDataInt8ArrayCid: |
2829 case kTypedDataUint8ArrayCid: | 2571 case kTypedDataUint8ArrayCid: |
2830 case kTypedDataUint8ClampedArrayCid: { | 2572 case kTypedDataUint8ClampedArrayCid: { |
2831 NoSafepointScope no_safepoint; | 2573 NoSafepointScope no_safepoint; |
(...skipping 27 matching lines...) Expand all Loading... |
2859 break; | 2601 break; |
2860 default: | 2602 default: |
2861 UNREACHABLE(); | 2603 UNREACHABLE(); |
2862 } | 2604 } |
2863 // If it is a canonical constant make it one. | 2605 // If it is a canonical constant make it one. |
2864 // When reading a full snapshot we don't need to canonicalize the object | 2606 // When reading a full snapshot we don't need to canonicalize the object |
2865 // as it would already be a canonical object. | 2607 // as it would already be a canonical object. |
2866 // When reading a script snapshot or a message snapshot we always have | 2608 // When reading a script snapshot or a message snapshot we always have |
2867 // to canonicalize the object. | 2609 // to canonicalize the object. |
2868 if (RawObject::IsCanonical(tags)) { | 2610 if (RawObject::IsCanonical(tags)) { |
2869 if (Snapshot::IsFull(kind)) { | 2611 result ^= result.CheckAndCanonicalize(reader->thread(), NULL); |
2870 // Set the canonical bit. | 2612 ASSERT(!result.IsNull()); |
2871 result.SetCanonical(); | 2613 ASSERT(result.IsCanonical()); |
2872 } else { | |
2873 result ^= result.CheckAndCanonicalize(reader->thread(), NULL); | |
2874 ASSERT(!result.IsNull()); | |
2875 ASSERT(result.IsCanonical()); | |
2876 } | |
2877 } | 2614 } |
2878 return result.raw(); | 2615 return result.raw(); |
2879 } | 2616 } |
2880 #undef TYPED_DATA_READ | 2617 #undef TYPED_DATA_READ |
2881 | 2618 |
2882 | 2619 |
2883 RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader, | 2620 RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader, |
2884 intptr_t object_id, | 2621 intptr_t object_id, |
2885 intptr_t tags, | 2622 intptr_t tags, |
2886 Snapshot::Kind kind, | 2623 Snapshot::Kind kind, |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3122 writer->Write<uint64_t>(ptr()->id_); | 2859 writer->Write<uint64_t>(ptr()->id_); |
3123 writer->Write<uint64_t>(ptr()->origin_id_); | 2860 writer->Write<uint64_t>(ptr()->origin_id_); |
3124 } | 2861 } |
3125 | 2862 |
3126 | 2863 |
3127 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader, | 2864 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader, |
3128 intptr_t object_id, | 2865 intptr_t object_id, |
3129 intptr_t tags, | 2866 intptr_t tags, |
3130 Snapshot::Kind kind, | 2867 Snapshot::Kind kind, |
3131 bool as_reference) { | 2868 bool as_reference) { |
3132 if (Snapshot::IsFull(kind)) { | |
3133 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(), | |
3134 reader->NewStacktrace()); | |
3135 reader->AddBackRef(object_id, &result, kIsDeserialized); | |
3136 | |
3137 bool expand_inlined = reader->Read<bool>(); | |
3138 result.set_expand_inlined(expand_inlined); | |
3139 | |
3140 // Set all the object fields. | |
3141 READ_OBJECT_FIELDS(result, | |
3142 result.raw()->from(), result.raw()->to(), | |
3143 kAsReference); | |
3144 | |
3145 return result.raw(); | |
3146 } | |
3147 UNREACHABLE(); // Stacktraces are not sent in a snapshot. | 2869 UNREACHABLE(); // Stacktraces are not sent in a snapshot. |
3148 return Stacktrace::null(); | 2870 return Stacktrace::null(); |
3149 } | 2871 } |
3150 | 2872 |
3151 | 2873 |
3152 void RawStacktrace::WriteTo(SnapshotWriter* writer, | 2874 void RawStacktrace::WriteTo(SnapshotWriter* writer, |
3153 intptr_t object_id, | 2875 intptr_t object_id, |
3154 Snapshot::Kind kind, | 2876 Snapshot::Kind kind, |
3155 bool as_reference) { | 2877 bool as_reference) { |
3156 if (Snapshot::IsFull(kind)) { | 2878 ASSERT(kind == Snapshot::kMessage); |
3157 ASSERT(writer != NULL); | 2879 writer->SetWriteException(Exceptions::kArgument, |
3158 ASSERT(this == Isolate::Current()->object_store()-> | 2880 "Illegal argument in isolate message" |
3159 preallocated_stack_trace()); | 2881 " : (object is a stacktrace)"); |
3160 | |
3161 // Write out the serialization header value for this object. | |
3162 writer->WriteInlinedObjectHeader(object_id); | |
3163 | |
3164 // Write out the class and tags information. | |
3165 writer->WriteIndexedObject(kStacktraceCid); | |
3166 writer->WriteTags(writer->GetObjectTags(this)); | |
3167 | |
3168 writer->Write(ptr()->expand_inlined_); | |
3169 | |
3170 // Write out all the object pointer fields. | |
3171 SnapshotWriterVisitor visitor(writer, kAsReference); | |
3172 visitor.VisitPointers(from(), to()); | |
3173 } else { | |
3174 // Stacktraces are not allowed in other snapshot forms. | |
3175 writer->SetWriteException(Exceptions::kArgument, | |
3176 "Illegal argument in isolate message" | |
3177 " : (object is a stacktrace)"); | |
3178 } | |
3179 } | 2882 } |
3180 | 2883 |
3181 | 2884 |
3182 RawRegExp* RegExp::ReadFrom(SnapshotReader* reader, | 2885 RawRegExp* RegExp::ReadFrom(SnapshotReader* reader, |
3183 intptr_t object_id, | 2886 intptr_t object_id, |
3184 intptr_t tags, | 2887 intptr_t tags, |
3185 Snapshot::Kind kind, | 2888 Snapshot::Kind kind, |
3186 bool as_reference) { | 2889 bool as_reference) { |
3187 ASSERT(reader != NULL); | 2890 ASSERT(reader != NULL); |
3188 | 2891 |
3189 // Allocate RegExp object. | 2892 // Allocate RegExp object. |
3190 RegExp& regex = RegExp::ZoneHandle(reader->zone(), NEW_OBJECT(RegExp)); | 2893 RegExp& regex = RegExp::ZoneHandle(reader->zone(), RegExp::New()); |
3191 reader->AddBackRef(object_id, ®ex, kIsDeserialized); | 2894 reader->AddBackRef(object_id, ®ex, kIsDeserialized); |
3192 | 2895 |
3193 // Read and Set all the other fields. | 2896 // Read and Set all the other fields. |
3194 regex.StoreSmi(®ex.raw_ptr()->num_bracket_expressions_, | 2897 regex.StoreSmi(®ex.raw_ptr()->num_bracket_expressions_, |
3195 reader->ReadAsSmi()); | 2898 reader->ReadAsSmi()); |
3196 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); | 2899 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); |
3197 regex.set_pattern(*reader->StringHandle()); | 2900 regex.set_pattern(*reader->StringHandle()); |
3198 regex.StoreNonPointer(®ex.raw_ptr()->num_registers_, | 2901 regex.StoreNonPointer(®ex.raw_ptr()->num_registers_, |
3199 reader->Read<int32_t>()); | 2902 reader->Read<int32_t>()); |
3200 regex.StoreNonPointer(®ex.raw_ptr()->type_flags_, | 2903 regex.StoreNonPointer(®ex.raw_ptr()->type_flags_, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3237 | 2940 |
3238 | 2941 |
3239 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, | 2942 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, |
3240 intptr_t object_id, | 2943 intptr_t object_id, |
3241 intptr_t tags, | 2944 intptr_t tags, |
3242 Snapshot::Kind kind, | 2945 Snapshot::Kind kind, |
3243 bool as_reference) { | 2946 bool as_reference) { |
3244 ASSERT(reader != NULL); | 2947 ASSERT(reader != NULL); |
3245 | 2948 |
3246 // Allocate the weak property object. | 2949 // Allocate the weak property object. |
3247 WeakProperty& weak_property = WeakProperty::ZoneHandle( | 2950 WeakProperty& weak_property = WeakProperty::ZoneHandle(reader->zone(), |
3248 reader->zone(), NEW_OBJECT(WeakProperty)); | 2951 WeakProperty::New()); |
3249 reader->AddBackRef(object_id, &weak_property, kIsDeserialized); | 2952 reader->AddBackRef(object_id, &weak_property, kIsDeserialized); |
3250 | 2953 |
3251 // Set all the object fields. | 2954 // Set all the object fields. |
3252 READ_OBJECT_FIELDS(weak_property, | 2955 READ_OBJECT_FIELDS(weak_property, |
3253 weak_property.raw()->from(), weak_property.raw()->to(), | 2956 weak_property.raw()->from(), weak_property.raw()->to(), |
3254 kAsReference); | 2957 kAsReference); |
3255 | 2958 |
3256 return weak_property.raw(); | 2959 return weak_property.raw(); |
3257 } | 2960 } |
3258 | 2961 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3319 // We do not allow objects with native fields in an isolate message. | 3022 // We do not allow objects with native fields in an isolate message. |
3320 writer->SetWriteException(Exceptions::kArgument, | 3023 writer->SetWriteException(Exceptions::kArgument, |
3321 "Illegal argument in isolate message" | 3024 "Illegal argument in isolate message" |
3322 " : (object is a UserTag)"); | 3025 " : (object is a UserTag)"); |
3323 } else { | 3026 } else { |
3324 UNREACHABLE(); | 3027 UNREACHABLE(); |
3325 } | 3028 } |
3326 } | 3029 } |
3327 | 3030 |
3328 } // namespace dart | 3031 } // namespace dart |
OLD | NEW |