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