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

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

Issue 1388543008: 1. Write the backing data array of a GrowableObjectArray as a reference (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: sync-to-tot Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/native_entry.h" 5 #include "vm/native_entry.h"
6 #include "vm/object.h" 6 #include "vm/object.h"
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/snapshot.h" 8 #include "vm/snapshot.h"
9 #include "vm/stub_code.h" 9 #include "vm/stub_code.h"
10 #include "vm/symbols.h" 10 #include "vm/symbols.h"
(...skipping 24 matching lines...) Expand all
35 for (intptr_t i = 0; i <= num_flds; i++) { \ 35 for (intptr_t i = 0; i <= num_flds; i++) { \
36 (*reader->PassiveObjectHandle()) = \ 36 (*reader->PassiveObjectHandle()) = \
37 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \ 37 reader->ReadObjectImpl(as_reference, object_id, (i + from_offset)); \
38 object.StorePointer(((from) + i), \ 38 object.StorePointer(((from) + i), \
39 reader->PassiveObjectHandle()->raw()); \ 39 reader->PassiveObjectHandle()->raw()); \
40 } 40 }
41 41
42 RawClass* Class::ReadFrom(SnapshotReader* reader, 42 RawClass* Class::ReadFrom(SnapshotReader* reader,
43 intptr_t object_id, 43 intptr_t object_id,
44 intptr_t tags, 44 intptr_t tags,
45 Snapshot::Kind kind) { 45 Snapshot::Kind kind,
46 bool as_reference) {
46 ASSERT(reader != NULL); 47 ASSERT(reader != NULL);
47 48
48 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); 49 Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
49 bool is_in_fullsnapshot = reader->Read<bool>(); 50 bool is_in_fullsnapshot = reader->Read<bool>();
50 if ((kind == Snapshot::kFull) || 51 if ((kind == Snapshot::kFull) ||
51 (kind == Snapshot::kScript && !is_in_fullsnapshot)) { 52 (kind == Snapshot::kScript && !is_in_fullsnapshot)) {
52 // Read in the base information. 53 // Read in the base information.
53 classid_t class_id = reader->ReadClassIDValue(); 54 classid_t class_id = reader->ReadClassIDValue();
54 55
55 // Allocate class object of specified kind. 56 // Allocate class object of specified kind.
(...skipping 29 matching lines...) Expand all
85 } else { 86 } else {
86 cls ^= reader->ReadClassId(object_id); 87 cls ^= reader->ReadClassId(object_id);
87 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); 88 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot());
88 } 89 }
89 return cls.raw(); 90 return cls.raw();
90 } 91 }
91 92
92 93
93 void RawClass::WriteTo(SnapshotWriter* writer, 94 void RawClass::WriteTo(SnapshotWriter* writer,
94 intptr_t object_id, 95 intptr_t object_id,
95 Snapshot::Kind kind) { 96 Snapshot::Kind kind,
97 bool as_reference) {
96 ASSERT(writer != NULL); 98 ASSERT(writer != NULL);
97 bool is_in_fullsnapshot = Class::IsInFullSnapshot(this); 99 bool is_in_fullsnapshot = Class::IsInFullSnapshot(this);
98 100
99 // Write out the serialization header value for this object. 101 // Write out the serialization header value for this object.
100 writer->WriteInlinedObjectHeader(object_id); 102 writer->WriteInlinedObjectHeader(object_id);
101 103
102 // Write out the class and tags information. 104 // Write out the class and tags information.
103 writer->WriteVMIsolateObject(kClassCid); 105 writer->WriteVMIsolateObject(kClassCid);
104 writer->WriteTags(writer->GetObjectTags(this)); 106 writer->WriteTags(writer->GetObjectTags(this));
105 107
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 "Illegal argument in isolate message" 143 "Illegal argument in isolate message"
142 " : (object is a regular Dart Instance)"); 144 " : (object is a regular Dart Instance)");
143 } 145 }
144 } 146 }
145 } 147 }
146 148
147 149
148 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader, 150 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader,
149 intptr_t object_id, 151 intptr_t object_id,
150 intptr_t tags, 152 intptr_t tags,
151 Snapshot::Kind kind) { 153 Snapshot::Kind kind,
154 bool as_reference) {
152 ASSERT(reader != NULL); 155 ASSERT(reader != NULL);
153 156
154 // Allocate unresolved class object. 157 // Allocate unresolved class object.
155 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( 158 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle(
156 reader->zone(), NEW_OBJECT(UnresolvedClass)); 159 reader->zone(), NEW_OBJECT(UnresolvedClass));
157 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); 160 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
158 161
159 // Set all non object fields. 162 // Set all non object fields.
160 unresolved_class.set_token_pos(reader->Read<int32_t>()); 163 unresolved_class.set_token_pos(reader->Read<int32_t>());
161 164
162 // Set all the object fields. 165 // Set all the object fields.
163 READ_OBJECT_FIELDS(unresolved_class, 166 READ_OBJECT_FIELDS(unresolved_class,
164 unresolved_class.raw()->from(), 167 unresolved_class.raw()->from(),
165 unresolved_class.raw()->to(), 168 unresolved_class.raw()->to(),
166 kAsReference); 169 kAsReference);
167 170
168 return unresolved_class.raw(); 171 return unresolved_class.raw();
169 } 172 }
170 173
171 174
172 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, 175 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer,
173 intptr_t object_id, 176 intptr_t object_id,
174 Snapshot::Kind kind) { 177 Snapshot::Kind kind,
178 bool as_reference) {
175 ASSERT(writer != NULL); 179 ASSERT(writer != NULL);
176 180
177 // Write out the serialization header value for this object. 181 // Write out the serialization header value for this object.
178 writer->WriteInlinedObjectHeader(object_id); 182 writer->WriteInlinedObjectHeader(object_id);
179 183
180 // Write out the class and tags information. 184 // Write out the class and tags information.
181 writer->WriteVMIsolateObject(kUnresolvedClassCid); 185 writer->WriteVMIsolateObject(kUnresolvedClassCid);
182 writer->WriteTags(writer->GetObjectTags(this)); 186 writer->WriteTags(writer->GetObjectTags(this));
183 187
184 // Write out all the non object pointer fields. 188 // Write out all the non object pointer fields.
185 writer->Write<int32_t>(ptr()->token_pos_); 189 writer->Write<int32_t>(ptr()->token_pos_);
186 190
187 // Write out all the object pointer fields. 191 // Write out all the object pointer fields.
188 SnapshotWriterVisitor visitor(writer, kAsReference); 192 SnapshotWriterVisitor visitor(writer, kAsReference);
189 visitor.VisitPointers(from(), to()); 193 visitor.VisitPointers(from(), to());
190 } 194 }
191 195
192 196
193 RawAbstractType* AbstractType::ReadFrom(SnapshotReader* reader, 197 RawAbstractType* AbstractType::ReadFrom(SnapshotReader* reader,
194 intptr_t object_id, 198 intptr_t object_id,
195 intptr_t tags, 199 intptr_t tags,
196 Snapshot::Kind kind) { 200 Snapshot::Kind kind,
201 bool as_reference) {
197 UNREACHABLE(); // AbstractType is an abstract class. 202 UNREACHABLE(); // AbstractType is an abstract class.
198 return NULL; 203 return NULL;
199 } 204 }
200 205
201 206
202 void RawAbstractType::WriteTo(SnapshotWriter* writer, 207 void RawAbstractType::WriteTo(SnapshotWriter* writer,
203 intptr_t object_id, 208 intptr_t object_id,
204 Snapshot::Kind kind) { 209 Snapshot::Kind kind,
210 bool as_reference) {
205 UNREACHABLE(); // AbstractType is an abstract class. 211 UNREACHABLE(); // AbstractType is an abstract class.
206 } 212 }
207 213
208 214
209 RawType* Type::ReadFrom(SnapshotReader* reader, 215 RawType* Type::ReadFrom(SnapshotReader* reader,
210 intptr_t object_id, 216 intptr_t object_id,
211 intptr_t tags, 217 intptr_t tags,
212 Snapshot::Kind kind) { 218 Snapshot::Kind kind,
219 bool as_reference) {
213 ASSERT(reader != NULL); 220 ASSERT(reader != NULL);
214 221
215 // Determine if the type class of this type is in the full snapshot. 222 // Determine if the type class of this type is in the full snapshot.
216 bool typeclass_is_in_fullsnapshot = reader->Read<bool>(); 223 bool typeclass_is_in_fullsnapshot = reader->Read<bool>();
217 224
218 // Allocate type object. 225 // Allocate type object.
219 Type& type = Type::ZoneHandle(reader->zone(), NEW_OBJECT(Type)); 226 Type& type = Type::ZoneHandle(reader->zone(), NEW_OBJECT(Type));
220 bool is_canonical = RawObject::IsCanonical(tags); 227 bool is_canonical = RawObject::IsCanonical(tags);
221 bool defer_canonicalization = is_canonical && 228 bool defer_canonicalization = is_canonical &&
222 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot); 229 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot);
(...skipping 10 matching lines...) Expand all
233 if (!defer_canonicalization && RawObject::IsCanonical(tags)) { 240 if (!defer_canonicalization && RawObject::IsCanonical(tags)) {
234 type.SetCanonical(); 241 type.SetCanonical();
235 } 242 }
236 243
237 return type.raw(); 244 return type.raw();
238 } 245 }
239 246
240 247
241 void RawType::WriteTo(SnapshotWriter* writer, 248 void RawType::WriteTo(SnapshotWriter* writer,
242 intptr_t object_id, 249 intptr_t object_id,
243 Snapshot::Kind kind) { 250 Snapshot::Kind kind,
251 bool as_reference) {
244 ASSERT(writer != NULL); 252 ASSERT(writer != NULL);
245 253
246 // Only resolved and finalized types should be written to a snapshot. 254 // Only resolved and finalized types should be written to a snapshot.
247 ASSERT((ptr()->type_state_ == RawType::kFinalizedInstantiated) || 255 ASSERT((ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
248 (ptr()->type_state_ == RawType::kFinalizedUninstantiated)); 256 (ptr()->type_state_ == RawType::kFinalizedUninstantiated));
249 ASSERT(ptr()->type_class_ != Object::null()); 257 ASSERT(ptr()->type_class_ != Object::null());
250 258
251 // Write out the serialization header value for this object. 259 // Write out the serialization header value for this object.
252 writer->WriteInlinedObjectHeader(object_id); 260 writer->WriteInlinedObjectHeader(object_id);
253 261
(...skipping 18 matching lines...) Expand all
272 // inline and not as references. 280 // inline and not as references.
273 ASSERT(ptr()->type_class_ != Object::null()); 281 ASSERT(ptr()->type_class_ != Object::null());
274 SnapshotWriterVisitor visitor(writer, kAsReference); 282 SnapshotWriterVisitor visitor(writer, kAsReference);
275 visitor.VisitPointers(from(), to()); 283 visitor.VisitPointers(from(), to());
276 } 284 }
277 285
278 286
279 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader, 287 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader,
280 intptr_t object_id, 288 intptr_t object_id,
281 intptr_t tags, 289 intptr_t tags,
282 Snapshot::Kind kind) { 290 Snapshot::Kind kind,
291 bool as_reference) {
283 ASSERT(reader != NULL); 292 ASSERT(reader != NULL);
284 293
285 // Allocate type ref object. 294 // Allocate type ref object.
286 TypeRef& type_ref = TypeRef::ZoneHandle( 295 TypeRef& type_ref = TypeRef::ZoneHandle(
287 reader->zone(), NEW_OBJECT(TypeRef)); 296 reader->zone(), NEW_OBJECT(TypeRef));
288 reader->AddBackRef(object_id, &type_ref, kIsDeserialized); 297 reader->AddBackRef(object_id, &type_ref, kIsDeserialized);
289 298
290 // Set all the object fields. 299 // Set all the object fields.
291 READ_OBJECT_FIELDS(type_ref, 300 READ_OBJECT_FIELDS(type_ref,
292 type_ref.raw()->from(), type_ref.raw()->to(), 301 type_ref.raw()->from(), type_ref.raw()->to(),
293 kAsReference); 302 kAsReference);
294 303
295 return type_ref.raw(); 304 return type_ref.raw();
296 } 305 }
297 306
298 307
299 void RawTypeRef::WriteTo(SnapshotWriter* writer, 308 void RawTypeRef::WriteTo(SnapshotWriter* writer,
300 intptr_t object_id, 309 intptr_t object_id,
301 Snapshot::Kind kind) { 310 Snapshot::Kind kind,
311 bool as_reference) {
302 ASSERT(writer != NULL); 312 ASSERT(writer != NULL);
303 313
304 // Write out the serialization header value for this object. 314 // Write out the serialization header value for this object.
305 writer->WriteInlinedObjectHeader(object_id); 315 writer->WriteInlinedObjectHeader(object_id);
306 316
307 // Write out the class and tags information. 317 // Write out the class and tags information.
308 writer->WriteIndexedObject(kTypeRefCid); 318 writer->WriteIndexedObject(kTypeRefCid);
309 writer->WriteTags(writer->GetObjectTags(this)); 319 writer->WriteTags(writer->GetObjectTags(this));
310 320
311 // Write out all the object pointer fields. 321 // Write out all the object pointer fields.
312 SnapshotWriterVisitor visitor(writer, kAsReference); 322 SnapshotWriterVisitor visitor(writer, kAsReference);
313 visitor.VisitPointers(from(), to()); 323 visitor.VisitPointers(from(), to());
314 } 324 }
315 325
316 326
317 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader, 327 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader,
318 intptr_t object_id, 328 intptr_t object_id,
319 intptr_t tags, 329 intptr_t tags,
320 Snapshot::Kind kind) { 330 Snapshot::Kind kind,
331 bool as_reference) {
321 ASSERT(reader != NULL); 332 ASSERT(reader != NULL);
322 333
323 // Allocate type parameter object. 334 // Allocate type parameter object.
324 TypeParameter& type_parameter = TypeParameter::ZoneHandle( 335 TypeParameter& type_parameter = TypeParameter::ZoneHandle(
325 reader->zone(), NEW_OBJECT(TypeParameter)); 336 reader->zone(), NEW_OBJECT(TypeParameter));
326 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); 337 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
327 338
328 // Set all non object fields. 339 // Set all non object fields.
329 type_parameter.set_token_pos(reader->Read<int32_t>()); 340 type_parameter.set_token_pos(reader->Read<int32_t>());
330 type_parameter.set_index(reader->Read<int16_t>()); 341 type_parameter.set_index(reader->Read<int16_t>());
331 type_parameter.set_type_state(reader->Read<int8_t>()); 342 type_parameter.set_type_state(reader->Read<int8_t>());
332 343
333 // Set all the object fields. 344 // Set all the object fields.
334 READ_OBJECT_FIELDS(type_parameter, 345 READ_OBJECT_FIELDS(type_parameter,
335 type_parameter.raw()->from(), type_parameter.raw()->to(), 346 type_parameter.raw()->from(), type_parameter.raw()->to(),
336 kAsReference); 347 kAsReference);
337 348
338 return type_parameter.raw(); 349 return type_parameter.raw();
339 } 350 }
340 351
341 352
342 void RawTypeParameter::WriteTo(SnapshotWriter* writer, 353 void RawTypeParameter::WriteTo(SnapshotWriter* writer,
343 intptr_t object_id, 354 intptr_t object_id,
344 Snapshot::Kind kind) { 355 Snapshot::Kind kind,
356 bool as_reference) {
345 ASSERT(writer != NULL); 357 ASSERT(writer != NULL);
346 358
347 // Only finalized type parameters should be written to a snapshot. 359 // Only finalized type parameters should be written to a snapshot.
348 ASSERT(ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated); 360 ASSERT(ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated);
349 361
350 // Write out the serialization header value for this object. 362 // Write out the serialization header value for this object.
351 writer->WriteInlinedObjectHeader(object_id); 363 writer->WriteInlinedObjectHeader(object_id);
352 364
353 // Write out the class and tags information. 365 // Write out the class and tags information.
354 writer->WriteIndexedObject(kTypeParameterCid); 366 writer->WriteIndexedObject(kTypeParameterCid);
355 writer->WriteTags(writer->GetObjectTags(this)); 367 writer->WriteTags(writer->GetObjectTags(this));
356 368
357 // Write out all the non object pointer fields. 369 // Write out all the non object pointer fields.
358 writer->Write<int32_t>(ptr()->token_pos_); 370 writer->Write<int32_t>(ptr()->token_pos_);
359 writer->Write<int16_t>(ptr()->index_); 371 writer->Write<int16_t>(ptr()->index_);
360 writer->Write<int8_t>(ptr()->type_state_); 372 writer->Write<int8_t>(ptr()->type_state_);
361 373
362 // Write out all the object pointer fields. 374 // Write out all the object pointer fields.
363 SnapshotWriterVisitor visitor(writer, kAsReference); 375 SnapshotWriterVisitor visitor(writer, kAsReference);
364 visitor.VisitPointers(from(), to()); 376 visitor.VisitPointers(from(), to());
365 } 377 }
366 378
367 379
368 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader, 380 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader,
369 intptr_t object_id, 381 intptr_t object_id,
370 intptr_t tags, 382 intptr_t tags,
371 Snapshot::Kind kind) { 383 Snapshot::Kind kind,
384 bool as_reference) {
372 ASSERT(reader != NULL); 385 ASSERT(reader != NULL);
373 386
374 // Allocate bounded type object. 387 // Allocate bounded type object.
375 BoundedType& bounded_type = BoundedType::ZoneHandle( 388 BoundedType& bounded_type = BoundedType::ZoneHandle(
376 reader->zone(), NEW_OBJECT(BoundedType)); 389 reader->zone(), NEW_OBJECT(BoundedType));
377 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized); 390 reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
378 391
379 // Set all the object fields. 392 // Set all the object fields.
380 READ_OBJECT_FIELDS(bounded_type, 393 READ_OBJECT_FIELDS(bounded_type,
381 bounded_type.raw()->from(), bounded_type.raw()->to(), 394 bounded_type.raw()->from(), bounded_type.raw()->to(),
382 kAsReference); 395 kAsReference);
383 396
384 return bounded_type.raw(); 397 return bounded_type.raw();
385 } 398 }
386 399
387 400
388 void RawBoundedType::WriteTo(SnapshotWriter* writer, 401 void RawBoundedType::WriteTo(SnapshotWriter* writer,
389 intptr_t object_id, 402 intptr_t object_id,
390 Snapshot::Kind kind) { 403 Snapshot::Kind kind,
404 bool as_reference) {
391 ASSERT(writer != NULL); 405 ASSERT(writer != NULL);
392 406
393 // Write out the serialization header value for this object. 407 // Write out the serialization header value for this object.
394 writer->WriteInlinedObjectHeader(object_id); 408 writer->WriteInlinedObjectHeader(object_id);
395 409
396 // Write out the class and tags information. 410 // Write out the class and tags information.
397 writer->WriteIndexedObject(kBoundedTypeCid); 411 writer->WriteIndexedObject(kBoundedTypeCid);
398 writer->WriteTags(writer->GetObjectTags(this)); 412 writer->WriteTags(writer->GetObjectTags(this));
399 413
400 // Write out all the object pointer fields. 414 // Write out all the object pointer fields.
401 SnapshotWriterVisitor visitor(writer, kAsReference); 415 SnapshotWriterVisitor visitor(writer, kAsReference);
402 visitor.VisitPointers(from(), to()); 416 visitor.VisitPointers(from(), to());
403 } 417 }
404 418
405 419
406 RawMixinAppType* MixinAppType::ReadFrom(SnapshotReader* reader, 420 RawMixinAppType* MixinAppType::ReadFrom(SnapshotReader* reader,
407 intptr_t object_id, 421 intptr_t object_id,
408 intptr_t tags, 422 intptr_t tags,
409 Snapshot::Kind kind) { 423 Snapshot::Kind kind,
424 bool as_reference) {
410 UNREACHABLE(); // MixinAppType objects do not survive finalization. 425 UNREACHABLE(); // MixinAppType objects do not survive finalization.
411 return MixinAppType::null(); 426 return MixinAppType::null();
412 } 427 }
413 428
414 429
415 void RawMixinAppType::WriteTo(SnapshotWriter* writer, 430 void RawMixinAppType::WriteTo(SnapshotWriter* writer,
416 intptr_t object_id, 431 intptr_t object_id,
417 Snapshot::Kind kind) { 432 Snapshot::Kind kind,
433 bool as_reference) {
418 UNREACHABLE(); // MixinAppType objects do not survive finalization. 434 UNREACHABLE(); // MixinAppType objects do not survive finalization.
419 } 435 }
420 436
421 437
422 RawTypeArguments* TypeArguments::ReadFrom(SnapshotReader* reader, 438 RawTypeArguments* TypeArguments::ReadFrom(SnapshotReader* reader,
423 intptr_t object_id, 439 intptr_t object_id,
424 intptr_t tags, 440 intptr_t tags,
425 Snapshot::Kind kind) { 441 Snapshot::Kind kind,
442 bool as_reference) {
426 ASSERT(reader != NULL); 443 ASSERT(reader != NULL);
427 444
428 // Read the length so that we can determine instance size to allocate. 445 // Read the length so that we can determine instance size to allocate.
429 intptr_t len = reader->ReadSmiValue(); 446 intptr_t len = reader->ReadSmiValue();
430 447
431 TypeArguments& type_arguments = TypeArguments::ZoneHandle( 448 TypeArguments& type_arguments = TypeArguments::ZoneHandle(
432 reader->zone(), NEW_OBJECT_WITH_LEN_SPACE(TypeArguments, len, kind)); 449 reader->zone(), NEW_OBJECT_WITH_LEN_SPACE(TypeArguments, len, kind));
433 bool is_canonical = RawObject::IsCanonical(tags); 450 bool is_canonical = RawObject::IsCanonical(tags);
434 bool defer_canonicalization = is_canonical && (kind != Snapshot::kFull); 451 bool defer_canonicalization = is_canonical && (kind != Snapshot::kFull);
435 reader->AddBackRef(object_id, 452 reader->AddBackRef(object_id,
(...skipping 22 matching lines...) Expand all
458 if (!defer_canonicalization && RawObject::IsCanonical(tags)) { 475 if (!defer_canonicalization && RawObject::IsCanonical(tags)) {
459 type_arguments.SetCanonical(); 476 type_arguments.SetCanonical();
460 } 477 }
461 478
462 return type_arguments.raw(); 479 return type_arguments.raw();
463 } 480 }
464 481
465 482
466 void RawTypeArguments::WriteTo(SnapshotWriter* writer, 483 void RawTypeArguments::WriteTo(SnapshotWriter* writer,
467 intptr_t object_id, 484 intptr_t object_id,
468 Snapshot::Kind kind) { 485 Snapshot::Kind kind,
486 bool as_reference) {
469 ASSERT(writer != NULL); 487 ASSERT(writer != NULL);
470 488
471 // Write out the serialization header value for this object. 489 // Write out the serialization header value for this object.
472 writer->WriteInlinedObjectHeader(object_id); 490 writer->WriteInlinedObjectHeader(object_id);
473 491
474 // Write out the class and tags information. 492 // Write out the class and tags information.
475 writer->WriteVMIsolateObject(kTypeArgumentsCid); 493 writer->WriteVMIsolateObject(kTypeArgumentsCid);
476 writer->WriteTags(writer->GetObjectTags(this)); 494 writer->WriteTags(writer->GetObjectTags(this));
477 495
478 // Write out the length field. 496 // Write out the length field.
479 writer->Write<RawObject*>(ptr()->length_); 497 writer->Write<RawObject*>(ptr()->length_);
480 498
481 // Write out the instantiations field, but only in a full snapshot. 499 // Write out the instantiations field, but only in a full snapshot.
482 if (kind == Snapshot::kFull) { 500 if (kind == Snapshot::kFull) {
483 writer->WriteObjectImpl(ptr()->instantiations_, kAsInlinedObject); 501 writer->WriteObjectImpl(ptr()->instantiations_, kAsInlinedObject);
484 } 502 }
485 503
486 // Write out the individual types. 504 // Write out the individual types.
487 intptr_t len = Smi::Value(ptr()->length_); 505 intptr_t len = Smi::Value(ptr()->length_);
488 for (intptr_t i = 0; i < len; i++) { 506 for (intptr_t i = 0; i < len; i++) {
489 writer->WriteObjectImpl(ptr()->types()[i], kAsReference); 507 writer->WriteObjectImpl(ptr()->types()[i], kAsReference);
490 } 508 }
491 } 509 }
492 510
493 511
494 RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader, 512 RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader,
495 intptr_t object_id, 513 intptr_t object_id,
496 intptr_t tags, 514 intptr_t tags,
497 Snapshot::Kind kind) { 515 Snapshot::Kind kind,
516 bool as_reference) {
498 ASSERT(reader != NULL); 517 ASSERT(reader != NULL);
499 518
500 // Allocate function object. 519 // Allocate function object.
501 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(), 520 PatchClass& cls = PatchClass::ZoneHandle(reader->zone(),
502 NEW_OBJECT(PatchClass)); 521 NEW_OBJECT(PatchClass));
503 reader->AddBackRef(object_id, &cls, kIsDeserialized); 522 reader->AddBackRef(object_id, &cls, kIsDeserialized);
504 523
505 // Set all the object fields. 524 // Set all the object fields.
506 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); 525 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference);
507 526
508 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 527 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
509 return cls.raw(); 528 return cls.raw();
510 } 529 }
511 530
512 531
513 void RawPatchClass::WriteTo(SnapshotWriter* writer, 532 void RawPatchClass::WriteTo(SnapshotWriter* writer,
514 intptr_t object_id, 533 intptr_t object_id,
515 Snapshot::Kind kind) { 534 Snapshot::Kind kind,
535 bool as_reference) {
516 ASSERT(writer != NULL); 536 ASSERT(writer != NULL);
517 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 537 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
518 538
519 // Write out the serialization header value for this object. 539 // Write out the serialization header value for this object.
520 writer->WriteInlinedObjectHeader(object_id); 540 writer->WriteInlinedObjectHeader(object_id);
521 541
522 // Write out the class and tags information. 542 // Write out the class and tags information.
523 writer->WriteVMIsolateObject(kPatchClassCid); 543 writer->WriteVMIsolateObject(kPatchClassCid);
524 writer->WriteTags(writer->GetObjectTags(this)); 544 writer->WriteTags(writer->GetObjectTags(this));
525 // Write out all the object pointer fields. 545 // Write out all the object pointer fields.
526 SnapshotWriterVisitor visitor(writer, kAsReference); 546 SnapshotWriterVisitor visitor(writer, kAsReference);
527 visitor.VisitPointers(from(), to()); 547 visitor.VisitPointers(from(), to());
528 } 548 }
529 549
530 550
531 RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader, 551 RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader,
532 intptr_t object_id, 552 intptr_t object_id,
533 intptr_t tags, 553 intptr_t tags,
534 Snapshot::Kind kind) { 554 Snapshot::Kind kind,
555 bool as_reference) {
535 ASSERT(reader != NULL); 556 ASSERT(reader != NULL);
536 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 557 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
537 558
538 // Allocate closure data object. 559 // Allocate closure data object.
539 ClosureData& data = ClosureData::ZoneHandle( 560 ClosureData& data = ClosureData::ZoneHandle(
540 reader->zone(), NEW_OBJECT(ClosureData)); 561 reader->zone(), NEW_OBJECT(ClosureData));
541 reader->AddBackRef(object_id, &data, kIsDeserialized); 562 reader->AddBackRef(object_id, &data, kIsDeserialized);
542 563
543 // Set all the object fields. 564 // Set all the object fields.
544 READ_OBJECT_FIELDS(data, 565 READ_OBJECT_FIELDS(data,
545 data.raw()->from(), data.raw()->to(), 566 data.raw()->from(), data.raw()->to(),
546 kAsInlinedObject); 567 kAsInlinedObject);
547 568
548 return data.raw(); 569 return data.raw();
549 } 570 }
550 571
551 572
552 void RawClosureData::WriteTo(SnapshotWriter* writer, 573 void RawClosureData::WriteTo(SnapshotWriter* writer,
553 intptr_t object_id, 574 intptr_t object_id,
554 Snapshot::Kind kind) { 575 Snapshot::Kind kind,
576 bool as_reference) {
555 ASSERT(writer != NULL); 577 ASSERT(writer != NULL);
556 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 578 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
557 579
558 // Write out the serialization header value for this object. 580 // Write out the serialization header value for this object.
559 writer->WriteInlinedObjectHeader(object_id); 581 writer->WriteInlinedObjectHeader(object_id);
560 582
561 // Write out the class and tags information. 583 // Write out the class and tags information.
562 writer->WriteVMIsolateObject(kClosureDataCid); 584 writer->WriteVMIsolateObject(kClosureDataCid);
563 writer->WriteTags(writer->GetObjectTags(this)); 585 writer->WriteTags(writer->GetObjectTags(this));
564 586
(...skipping 17 matching lines...) Expand all
582 604
583 // Static closure/Closure allocation stub. 605 // Static closure/Closure allocation stub.
584 // We don't write the closure or allocation stub in the snapshot. 606 // We don't write the closure or allocation stub in the snapshot.
585 writer->WriteVMIsolateObject(kNullObject); 607 writer->WriteVMIsolateObject(kNullObject);
586 } 608 }
587 609
588 610
589 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader, 611 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
590 intptr_t object_id, 612 intptr_t object_id,
591 intptr_t tags, 613 intptr_t tags,
592 Snapshot::Kind kind) { 614 Snapshot::Kind kind,
615 bool as_reference) {
593 ASSERT(reader != NULL); 616 ASSERT(reader != NULL);
594 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 617 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
595 618
596 // Allocate redirection data object. 619 // Allocate redirection data object.
597 RedirectionData& data = RedirectionData::ZoneHandle( 620 RedirectionData& data = RedirectionData::ZoneHandle(
598 reader->zone(), NEW_OBJECT(RedirectionData)); 621 reader->zone(), NEW_OBJECT(RedirectionData));
599 reader->AddBackRef(object_id, &data, kIsDeserialized); 622 reader->AddBackRef(object_id, &data, kIsDeserialized);
600 623
601 // Set all the object fields. 624 // Set all the object fields.
602 READ_OBJECT_FIELDS(data, 625 READ_OBJECT_FIELDS(data,
603 data.raw()->from(), data.raw()->to(), 626 data.raw()->from(), data.raw()->to(),
604 kAsReference); 627 kAsReference);
605 628
606 return data.raw(); 629 return data.raw();
607 } 630 }
608 631
609 632
610 void RawRedirectionData::WriteTo(SnapshotWriter* writer, 633 void RawRedirectionData::WriteTo(SnapshotWriter* writer,
611 intptr_t object_id, 634 intptr_t object_id,
612 Snapshot::Kind kind) { 635 Snapshot::Kind kind,
636 bool as_reference) {
613 ASSERT(writer != NULL); 637 ASSERT(writer != NULL);
614 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 638 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
615 639
616 // Write out the serialization header value for this object. 640 // Write out the serialization header value for this object.
617 writer->WriteInlinedObjectHeader(object_id); 641 writer->WriteInlinedObjectHeader(object_id);
618 642
619 // Write out the class and tags information. 643 // Write out the class and tags information.
620 writer->WriteVMIsolateObject(kRedirectionDataCid); 644 writer->WriteVMIsolateObject(kRedirectionDataCid);
621 writer->WriteTags(writer->GetObjectTags(this)); 645 writer->WriteTags(writer->GetObjectTags(this));
622 646
623 // Write out all the object pointer fields. 647 // Write out all the object pointer fields.
624 SnapshotWriterVisitor visitor(writer, kAsReference); 648 SnapshotWriterVisitor visitor(writer, kAsReference);
625 visitor.VisitPointers(from(), to()); 649 visitor.VisitPointers(from(), to());
626 } 650 }
627 651
628 652
629 RawFunction* Function::ReadFrom(SnapshotReader* reader, 653 RawFunction* Function::ReadFrom(SnapshotReader* reader,
630 intptr_t object_id, 654 intptr_t object_id,
631 intptr_t tags, 655 intptr_t tags,
632 Snapshot::Kind kind) { 656 Snapshot::Kind kind,
657 bool as_reference) {
633 ASSERT(reader != NULL); 658 ASSERT(reader != NULL);
634 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 659 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
635 660
636 bool is_in_fullsnapshot = reader->Read<bool>(); 661 bool is_in_fullsnapshot = reader->Read<bool>();
637 if ((kind == Snapshot::kFull) || !is_in_fullsnapshot) { 662 if ((kind == Snapshot::kFull) || !is_in_fullsnapshot) {
638 // Allocate function object. 663 // Allocate function object.
639 Function& func = Function::ZoneHandle( 664 Function& func = Function::ZoneHandle(
640 reader->zone(), NEW_OBJECT(Function)); 665 reader->zone(), NEW_OBJECT(Function));
641 reader->AddBackRef(object_id, &func, kIsDeserialized); 666 reader->AddBackRef(object_id, &func, kIsDeserialized);
642 667
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 } 700 }
676 return func.raw(); 701 return func.raw();
677 } else { 702 } else {
678 return reader->ReadFunctionId(object_id); 703 return reader->ReadFunctionId(object_id);
679 } 704 }
680 } 705 }
681 706
682 707
683 void RawFunction::WriteTo(SnapshotWriter* writer, 708 void RawFunction::WriteTo(SnapshotWriter* writer,
684 intptr_t object_id, 709 intptr_t object_id,
685 Snapshot::Kind kind) { 710 Snapshot::Kind kind,
711 bool as_reference) {
686 ASSERT(writer != NULL); 712 ASSERT(writer != NULL);
687 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 713 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
688 bool is_in_fullsnapshot = false; 714 bool is_in_fullsnapshot = false;
689 bool owner_is_class = false; 715 bool owner_is_class = false;
690 if (kind == Snapshot::kScript) { 716 if (kind == Snapshot::kScript) {
691 intptr_t tags = writer->GetObjectTags(ptr()->owner_); 717 intptr_t tags = writer->GetObjectTags(ptr()->owner_);
692 intptr_t cid = ClassIdTag::decode(tags); 718 intptr_t cid = ClassIdTag::decode(tags);
693 owner_is_class = (cid == kClassCid); 719 owner_is_class = (cid == kClassCid);
694 is_in_fullsnapshot = owner_is_class ? 720 is_in_fullsnapshot = owner_is_class ?
695 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) : 721 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) :
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 } 769 }
744 } else { 770 } else {
745 writer->WriteFunctionId(this, owner_is_class); 771 writer->WriteFunctionId(this, owner_is_class);
746 } 772 }
747 } 773 }
748 774
749 775
750 RawField* Field::ReadFrom(SnapshotReader* reader, 776 RawField* Field::ReadFrom(SnapshotReader* reader,
751 intptr_t object_id, 777 intptr_t object_id,
752 intptr_t tags, 778 intptr_t tags,
753 Snapshot::Kind kind) { 779 Snapshot::Kind kind,
780 bool as_reference) {
754 ASSERT(reader != NULL); 781 ASSERT(reader != NULL);
755 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 782 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
756 783
757 // Allocate field object. 784 // Allocate field object.
758 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field)); 785 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field));
759 reader->AddBackRef(object_id, &field, kIsDeserialized); 786 reader->AddBackRef(object_id, &field, kIsDeserialized);
760 787
761 // Set all non object fields. 788 // Set all non object fields.
762 field.set_token_pos(reader->Read<int32_t>()); 789 field.set_token_pos(reader->Read<int32_t>());
763 field.set_guarded_cid(reader->Read<int32_t>()); 790 field.set_guarded_cid(reader->Read<int32_t>());
764 field.set_is_nullable(reader->Read<int32_t>()); 791 field.set_is_nullable(reader->Read<int32_t>());
765 field.set_kind_bits(reader->Read<uint8_t>()); 792 field.set_kind_bits(reader->Read<uint8_t>());
766 793
767 // Set all the object fields. 794 // Set all the object fields.
768 READ_OBJECT_FIELDS(field, 795 READ_OBJECT_FIELDS(field,
769 field.raw()->from(), field.raw()->to(), 796 field.raw()->from(), field.raw()->to(),
770 kAsReference); 797 kAsReference);
771 798
772 field.InitializeGuardedListLengthInObjectOffset(); 799 field.InitializeGuardedListLengthInObjectOffset();
773 800
774 return field.raw(); 801 return field.raw();
775 } 802 }
776 803
777 804
778 void RawField::WriteTo(SnapshotWriter* writer, 805 void RawField::WriteTo(SnapshotWriter* writer,
779 intptr_t object_id, 806 intptr_t object_id,
780 Snapshot::Kind kind) { 807 Snapshot::Kind kind,
808 bool as_reference) {
781 ASSERT(writer != NULL); 809 ASSERT(writer != NULL);
782 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 810 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
783 811
784 // Write out the serialization header value for this object. 812 // Write out the serialization header value for this object.
785 writer->WriteInlinedObjectHeader(object_id); 813 writer->WriteInlinedObjectHeader(object_id);
786 814
787 // Write out the class and tags information. 815 // Write out the class and tags information.
788 writer->WriteVMIsolateObject(kFieldCid); 816 writer->WriteVMIsolateObject(kFieldCid);
789 writer->WriteTags(writer->GetObjectTags(this)); 817 writer->WriteTags(writer->GetObjectTags(this));
790 818
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference); 850 writer->WriteObjectImpl(ptr()->initializer_.saved_value_, kAsReference);
823 } 851 }
824 // Write out the guarded list length. 852 // Write out the guarded list length.
825 writer->WriteObjectImpl(ptr()->guarded_list_length_, kAsReference); 853 writer->WriteObjectImpl(ptr()->guarded_list_length_, kAsReference);
826 } 854 }
827 855
828 856
829 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, 857 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader,
830 intptr_t object_id, 858 intptr_t object_id,
831 intptr_t tags, 859 intptr_t tags,
832 Snapshot::Kind kind) { 860 Snapshot::Kind kind,
861 bool as_reference) {
833 ASSERT(reader != NULL); 862 ASSERT(reader != NULL);
834 ASSERT(kind != Snapshot::kMessage); 863 ASSERT(kind != Snapshot::kMessage);
835 864
836 // Create the literal token object. 865 // Create the literal token object.
837 LiteralToken& literal_token = LiteralToken::ZoneHandle( 866 LiteralToken& literal_token = LiteralToken::ZoneHandle(
838 reader->zone(), NEW_OBJECT(LiteralToken)); 867 reader->zone(), NEW_OBJECT(LiteralToken));
839 reader->AddBackRef(object_id, &literal_token, kIsDeserialized); 868 reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
840 869
841 // Read the token attributes. 870 // Read the token attributes.
842 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); 871 Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>());
843 literal_token.set_kind(token_kind); 872 literal_token.set_kind(token_kind);
844 873
845 // Set all the object fields. 874 // Set all the object fields.
846 READ_OBJECT_FIELDS(literal_token, 875 READ_OBJECT_FIELDS(literal_token,
847 literal_token.raw()->from(), literal_token.raw()->to(), 876 literal_token.raw()->from(), literal_token.raw()->to(),
848 kAsReference); 877 kAsReference);
849 878
850 return literal_token.raw(); 879 return literal_token.raw();
851 } 880 }
852 881
853 882
854 void RawLiteralToken::WriteTo(SnapshotWriter* writer, 883 void RawLiteralToken::WriteTo(SnapshotWriter* writer,
855 intptr_t object_id, 884 intptr_t object_id,
856 Snapshot::Kind kind) { 885 Snapshot::Kind kind,
886 bool as_reference) {
857 ASSERT(writer != NULL); 887 ASSERT(writer != NULL);
858 ASSERT(kind != Snapshot::kMessage); 888 ASSERT(kind != Snapshot::kMessage);
859 889
860 // Write out the serialization header value for this object. 890 // Write out the serialization header value for this object.
861 writer->WriteInlinedObjectHeader(object_id); 891 writer->WriteInlinedObjectHeader(object_id);
862 892
863 // Write out the class and tags information. 893 // Write out the class and tags information.
864 writer->WriteVMIsolateObject(kLiteralTokenCid); 894 writer->WriteVMIsolateObject(kLiteralTokenCid);
865 writer->WriteTags(writer->GetObjectTags(this)); 895 writer->WriteTags(writer->GetObjectTags(this));
866 896
867 // Write out the kind field. 897 // Write out the kind field.
868 writer->Write<int32_t>(ptr()->kind_); 898 writer->Write<int32_t>(ptr()->kind_);
869 899
870 // Write out all the object pointer fields. 900 // Write out all the object pointer fields.
871 SnapshotWriterVisitor visitor(writer, kAsReference); 901 SnapshotWriterVisitor visitor(writer, kAsReference);
872 visitor.VisitPointers(from(), to()); 902 visitor.VisitPointers(from(), to());
873 } 903 }
874 904
875 905
876 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, 906 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader,
877 intptr_t object_id, 907 intptr_t object_id,
878 intptr_t tags, 908 intptr_t tags,
879 Snapshot::Kind kind) { 909 Snapshot::Kind kind,
910 bool as_reference) {
880 ASSERT(reader != NULL); 911 ASSERT(reader != NULL);
881 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 912 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
882 913
883 // Read the length so that we can determine number of tokens to read. 914 // Read the length so that we can determine number of tokens to read.
884 intptr_t len = reader->ReadSmiValue(); 915 intptr_t len = reader->ReadSmiValue();
885 916
886 // Create the token stream object. 917 // Create the token stream object.
887 TokenStream& token_stream = TokenStream::ZoneHandle( 918 TokenStream& token_stream = TokenStream::ZoneHandle(
888 reader->zone(), NEW_OBJECT_WITH_LEN(TokenStream, len)); 919 reader->zone(), NEW_OBJECT_WITH_LEN(TokenStream, len));
889 reader->AddBackRef(object_id, &token_stream, kIsDeserialized); 920 reader->AddBackRef(object_id, &token_stream, kIsDeserialized);
(...skipping 12 matching lines...) Expand all
902 // Read in the private key in use by the token stream. 933 // Read in the private key in use by the token stream.
903 *(reader->StringHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); 934 *(reader->StringHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
904 token_stream.SetPrivateKey(*(reader->StringHandle())); 935 token_stream.SetPrivateKey(*(reader->StringHandle()));
905 936
906 return token_stream.raw(); 937 return token_stream.raw();
907 } 938 }
908 939
909 940
910 void RawTokenStream::WriteTo(SnapshotWriter* writer, 941 void RawTokenStream::WriteTo(SnapshotWriter* writer,
911 intptr_t object_id, 942 intptr_t object_id,
912 Snapshot::Kind kind) { 943 Snapshot::Kind kind,
944 bool as_reference) {
913 ASSERT(writer != NULL); 945 ASSERT(writer != NULL);
914 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 946 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
915 947
916 // Write out the serialization header value for this object. 948 // Write out the serialization header value for this object.
917 writer->WriteInlinedObjectHeader(object_id); 949 writer->WriteInlinedObjectHeader(object_id);
918 950
919 // Write out the class and tags information. 951 // Write out the class and tags information.
920 writer->WriteVMIsolateObject(kTokenStreamCid); 952 writer->WriteVMIsolateObject(kTokenStreamCid);
921 writer->WriteTags(writer->GetObjectTags(this)); 953 writer->WriteTags(writer->GetObjectTags(this));
922 954
923 // Write out the length field and the token stream. 955 // Write out the length field and the token stream.
924 RawExternalTypedData* stream = ptr()->stream_; 956 RawExternalTypedData* stream = ptr()->stream_;
925 intptr_t len = Smi::Value(stream->ptr()->length_); 957 intptr_t len = Smi::Value(stream->ptr()->length_);
926 writer->Write<RawObject*>(stream->ptr()->length_); 958 writer->Write<RawObject*>(stream->ptr()->length_);
927 writer->WriteBytes(stream->ptr()->data_, len); 959 writer->WriteBytes(stream->ptr()->data_, len);
928 960
929 // Write out the literal/identifier token array. 961 // Write out the literal/identifier token array.
930 writer->WriteObjectImpl(ptr()->token_objects_, kAsInlinedObject); 962 writer->WriteObjectImpl(ptr()->token_objects_, kAsInlinedObject);
931 // Write out the private key in use by the token stream. 963 // Write out the private key in use by the token stream.
932 writer->WriteObjectImpl(ptr()->private_key_, kAsInlinedObject); 964 writer->WriteObjectImpl(ptr()->private_key_, kAsInlinedObject);
933 } 965 }
934 966
935 967
936 RawScript* Script::ReadFrom(SnapshotReader* reader, 968 RawScript* Script::ReadFrom(SnapshotReader* reader,
937 intptr_t object_id, 969 intptr_t object_id,
938 intptr_t tags, 970 intptr_t tags,
939 Snapshot::Kind kind) { 971 Snapshot::Kind kind,
972 bool as_reference) {
940 ASSERT(reader != NULL); 973 ASSERT(reader != NULL);
941 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 974 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
942 975
943 // Allocate script object. 976 // Allocate script object.
944 Script& script = Script::ZoneHandle(reader->zone(), NEW_OBJECT(Script)); 977 Script& script = Script::ZoneHandle(reader->zone(), NEW_OBJECT(Script));
945 reader->AddBackRef(object_id, &script, kIsDeserialized); 978 reader->AddBackRef(object_id, &script, kIsDeserialized);
946 979
947 script.StoreNonPointer(&script.raw_ptr()->line_offset_, 980 script.StoreNonPointer(&script.raw_ptr()->line_offset_,
948 reader->Read<int32_t>()); 981 reader->Read<int32_t>());
949 script.StoreNonPointer(&script.raw_ptr()->col_offset_, 982 script.StoreNonPointer(&script.raw_ptr()->col_offset_,
(...skipping 13 matching lines...) Expand all
963 // Script wasn't allocated with nulls? 996 // Script wasn't allocated with nulls?
964 *reader->StringHandle() ^= String::null(); 997 *reader->StringHandle() ^= String::null();
965 script.set_source(*reader->StringHandle()); 998 script.set_source(*reader->StringHandle());
966 999
967 return script.raw(); 1000 return script.raw();
968 } 1001 }
969 1002
970 1003
971 void RawScript::WriteTo(SnapshotWriter* writer, 1004 void RawScript::WriteTo(SnapshotWriter* writer,
972 intptr_t object_id, 1005 intptr_t object_id,
973 Snapshot::Kind kind) { 1006 Snapshot::Kind kind,
1007 bool as_reference) {
974 ASSERT(writer != NULL); 1008 ASSERT(writer != NULL);
975 ASSERT(tokens_ != TokenStream::null()); 1009 ASSERT(tokens_ != TokenStream::null());
976 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1010 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
977 1011
978 // Write out the serialization header value for this object. 1012 // Write out the serialization header value for this object.
979 writer->WriteInlinedObjectHeader(object_id); 1013 writer->WriteInlinedObjectHeader(object_id);
980 1014
981 // Write out the class and tags information. 1015 // Write out the class and tags information.
982 writer->WriteVMIsolateObject(kScriptCid); 1016 writer->WriteVMIsolateObject(kScriptCid);
983 writer->WriteTags(writer->GetObjectTags(this)); 1017 writer->WriteTags(writer->GetObjectTags(this));
984 1018
985 // Write out all the non object fields. 1019 // Write out all the non object fields.
986 writer->Write<int32_t>(ptr()->line_offset_); 1020 writer->Write<int32_t>(ptr()->line_offset_);
987 writer->Write<int32_t>(ptr()->col_offset_); 1021 writer->Write<int32_t>(ptr()->col_offset_);
988 writer->Write<int8_t>(ptr()->kind_); 1022 writer->Write<int8_t>(ptr()->kind_);
989 1023
990 // Write out all the object pointer fields. 1024 // Write out all the object pointer fields.
991 SnapshotWriterVisitor visitor(writer, kAsReference); 1025 SnapshotWriterVisitor visitor(writer, kAsReference);
992 visitor.VisitPointers(from(), to_snapshot()); 1026 visitor.VisitPointers(from(), to_snapshot());
993 } 1027 }
994 1028
995 1029
996 RawLibrary* Library::ReadFrom(SnapshotReader* reader, 1030 RawLibrary* Library::ReadFrom(SnapshotReader* reader,
997 intptr_t object_id, 1031 intptr_t object_id,
998 intptr_t tags, 1032 intptr_t tags,
999 Snapshot::Kind kind) { 1033 Snapshot::Kind kind,
1034 bool as_reference) {
1000 ASSERT(reader != NULL); 1035 ASSERT(reader != NULL);
1001 ASSERT(kind != Snapshot::kMessage); 1036 ASSERT(kind != Snapshot::kMessage);
1002 1037
1003 Library& library = Library::ZoneHandle(reader->zone(), Library::null()); 1038 Library& library = Library::ZoneHandle(reader->zone(), Library::null());
1004 reader->AddBackRef(object_id, &library, kIsDeserialized); 1039 reader->AddBackRef(object_id, &library, kIsDeserialized);
1005 1040
1006 bool is_in_fullsnapshot = reader->Read<bool>(); 1041 bool is_in_fullsnapshot = reader->Read<bool>();
1007 if ((kind == Snapshot::kScript) && is_in_fullsnapshot) { 1042 if ((kind == Snapshot::kScript) && is_in_fullsnapshot) {
1008 // Lookup the object as it should already exist in the heap. 1043 // Lookup the object as it should already exist in the heap.
1009 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); 1044 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 library.InitResolvedNamesCache(kInitialNameCacheSize); 1091 library.InitResolvedNamesCache(kInitialNameCacheSize);
1057 library.Register(); 1092 library.Register();
1058 } 1093 }
1059 } 1094 }
1060 return library.raw(); 1095 return library.raw();
1061 } 1096 }
1062 1097
1063 1098
1064 void RawLibrary::WriteTo(SnapshotWriter* writer, 1099 void RawLibrary::WriteTo(SnapshotWriter* writer,
1065 intptr_t object_id, 1100 intptr_t object_id,
1066 Snapshot::Kind kind) { 1101 Snapshot::Kind kind,
1102 bool as_reference) {
1067 ASSERT(writer != NULL); 1103 ASSERT(writer != NULL);
1068 ASSERT(kind != Snapshot::kMessage); 1104 ASSERT(kind != Snapshot::kMessage);
1069 1105
1070 // Write out the serialization header value for this object. 1106 // Write out the serialization header value for this object.
1071 writer->WriteInlinedObjectHeader(object_id); 1107 writer->WriteInlinedObjectHeader(object_id);
1072 1108
1073 // Write out the class and tags information. 1109 // Write out the class and tags information.
1074 writer->WriteVMIsolateObject(kLibraryCid); 1110 writer->WriteVMIsolateObject(kLibraryCid);
1075 writer->WriteTags(writer->GetObjectTags(this)); 1111 writer->WriteTags(writer->GetObjectTags(this));
1076 1112
(...skipping 25 matching lines...) Expand all
1102 RawObject** toobj = (kind == Snapshot::kFull) ? to() : to_snapshot(); 1138 RawObject** toobj = (kind == Snapshot::kFull) ? to() : to_snapshot();
1103 SnapshotWriterVisitor visitor(writer, kAsReference); 1139 SnapshotWriterVisitor visitor(writer, kAsReference);
1104 visitor.VisitPointers(from(), toobj); 1140 visitor.VisitPointers(from(), toobj);
1105 } 1141 }
1106 } 1142 }
1107 1143
1108 1144
1109 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, 1145 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader,
1110 intptr_t object_id, 1146 intptr_t object_id,
1111 intptr_t tags, 1147 intptr_t tags,
1112 Snapshot::Kind kind) { 1148 Snapshot::Kind kind,
1149 bool as_reference) {
1113 ASSERT(reader != NULL); 1150 ASSERT(reader != NULL);
1114 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1151 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1115 1152
1116 // Allocate library prefix object. 1153 // Allocate library prefix object.
1117 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle( 1154 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(
1118 reader->zone(), NEW_OBJECT(LibraryPrefix)); 1155 reader->zone(), NEW_OBJECT(LibraryPrefix));
1119 reader->AddBackRef(object_id, &prefix, kIsDeserialized); 1156 reader->AddBackRef(object_id, &prefix, kIsDeserialized);
1120 1157
1121 // Set all non object fields. 1158 // Set all non object fields.
1122 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, 1159 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_,
1123 reader->Read<int16_t>()); 1160 reader->Read<int16_t>());
1124 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, 1161 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_,
1125 reader->Read<bool>()); 1162 reader->Read<bool>());
1126 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); 1163 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>());
1127 1164
1128 // Set all the object fields. 1165 // Set all the object fields.
1129 READ_OBJECT_FIELDS(prefix, 1166 READ_OBJECT_FIELDS(prefix,
1130 prefix.raw()->from(), prefix.raw()->to(), 1167 prefix.raw()->from(), prefix.raw()->to(),
1131 kAsReference); 1168 kAsReference);
1132 1169
1133 return prefix.raw(); 1170 return prefix.raw();
1134 } 1171 }
1135 1172
1136 1173
1137 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, 1174 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
1138 intptr_t object_id, 1175 intptr_t object_id,
1139 Snapshot::Kind kind) { 1176 Snapshot::Kind kind,
1177 bool as_reference) {
1140 ASSERT(writer != NULL); 1178 ASSERT(writer != NULL);
1141 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1179 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1142 1180
1143 // Write out the serialization header value for this object. 1181 // Write out the serialization header value for this object.
1144 writer->WriteInlinedObjectHeader(object_id); 1182 writer->WriteInlinedObjectHeader(object_id);
1145 1183
1146 // Write out the class and tags information. 1184 // Write out the class and tags information.
1147 writer->WriteIndexedObject(kLibraryPrefixCid); 1185 writer->WriteIndexedObject(kLibraryPrefixCid);
1148 writer->WriteTags(writer->GetObjectTags(this)); 1186 writer->WriteTags(writer->GetObjectTags(this));
1149 1187
1150 // Write out all non object fields. 1188 // Write out all non object fields.
1151 writer->Write<int16_t>(ptr()->num_imports_); 1189 writer->Write<int16_t>(ptr()->num_imports_);
1152 writer->Write<bool>(ptr()->is_deferred_load_); 1190 writer->Write<bool>(ptr()->is_deferred_load_);
1153 writer->Write<bool>(ptr()->is_loaded_); 1191 writer->Write<bool>(ptr()->is_loaded_);
1154 1192
1155 // Write out all the object pointer fields. 1193 // Write out all the object pointer fields.
1156 SnapshotWriterVisitor visitor(writer, kAsReference); 1194 SnapshotWriterVisitor visitor(writer, kAsReference);
1157 visitor.VisitPointers(from(), to()); 1195 visitor.VisitPointers(from(), to());
1158 } 1196 }
1159 1197
1160 1198
1161 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader, 1199 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader,
1162 intptr_t object_id, 1200 intptr_t object_id,
1163 intptr_t tags, 1201 intptr_t tags,
1164 Snapshot::Kind kind) { 1202 Snapshot::Kind kind,
1203 bool as_reference) {
1165 ASSERT(reader != NULL); 1204 ASSERT(reader != NULL);
1166 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1205 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1167 1206
1168 // Allocate Namespace object. 1207 // Allocate Namespace object.
1169 Namespace& ns = Namespace::ZoneHandle( 1208 Namespace& ns = Namespace::ZoneHandle(
1170 reader->zone(), NEW_OBJECT(Namespace)); 1209 reader->zone(), NEW_OBJECT(Namespace));
1171 reader->AddBackRef(object_id, &ns, kIsDeserialized); 1210 reader->AddBackRef(object_id, &ns, kIsDeserialized);
1172 1211
1173 // Set all the object fields. 1212 // Set all the object fields.
1174 READ_OBJECT_FIELDS(ns, ns.raw()->from(), ns.raw()->to(), kAsReference); 1213 READ_OBJECT_FIELDS(ns, ns.raw()->from(), ns.raw()->to(), kAsReference);
1175 1214
1176 return ns.raw(); 1215 return ns.raw();
1177 } 1216 }
1178 1217
1179 1218
1180 void RawNamespace::WriteTo(SnapshotWriter* writer, 1219 void RawNamespace::WriteTo(SnapshotWriter* writer,
1181 intptr_t object_id, 1220 intptr_t object_id,
1182 Snapshot::Kind kind) { 1221 Snapshot::Kind kind,
1222 bool as_reference) {
1183 ASSERT(writer != NULL); 1223 ASSERT(writer != NULL);
1184 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1224 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1185 1225
1186 // Write out the serialization header value for this object. 1226 // Write out the serialization header value for this object.
1187 writer->WriteInlinedObjectHeader(object_id); 1227 writer->WriteInlinedObjectHeader(object_id);
1188 1228
1189 // Write out the class and tags information. 1229 // Write out the class and tags information.
1190 writer->WriteVMIsolateObject(kNamespaceCid); 1230 writer->WriteVMIsolateObject(kNamespaceCid);
1191 writer->WriteTags(writer->GetObjectTags(this)); 1231 writer->WriteTags(writer->GetObjectTags(this));
1192 1232
1193 // Write out all the object pointer fields. 1233 // Write out all the object pointer fields.
1194 SnapshotWriterVisitor visitor(writer, kAsReference); 1234 SnapshotWriterVisitor visitor(writer, kAsReference);
1195 visitor.VisitPointers(from(), to()); 1235 visitor.VisitPointers(from(), to());
1196 } 1236 }
1197 1237
1198 1238
1199 RawCode* Code::ReadFrom(SnapshotReader* reader, 1239 RawCode* Code::ReadFrom(SnapshotReader* reader,
1200 intptr_t object_id, 1240 intptr_t object_id,
1201 intptr_t tags, 1241 intptr_t tags,
1202 Snapshot::Kind kind) { 1242 Snapshot::Kind kind,
1243 bool as_reference) {
1203 ASSERT(reader->snapshot_code()); 1244 ASSERT(reader->snapshot_code());
1204 ASSERT(kind == Snapshot::kFull); 1245 ASSERT(kind == Snapshot::kFull);
1205 1246
1206 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0)); 1247 Code& result = Code::ZoneHandle(reader->zone(), NEW_OBJECT_WITH_LEN(Code, 0));
1207 reader->AddBackRef(object_id, &result, kIsDeserialized); 1248 reader->AddBackRef(object_id, &result, kIsDeserialized);
1208 1249
1209 result.set_compile_timestamp(reader->Read<int64_t>()); 1250 result.set_compile_timestamp(reader->Read<int64_t>());
1210 result.set_state_bits(reader->Read<int32_t>()); 1251 result.set_state_bits(reader->Read<int32_t>());
1211 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>()); 1252 result.set_lazy_deopt_pc_offset(reader->Read<int32_t>());
1212 1253
1213 // Set all the object fields. 1254 // Set all the object fields.
1214 READ_OBJECT_FIELDS(result, 1255 READ_OBJECT_FIELDS(result,
1215 result.raw()->from(), result.raw()->to(), 1256 result.raw()->from(), result.raw()->to(),
1216 kAsReference); 1257 kAsReference);
1217 1258
1218 // Fix entry point. 1259 // Fix entry point.
1219 uword new_entry = result.EntryPoint(); 1260 uword new_entry = result.EntryPoint();
1220 ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry)); 1261 ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry));
1221 result.StoreNonPointer(&result.raw_ptr()->entry_point_, new_entry); 1262 result.StoreNonPointer(&result.raw_ptr()->entry_point_, new_entry);
1222 1263
1223 return result.raw(); 1264 return result.raw();
1224 } 1265 }
1225 1266
1226 1267
1227 void RawCode::WriteTo(SnapshotWriter* writer, 1268 void RawCode::WriteTo(SnapshotWriter* writer,
1228 intptr_t object_id, 1269 intptr_t object_id,
1229 Snapshot::Kind kind) { 1270 Snapshot::Kind kind,
1271 bool as_reference) {
1230 ASSERT(writer->snapshot_code()); 1272 ASSERT(writer->snapshot_code());
1231 ASSERT(kind == Snapshot::kFull); 1273 ASSERT(kind == Snapshot::kFull);
1232 1274
1233 intptr_t pointer_offsets_length = 1275 intptr_t pointer_offsets_length =
1234 Code::PtrOffBits::decode(ptr()->state_bits_); 1276 Code::PtrOffBits::decode(ptr()->state_bits_);
1235 if (pointer_offsets_length != 0) { 1277 if (pointer_offsets_length != 0) {
1236 // Should only be IA32. 1278 // Should only be IA32.
1237 FATAL("Serializing embedded pointer offsets unimplemented"); 1279 FATAL("Serializing embedded pointer offsets unimplemented");
1238 } 1280 }
1239 1281
(...skipping 13 matching lines...) Expand all
1253 SnapshotWriterVisitor visitor(writer, kAsReference); 1295 SnapshotWriterVisitor visitor(writer, kAsReference);
1254 visitor.VisitPointers(from(), to()); 1296 visitor.VisitPointers(from(), to());
1255 1297
1256 writer->SetInstructionsCode(ptr()->instructions_, this); 1298 writer->SetInstructionsCode(ptr()->instructions_, this);
1257 } 1299 }
1258 1300
1259 1301
1260 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, 1302 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
1261 intptr_t object_id, 1303 intptr_t object_id,
1262 intptr_t tags, 1304 intptr_t tags,
1263 Snapshot::Kind kind) { 1305 Snapshot::Kind kind,
1306 bool as_reference) {
1264 ASSERT(reader->snapshot_code()); 1307 ASSERT(reader->snapshot_code());
1265 ASSERT(kind == Snapshot::kFull); 1308 ASSERT(kind == Snapshot::kFull);
1266 1309
1267 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>()); 1310 intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>());
1268 intptr_t offset = reader->Read<int32_t>(); 1311 intptr_t offset = reader->Read<int32_t>();
1269 Instructions& result = 1312 Instructions& result =
1270 Instructions::ZoneHandle(reader->zone(), 1313 Instructions::ZoneHandle(reader->zone(),
1271 reader->GetInstructionsAt(offset, full_tags)); 1314 reader->GetInstructionsAt(offset, full_tags));
1272 reader->AddBackRef(object_id, &result, kIsDeserialized); 1315 reader->AddBackRef(object_id, &result, kIsDeserialized);
1273 1316
1274 return result.raw(); 1317 return result.raw();
1275 } 1318 }
1276 1319
1277 1320
1278 void RawInstructions::WriteTo(SnapshotWriter* writer, 1321 void RawInstructions::WriteTo(SnapshotWriter* writer,
1279 intptr_t object_id, 1322 intptr_t object_id,
1280 Snapshot::Kind kind) { 1323 Snapshot::Kind kind,
1324 bool as_reference) {
1281 ASSERT(writer->snapshot_code()); 1325 ASSERT(writer->snapshot_code());
1282 ASSERT(kind == Snapshot::kFull); 1326 ASSERT(kind == Snapshot::kFull);
1283 1327
1284 writer->WriteInlinedObjectHeader(object_id); 1328 writer->WriteInlinedObjectHeader(object_id);
1285 writer->WriteVMIsolateObject(kInstructionsCid); 1329 writer->WriteVMIsolateObject(kInstructionsCid);
1286 writer->WriteTags(writer->GetObjectTags(this)); 1330 writer->WriteTags(writer->GetObjectTags(this));
1287 1331
1288 // Instructions will be written pre-marked and in the VM heap. Write out 1332 // Instructions will be written pre-marked and in the VM heap. Write out
1289 // the tags we expect to find when reading the snapshot for a sanity check 1333 // the tags we expect to find when reading the snapshot for a sanity check
1290 // that our offsets/alignment didn't get out of sync. 1334 // that our offsets/alignment didn't get out of sync.
1291 uword written_tags = writer->GetObjectTags(this); 1335 uword written_tags = writer->GetObjectTags(this);
1292 written_tags = RawObject::VMHeapObjectTag::update(true, written_tags); 1336 written_tags = RawObject::VMHeapObjectTag::update(true, written_tags);
1293 written_tags = RawObject::MarkBit::update(true, written_tags); 1337 written_tags = RawObject::MarkBit::update(true, written_tags);
1294 writer->Write<intptr_t>(written_tags); 1338 writer->Write<intptr_t>(written_tags);
1295 1339
1296 writer->Write<int32_t>(writer->GetInstructionsId(this)); 1340 writer->Write<int32_t>(writer->GetInstructionsId(this));
1297 } 1341 }
1298 1342
1299 1343
1300 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader, 1344 RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader,
1301 intptr_t object_id, 1345 intptr_t object_id,
1302 intptr_t tags, 1346 intptr_t tags,
1303 Snapshot::Kind kind) { 1347 Snapshot::Kind kind,
1348 bool as_reference) {
1304 ASSERT(reader->snapshot_code()); 1349 ASSERT(reader->snapshot_code());
1305 ASSERT(kind == Snapshot::kFull); 1350 ASSERT(kind == Snapshot::kFull);
1306 1351
1307 intptr_t length = reader->Read<intptr_t>(); 1352 intptr_t length = reader->Read<intptr_t>();
1308 1353
1309 ObjectPool* result = 1354 ObjectPool* result =
1310 reinterpret_cast<ObjectPool*>(reader->GetBackRef(object_id)); 1355 reinterpret_cast<ObjectPool*>(reader->GetBackRef(object_id));
1311 if (result == NULL) { 1356 if (result == NULL) {
1312 result = 1357 result =
1313 &(ObjectPool::ZoneHandle(reader->zone(), 1358 &(ObjectPool::ZoneHandle(reader->zone(),
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 UNREACHABLE(); 1391 UNREACHABLE();
1347 } 1392 }
1348 } 1393 }
1349 1394
1350 return result->raw(); 1395 return result->raw();
1351 } 1396 }
1352 1397
1353 1398
1354 void RawObjectPool::WriteTo(SnapshotWriter* writer, 1399 void RawObjectPool::WriteTo(SnapshotWriter* writer,
1355 intptr_t object_id, 1400 intptr_t object_id,
1356 Snapshot::Kind kind) { 1401 Snapshot::Kind kind,
1402 bool as_reference) {
1357 ASSERT(writer->snapshot_code()); 1403 ASSERT(writer->snapshot_code());
1358 ASSERT(kind == Snapshot::kFull); 1404 ASSERT(kind == Snapshot::kFull);
1405 intptr_t tags = writer->GetObjectTags(this);
1406 intptr_t length = ptr()->length_;
1359 1407
1360 // Write out the serialization header value for this object. 1408 if (as_reference) {
1361 writer->WriteInlinedObjectHeader(object_id); 1409 // Write out the serialization header value for this object.
1410 writer->WriteInlinedObjectHeader(kOmittedObjectId);
1362 1411
1363 // Write out the class and tags information. 1412 // Write out the class information.
1364 writer->WriteVMIsolateObject(kObjectPoolCid); 1413 writer->WriteVMIsolateObject(kObjectPoolCid);
1365 writer->WriteTags(writer->GetObjectTags(this)); 1414 writer->WriteTags(tags);
1366 1415
1367 intptr_t length = ptr()->length_; 1416 // Write out the length field.
1368 RawTypedData* info_array = ptr()->info_array_->ptr(); 1417 writer->Write<intptr_t>(length);
1369 ASSERT(info_array != TypedData::null()); 1418 } else {
1419 // Write out the serialization header value for this object.
1420 writer->WriteInlinedObjectHeader(object_id);
1370 1421
1371 writer->Write<intptr_t>(length); 1422 // Write out the class and tags information.
1372 for (intptr_t i = 0; i < length; i++) { 1423 writer->WriteVMIsolateObject(kObjectPoolCid);
1373 ObjectPool::EntryType entry_type = 1424 writer->WriteTags(tags);
1374 static_cast<ObjectPool::EntryType>(info_array->data()[i]); 1425
1375 writer->Write<int8_t>(entry_type); 1426 RawTypedData* info_array = ptr()->info_array_->ptr();
1376 Entry& entry = ptr()->data()[i]; 1427 ASSERT(info_array != TypedData::null());
1377 switch (entry_type) { 1428
1378 case ObjectPool::kTaggedObject: { 1429 writer->Write<intptr_t>(length);
1379 if (entry.raw_obj_ == StubCode::CallNativeCFunction_entry()->code()) { 1430 for (intptr_t i = 0; i < length; i++) {
1380 // Natives can run while precompiling, becoming linked and switching 1431 ObjectPool::EntryType entry_type =
1381 // their stub. Reset to the initial stub used for lazy-linking. 1432 static_cast<ObjectPool::EntryType>(info_array->data()[i]);
1382 writer->WriteObjectImpl( 1433 writer->Write<int8_t>(entry_type);
1383 StubCode::CallBootstrapCFunction_entry()->code(), kAsReference); 1434 Entry& entry = ptr()->data()[i];
1384 } else { 1435 switch (entry_type) {
1385 writer->WriteObjectImpl(entry.raw_obj_, kAsReference); 1436 case ObjectPool::kTaggedObject: {
1437 if (entry.raw_obj_ == StubCode::CallNativeCFunction_entry()->code()) {
1438 // Natives can run while precompiling, becoming linked and switching
1439 // their stub. Reset to the initial stub used for lazy-linking.
1440 writer->WriteObjectImpl(
1441 StubCode::CallBootstrapCFunction_entry()->code(), kAsReference);
1442 } else {
1443 writer->WriteObjectImpl(entry.raw_obj_, kAsReference);
1444 }
1445 break;
1386 } 1446 }
1387 break; 1447 case ObjectPool::kImmediate: {
1448 writer->Write<intptr_t>(entry.raw_value_);
1449 break;
1450 }
1451 case ObjectPool::kNativeEntry: {
1452 // Write nothing. Will initialize with the lazy link entry.
1453 break;
1454 }
1455 default:
1456 UNREACHABLE();
1388 } 1457 }
1389 case ObjectPool::kImmediate: {
1390 writer->Write<intptr_t>(entry.raw_value_);
1391 break;
1392 }
1393 case ObjectPool::kNativeEntry: {
1394 // Write nothing. Will initialize with the lazy link entry.
1395 break;
1396 }
1397 default:
1398 UNREACHABLE();
1399 } 1458 }
1400 } 1459 }
1401 } 1460 }
1402 1461
1403 1462
1404 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, 1463 RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader,
1405 intptr_t object_id, 1464 intptr_t object_id,
1406 intptr_t tags, 1465 intptr_t tags,
1407 Snapshot::Kind kind) { 1466 Snapshot::Kind kind,
1467 bool as_reference) {
1408 ASSERT(reader->snapshot_code()); 1468 ASSERT(reader->snapshot_code());
1409 ASSERT(kind == Snapshot::kFull); 1469 ASSERT(kind == Snapshot::kFull);
1410 1470
1411 const int32_t length = reader->Read<int32_t>(); 1471 const int32_t length = reader->Read<int32_t>();
1412 PcDescriptors& result = 1472 PcDescriptors& result =
1413 PcDescriptors::ZoneHandle(reader->zone(), 1473 PcDescriptors::ZoneHandle(reader->zone(),
1414 NEW_OBJECT_WITH_LEN(PcDescriptors, length)); 1474 NEW_OBJECT_WITH_LEN(PcDescriptors, length));
1415 reader->AddBackRef(object_id, &result, kIsDeserialized); 1475 reader->AddBackRef(object_id, &result, kIsDeserialized);
1416 1476
1417 if (result.Length() > 0) { 1477 if (result.Length() > 0) {
1418 NoSafepointScope no_safepoint; 1478 NoSafepointScope no_safepoint;
1419 intptr_t len = result.Length(); 1479 intptr_t len = result.Length();
1420 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); 1480 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1421 reader->ReadBytes(data, len); 1481 reader->ReadBytes(data, len);
1422 } 1482 }
1423 1483
1424 return result.raw(); 1484 return result.raw();
1425 } 1485 }
1426 1486
1427 1487
1428 void RawPcDescriptors::WriteTo(SnapshotWriter* writer, 1488 void RawPcDescriptors::WriteTo(SnapshotWriter* writer,
1429 intptr_t object_id, 1489 intptr_t object_id,
1430 Snapshot::Kind kind) { 1490 Snapshot::Kind kind,
1491 bool as_reference) {
1431 ASSERT(writer->snapshot_code()); 1492 ASSERT(writer->snapshot_code());
1432 ASSERT(kind == Snapshot::kFull); 1493 ASSERT(kind == Snapshot::kFull);
1433 1494
1434 // Write out the serialization header value for this object. 1495 // Write out the serialization header value for this object.
1435 writer->WriteInlinedObjectHeader(object_id); 1496 writer->WriteInlinedObjectHeader(object_id);
1436 writer->WriteIndexedObject(kPcDescriptorsCid); 1497 writer->WriteIndexedObject(kPcDescriptorsCid);
1437 writer->WriteTags(writer->GetObjectTags(this)); 1498 writer->WriteTags(writer->GetObjectTags(this));
1438 writer->Write<int32_t>(ptr()->length_); 1499 writer->Write<int32_t>(ptr()->length_);
1439 if (ptr()->length_ > 0) { 1500 if (ptr()->length_ > 0) {
1440 intptr_t len = ptr()->length_; 1501 intptr_t len = ptr()->length_;
1441 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1502 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1442 writer->WriteBytes(data, len); 1503 writer->WriteBytes(data, len);
1443 } 1504 }
1444 } 1505 }
1445 1506
1446 1507
1447 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, 1508 RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader,
1448 intptr_t object_id, 1509 intptr_t object_id,
1449 intptr_t tags, 1510 intptr_t tags,
1450 Snapshot::Kind kind) { 1511 Snapshot::Kind kind,
1512 bool as_reference) {
1451 ASSERT(reader->snapshot_code()); 1513 ASSERT(reader->snapshot_code());
1452 ASSERT(kind == Snapshot::kFull); 1514 ASSERT(kind == Snapshot::kFull);
1453 1515
1454 const int32_t length = reader->Read<int32_t>(); 1516 const int32_t length = reader->Read<int32_t>();
1455 Stackmap& result = 1517 Stackmap& result =
1456 Stackmap::ZoneHandle(reader->zone(), 1518 Stackmap::ZoneHandle(reader->zone(),
1457 reader->NewStackmap(length)); 1519 reader->NewStackmap(length));
1458 reader->AddBackRef(object_id, &result, kIsDeserialized); 1520 reader->AddBackRef(object_id, &result, kIsDeserialized);
1459 1521
1460 result.SetRegisterBitCount(reader->Read<int32_t>()); 1522 result.SetRegisterBitCount(reader->Read<int32_t>());
1461 result.SetPcOffset(reader->Read<uint32_t>()); 1523 result.SetPcOffset(reader->Read<uint32_t>());
1462 1524
1463 if (length > 0) { 1525 if (length > 0) {
1464 NoSafepointScope no_safepoint; 1526 NoSafepointScope no_safepoint;
1465 intptr_t len = (result.Length() + 7) / 8; 1527 intptr_t len = (result.Length() + 7) / 8;
1466 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); 1528 uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data());
1467 reader->ReadBytes(data, len); 1529 reader->ReadBytes(data, len);
1468 } 1530 }
1469 1531
1470 return result.raw(); 1532 return result.raw();
1471 } 1533 }
1472 1534
1473 1535
1474 void RawStackmap::WriteTo(SnapshotWriter* writer, 1536 void RawStackmap::WriteTo(SnapshotWriter* writer,
1475 intptr_t object_id, 1537 intptr_t object_id,
1476 Snapshot::Kind kind) { 1538 Snapshot::Kind kind,
1539 bool as_reference) {
1477 ASSERT(writer->snapshot_code()); 1540 ASSERT(writer->snapshot_code());
1478 ASSERT(kind == Snapshot::kFull); 1541 ASSERT(kind == Snapshot::kFull);
1479 1542
1480 // Write out the serialization header value for this object. 1543 // Write out the serialization header value for this object.
1481 writer->WriteInlinedObjectHeader(object_id); 1544 writer->WriteInlinedObjectHeader(object_id);
1482 writer->WriteIndexedObject(kStackmapCid); 1545 writer->WriteIndexedObject(kStackmapCid);
1483 writer->WriteTags(writer->GetObjectTags(this)); 1546 writer->WriteTags(writer->GetObjectTags(this));
1484 1547
1485 writer->Write<int32_t>(ptr()->length_); 1548 writer->Write<int32_t>(ptr()->length_);
1486 writer->Write<int32_t>(ptr()->register_bit_count_); 1549 writer->Write<int32_t>(ptr()->register_bit_count_);
1487 writer->Write<uint32_t>(ptr()->pc_offset_); 1550 writer->Write<uint32_t>(ptr()->pc_offset_);
1488 if (ptr()->length_ > 0) { 1551 if (ptr()->length_ > 0) {
1489 intptr_t len = (ptr()->length_ + 7) / 8; 1552 intptr_t len = (ptr()->length_ + 7) / 8;
1490 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1553 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1491 writer->WriteBytes(data, len); 1554 writer->WriteBytes(data, len);
1492 } 1555 }
1493 } 1556 }
1494 1557
1495 1558
1496 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader, 1559 RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader,
1497 intptr_t object_id, 1560 intptr_t object_id,
1498 intptr_t tags, 1561 intptr_t tags,
1499 Snapshot::Kind kind) { 1562 Snapshot::Kind kind,
1563 bool as_reference) {
1500 ASSERT(reader->snapshot_code()); 1564 ASSERT(reader->snapshot_code());
1501 ASSERT(kind == Snapshot::kFull); 1565 ASSERT(kind == Snapshot::kFull);
1502 1566
1503 const int32_t num_entries = reader->Read<int32_t>(); 1567 const int32_t num_entries = reader->Read<int32_t>();
1504 1568
1505 LocalVarDescriptors& result = 1569 LocalVarDescriptors& result =
1506 LocalVarDescriptors::ZoneHandle(reader->zone(), 1570 LocalVarDescriptors::ZoneHandle(reader->zone(),
1507 NEW_OBJECT_WITH_LEN(LocalVarDescriptors, 1571 NEW_OBJECT_WITH_LEN(LocalVarDescriptors,
1508 num_entries)); 1572 num_entries));
1509 reader->AddBackRef(object_id, &result, kIsDeserialized); 1573 reader->AddBackRef(object_id, &result, kIsDeserialized);
(...skipping 11 matching lines...) Expand all
1521 reinterpret_cast<const uint8_t*>(result.raw()->data())); 1585 reinterpret_cast<const uint8_t*>(result.raw()->data()));
1522 reader->ReadBytes(data, len); 1586 reader->ReadBytes(data, len);
1523 } 1587 }
1524 1588
1525 return result.raw(); 1589 return result.raw();
1526 } 1590 }
1527 1591
1528 1592
1529 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer, 1593 void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer,
1530 intptr_t object_id, 1594 intptr_t object_id,
1531 Snapshot::Kind kind) { 1595 Snapshot::Kind kind,
1596 bool as_reference) {
1532 ASSERT(writer->snapshot_code()); 1597 ASSERT(writer->snapshot_code());
1533 ASSERT(kind == Snapshot::kFull); 1598 ASSERT(kind == Snapshot::kFull);
1534 1599
1535 // Write out the serialization header value for this object. 1600 // Write out the serialization header value for this object.
1536 writer->WriteInlinedObjectHeader(object_id); 1601 writer->WriteInlinedObjectHeader(object_id);
1537 writer->WriteIndexedObject(kLocalVarDescriptorsCid); 1602 writer->WriteIndexedObject(kLocalVarDescriptorsCid);
1538 writer->WriteTags(writer->GetObjectTags(this)); 1603 writer->WriteTags(writer->GetObjectTags(this));
1539 writer->Write<int32_t>(ptr()->num_entries_); 1604 writer->Write<int32_t>(ptr()->num_entries_);
1540 for (intptr_t i = 0; i < ptr()->num_entries_; i++) { 1605 for (intptr_t i = 0; i < ptr()->num_entries_; i++) {
1541 writer->WriteObjectImpl(ptr()->names()[i], kAsReference); 1606 writer->WriteObjectImpl(ptr()->names()[i], kAsReference);
1542 } 1607 }
1543 if (ptr()->num_entries_ > 0) { 1608 if (ptr()->num_entries_ > 0) {
1544 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo); 1609 intptr_t len = ptr()->num_entries_ * sizeof(VarInfo);
1545 uint8_t* data = reinterpret_cast<uint8_t*>(this->data()); 1610 uint8_t* data = reinterpret_cast<uint8_t*>(this->data());
1546 writer->WriteBytes(data, len); 1611 writer->WriteBytes(data, len);
1547 } 1612 }
1548 } 1613 }
1549 1614
1550 1615
1551 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader, 1616 RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader,
1552 intptr_t object_id, 1617 intptr_t object_id,
1553 intptr_t tags, 1618 intptr_t tags,
1554 Snapshot::Kind kind) { 1619 Snapshot::Kind kind,
1620 bool as_reference) {
1555 ASSERT(reader->snapshot_code()); 1621 ASSERT(reader->snapshot_code());
1556 ASSERT(kind == Snapshot::kFull); 1622 ASSERT(kind == Snapshot::kFull);
1557 1623
1558 const int32_t num_entries = reader->Read<int32_t>(); 1624 const int32_t num_entries = reader->Read<int32_t>();
1559 ExceptionHandlers& result = 1625 ExceptionHandlers& result =
1560 ExceptionHandlers::ZoneHandle(reader->zone(), 1626 ExceptionHandlers::ZoneHandle(reader->zone(),
1561 NEW_OBJECT_WITH_LEN(ExceptionHandlers, 1627 NEW_OBJECT_WITH_LEN(ExceptionHandlers,
1562 num_entries)); 1628 num_entries));
1563 reader->AddBackRef(object_id, &result, kIsDeserialized); 1629 reader->AddBackRef(object_id, &result, kIsDeserialized);
1564 1630
1565 if (result.num_entries() > 0) { 1631 if (result.num_entries() > 0) {
1566 NoSafepointScope no_safepoint; 1632 NoSafepointScope no_safepoint;
1567 const intptr_t len = 1633 const intptr_t len =
1568 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo); 1634 result.num_entries() * sizeof(RawExceptionHandlers::HandlerInfo);
1569 uint8_t* data = result.UnsafeMutableNonPointer( 1635 uint8_t* data = result.UnsafeMutableNonPointer(
1570 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data())); 1636 reinterpret_cast<const uint8_t*>(result.raw_ptr()->data()));
1571 reader->ReadBytes(data, len); 1637 reader->ReadBytes(data, len);
1572 } 1638 }
1573 1639
1574 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); 1640 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject);
1575 result.StorePointer(&result.raw_ptr()->handled_types_data_, 1641 result.StorePointer(&result.raw_ptr()->handled_types_data_,
1576 reader->ArrayHandle()->raw()); 1642 reader->ArrayHandle()->raw());
1577 1643
1578 return result.raw(); 1644 return result.raw();
1579 } 1645 }
1580 1646
1581 1647
1582 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer, 1648 void RawExceptionHandlers::WriteTo(SnapshotWriter* writer,
1583 intptr_t object_id, 1649 intptr_t object_id,
1584 Snapshot::Kind kind) { 1650 Snapshot::Kind kind,
1651 bool as_reference) {
1585 ASSERT(writer->snapshot_code()); 1652 ASSERT(writer->snapshot_code());
1586 ASSERT(kind == Snapshot::kFull); 1653 ASSERT(kind == Snapshot::kFull);
1587 1654
1588 // Write out the serialization header value for this object. 1655 // Write out the serialization header value for this object.
1589 writer->WriteInlinedObjectHeader(object_id); 1656 writer->WriteInlinedObjectHeader(object_id);
1590 writer->WriteIndexedObject(kExceptionHandlersCid); 1657 writer->WriteIndexedObject(kExceptionHandlersCid);
1591 writer->WriteTags(writer->GetObjectTags(this)); 1658 writer->WriteTags(writer->GetObjectTags(this));
1592 writer->Write<int32_t>(ptr()->num_entries_); 1659 writer->Write<int32_t>(ptr()->num_entries_);
1593 1660
1594 if (ptr()->num_entries_ > 0) { 1661 if (ptr()->num_entries_ > 0) {
1595 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo); 1662 intptr_t len = ptr()->num_entries_ * sizeof(HandlerInfo);
1596 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); 1663 uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
1597 writer->WriteBytes(data, len); 1664 writer->WriteBytes(data, len);
1598 } 1665 }
1599 1666
1600 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject); 1667 writer->WriteObjectImpl(ptr()->handled_types_data_, kAsInlinedObject);
1601 } 1668 }
1602 1669
1603 1670
1604 RawContext* Context::ReadFrom(SnapshotReader* reader, 1671 RawContext* Context::ReadFrom(SnapshotReader* reader,
1605 intptr_t object_id, 1672 intptr_t object_id,
1606 intptr_t tags, 1673 intptr_t tags,
1607 Snapshot::Kind kind) { 1674 Snapshot::Kind kind,
1675 bool as_reference) {
1608 ASSERT(reader != NULL); 1676 ASSERT(reader != NULL);
1609 1677
1610 // Allocate context object. 1678 // Allocate context object.
1611 int32_t num_vars = reader->Read<int32_t>(); 1679 int32_t num_vars = reader->Read<int32_t>();
1612 Context& context = Context::ZoneHandle(reader->zone()); 1680 Context& context = Context::ZoneHandle(reader->zone());
1613 reader->AddBackRef(object_id, &context, kIsDeserialized); 1681 reader->AddBackRef(object_id, &context, kIsDeserialized);
1614 if (num_vars == 0) { 1682 if (num_vars == 0) {
1615 context ^= reader->object_store()->empty_context(); 1683 context ^= reader->object_store()->empty_context();
1616 } else { 1684 } else {
1617 context ^= NEW_OBJECT_WITH_LEN(Context, num_vars); 1685 context ^= NEW_OBJECT_WITH_LEN(Context, num_vars);
1618 1686
1619 // Set all the object fields. 1687 // Set all the object fields.
1620 // TODO(5411462): Need to assert No GC can happen here, even though 1688 // TODO(5411462): Need to assert No GC can happen here, even though
1621 // allocations may happen. 1689 // allocations may happen.
1622 intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from()); 1690 intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from());
1623 for (intptr_t i = 0; i <= num_flds; i++) { 1691 for (intptr_t i = 0; i <= num_flds; i++) {
1624 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference); 1692 (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl(kAsReference);
1625 context.StorePointer((context.raw()->from() + i), 1693 context.StorePointer((context.raw()->from() + i),
1626 reader->PassiveObjectHandle()->raw()); 1694 reader->PassiveObjectHandle()->raw());
1627 } 1695 }
1628 } 1696 }
1629 return context.raw(); 1697 return context.raw();
1630 } 1698 }
1631 1699
1632 1700
1633 void RawContext::WriteTo(SnapshotWriter* writer, 1701 void RawContext::WriteTo(SnapshotWriter* writer,
1634 intptr_t object_id, 1702 intptr_t object_id,
1635 Snapshot::Kind kind) { 1703 Snapshot::Kind kind,
1704 bool as_reference) {
1636 ASSERT(writer != NULL); 1705 ASSERT(writer != NULL);
1637 1706
1638 // Write out the serialization header value for this object. 1707 // Write out the serialization header value for this object.
1639 writer->WriteInlinedObjectHeader(object_id); 1708 writer->WriteInlinedObjectHeader(object_id);
1640 1709
1641 // Write out the class and tags information. 1710 // Write out the class and tags information.
1642 writer->WriteVMIsolateObject(kContextCid); 1711 writer->WriteVMIsolateObject(kContextCid);
1643 writer->WriteTags(writer->GetObjectTags(this)); 1712 writer->WriteTags(writer->GetObjectTags(this));
1644 1713
1645 // Write out num of variables in the context. 1714 // Write out num of variables in the context.
1646 int32_t num_variables = ptr()->num_variables_; 1715 int32_t num_variables = ptr()->num_variables_;
1647 writer->Write<int32_t>(num_variables); 1716 writer->Write<int32_t>(num_variables);
1648 if (num_variables != 0) { 1717 if (num_variables != 0) {
1649 // Write out all the object pointer fields. 1718 // Write out all the object pointer fields.
1650 SnapshotWriterVisitor visitor(writer, kAsReference); 1719 SnapshotWriterVisitor visitor(writer, kAsReference);
1651 visitor.VisitPointers(from(), to(num_variables)); 1720 visitor.VisitPointers(from(), to(num_variables));
1652 } 1721 }
1653 } 1722 }
1654 1723
1655 1724
1656 RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader, 1725 RawContextScope* ContextScope::ReadFrom(SnapshotReader* reader,
1657 intptr_t object_id, 1726 intptr_t object_id,
1658 intptr_t tags, 1727 intptr_t tags,
1659 Snapshot::Kind kind) { 1728 Snapshot::Kind kind,
1729 bool as_reference) {
1660 ASSERT(reader != NULL); 1730 ASSERT(reader != NULL);
1661 1731
1662 // Allocate context object. 1732 // Allocate context object.
1663 bool is_implicit = reader->Read<bool>(); 1733 bool is_implicit = reader->Read<bool>();
1664 if (is_implicit) { 1734 if (is_implicit) {
1665 ContextScope& context_scope = ContextScope::ZoneHandle(); 1735 ContextScope& context_scope = ContextScope::ZoneHandle();
1666 if (kind == Snapshot::kFull) { 1736 if (kind == Snapshot::kFull) {
1667 context_scope = reader->NewContextScope(1); 1737 context_scope = reader->NewContextScope(1);
1668 context_scope.set_is_implicit(true); 1738 context_scope.set_is_implicit(true);
1669 } else { 1739 } else {
(...skipping 13 matching lines...) Expand all
1683 context_scope.SetContextLevelAt(0, 0); 1753 context_scope.SetContextLevelAt(0, 0);
1684 return context_scope.raw(); 1754 return context_scope.raw();
1685 } 1755 }
1686 UNREACHABLE(); 1756 UNREACHABLE();
1687 return NULL; 1757 return NULL;
1688 } 1758 }
1689 1759
1690 1760
1691 void RawContextScope::WriteTo(SnapshotWriter* writer, 1761 void RawContextScope::WriteTo(SnapshotWriter* writer,
1692 intptr_t object_id, 1762 intptr_t object_id,
1693 Snapshot::Kind kind) { 1763 Snapshot::Kind kind,
1764 bool as_reference) {
1694 ASSERT(writer != NULL); 1765 ASSERT(writer != NULL);
1695 1766
1696 if (ptr()->is_implicit_) { 1767 if (ptr()->is_implicit_) {
1697 ASSERT(ptr()->num_variables_ == 1); 1768 ASSERT(ptr()->num_variables_ == 1);
1698 const VariableDesc* var = ptr()->VariableDescAddr(0); 1769 const VariableDesc* var = ptr()->VariableDescAddr(0);
1699 1770
1700 // Write out the serialization header value for this object. 1771 // Write out the serialization header value for this object.
1701 writer->WriteInlinedObjectHeader(object_id); 1772 writer->WriteInlinedObjectHeader(object_id);
1702 1773
1703 // Write out the class and tags information. 1774 // Write out the class and tags information.
1704 writer->WriteVMIsolateObject(kContextScopeCid); 1775 writer->WriteVMIsolateObject(kContextScopeCid);
1705 writer->WriteTags(writer->GetObjectTags(this)); 1776 writer->WriteTags(writer->GetObjectTags(this));
1706 1777
1707 // Write out is_implicit flag for the context scope. 1778 // Write out is_implicit flag for the context scope.
1708 writer->Write<bool>(true); 1779 writer->Write<bool>(true);
1709 1780
1710 // Write out the type of 'this' the variable. 1781 // Write out the type of 'this' the variable.
1711 writer->WriteObjectImpl(var->type, kAsInlinedObject); 1782 writer->WriteObjectImpl(var->type, kAsInlinedObject);
1712 1783
1713 return; 1784 return;
1714 } 1785 }
1715 UNREACHABLE(); 1786 UNREACHABLE();
1716 } 1787 }
1717 1788
1718 1789
1719 RawICData* ICData::ReadFrom(SnapshotReader* reader, 1790 RawICData* ICData::ReadFrom(SnapshotReader* reader,
1720 intptr_t object_id, 1791 intptr_t object_id,
1721 intptr_t tags, 1792 intptr_t tags,
1722 Snapshot::Kind kind) { 1793 Snapshot::Kind kind,
1794 bool as_reference) {
1723 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1795 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1724 1796
1725 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData)); 1797 ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData));
1726 reader->AddBackRef(object_id, &result, kIsDeserialized); 1798 reader->AddBackRef(object_id, &result, kIsDeserialized);
1727 1799
1728 result.set_deopt_id(reader->Read<int32_t>()); 1800 result.set_deopt_id(reader->Read<int32_t>());
1729 result.set_state_bits(reader->Read<uint32_t>()); 1801 result.set_state_bits(reader->Read<uint32_t>());
1730 1802
1731 // Set all the object fields. 1803 // Set all the object fields.
1732 READ_OBJECT_FIELDS(result, 1804 READ_OBJECT_FIELDS(result,
1733 result.raw()->from(), result.raw()->to(), 1805 result.raw()->from(), result.raw()->to(),
1734 kAsReference); 1806 kAsReference);
1735 1807
1736 return result.raw(); 1808 return result.raw();
1737 } 1809 }
1738 1810
1739 1811
1740 void RawICData::WriteTo(SnapshotWriter* writer, 1812 void RawICData::WriteTo(SnapshotWriter* writer,
1741 intptr_t object_id, 1813 intptr_t object_id,
1742 Snapshot::Kind kind) { 1814 Snapshot::Kind kind,
1815 bool as_reference) {
1743 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); 1816 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
1744 1817
1745 // Write out the serialization header value for this object. 1818 // Write out the serialization header value for this object.
1746 writer->WriteInlinedObjectHeader(object_id); 1819 writer->WriteInlinedObjectHeader(object_id);
1747 1820
1748 // Write out the class and tags information. 1821 // Write out the class and tags information.
1749 writer->WriteVMIsolateObject(kICDataCid); 1822 writer->WriteVMIsolateObject(kICDataCid);
1750 writer->WriteTags(writer->GetObjectTags(this)); 1823 writer->WriteTags(writer->GetObjectTags(this));
1751 1824
1752 // Write out all the non object fields. 1825 // Write out all the non object fields.
1753 writer->Write<int32_t>(ptr()->deopt_id_); 1826 writer->Write<int32_t>(ptr()->deopt_id_);
1754 writer->Write<uint32_t>(ptr()->state_bits_); 1827 writer->Write<uint32_t>(ptr()->state_bits_);
1755 1828
1756 // Write out all the object pointer fields. 1829 // Write out all the object pointer fields.
1757 SnapshotWriterVisitor visitor(writer, kAsReference); 1830 SnapshotWriterVisitor visitor(writer, kAsReference);
1758 visitor.VisitPointers(from(), to()); 1831 visitor.VisitPointers(from(), to());
1759 } 1832 }
1760 1833
1761 1834
1762 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader, 1835 RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader,
1763 intptr_t object_id, 1836 intptr_t object_id,
1764 intptr_t tags, 1837 intptr_t tags,
1765 Snapshot::Kind kind) { 1838 Snapshot::Kind kind,
1839 bool as_reference) {
1766 ASSERT(reader->snapshot_code()); 1840 ASSERT(reader->snapshot_code());
1767 ASSERT(kind == Snapshot::kFull); 1841 ASSERT(kind == Snapshot::kFull);
1768 1842
1769 MegamorphicCache& result = 1843 MegamorphicCache& result =
1770 MegamorphicCache::ZoneHandle(reader->zone(), 1844 MegamorphicCache::ZoneHandle(reader->zone(),
1771 NEW_OBJECT(MegamorphicCache)); 1845 NEW_OBJECT(MegamorphicCache));
1772 reader->AddBackRef(object_id, &result, kIsDeserialized); 1846 reader->AddBackRef(object_id, &result, kIsDeserialized);
1773 1847
1774 result.set_filled_entry_count(reader->Read<int32_t>()); 1848 result.set_filled_entry_count(reader->Read<int32_t>());
1775 1849
1776 // Set all the object fields. 1850 // Set all the object fields.
1777 READ_OBJECT_FIELDS(result, 1851 READ_OBJECT_FIELDS(result,
1778 result.raw()->from(), result.raw()->to(), 1852 result.raw()->from(), result.raw()->to(),
1779 kAsReference); 1853 kAsReference);
1780 1854
1781 return result.raw(); 1855 return result.raw();
1782 } 1856 }
1783 1857
1784 1858
1785 void RawMegamorphicCache::WriteTo(SnapshotWriter* writer, 1859 void RawMegamorphicCache::WriteTo(SnapshotWriter* writer,
1786 intptr_t object_id, 1860 intptr_t object_id,
1787 Snapshot::Kind kind) { 1861 Snapshot::Kind kind,
1862 bool as_reference) {
1788 ASSERT(writer->snapshot_code()); 1863 ASSERT(writer->snapshot_code());
1789 ASSERT(kind == Snapshot::kFull); 1864 ASSERT(kind == Snapshot::kFull);
1790 1865
1791 // Write out the serialization header value for this object. 1866 // Write out the serialization header value for this object.
1792 writer->WriteInlinedObjectHeader(object_id); 1867 writer->WriteInlinedObjectHeader(object_id);
1793 1868
1794 // Write out the class and tags information. 1869 // Write out the class and tags information.
1795 writer->WriteVMIsolateObject(kMegamorphicCacheCid); 1870 writer->WriteVMIsolateObject(kMegamorphicCacheCid);
1796 writer->WriteTags(writer->GetObjectTags(this)); 1871 writer->WriteTags(writer->GetObjectTags(this));
1797 1872
1798 // Write out all the non object fields. 1873 // Write out all the non object fields.
1799 writer->Write<int32_t>(ptr()->filled_entry_count_); 1874 writer->Write<int32_t>(ptr()->filled_entry_count_);
1800 1875
1801 // Write out all the object pointer fields. 1876 // Write out all the object pointer fields.
1802 SnapshotWriterVisitor visitor(writer, kAsReference); 1877 SnapshotWriterVisitor visitor(writer, kAsReference);
1803 visitor.VisitPointers(from(), to()); 1878 visitor.VisitPointers(from(), to());
1804 } 1879 }
1805 1880
1806 1881
1807 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader, 1882 RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader,
1808 intptr_t object_id, 1883 intptr_t object_id,
1809 intptr_t tags, 1884 intptr_t tags,
1810 Snapshot::Kind kind) { 1885 Snapshot::Kind kind,
1886 bool as_reference) {
1811 ASSERT(reader->snapshot_code()); 1887 ASSERT(reader->snapshot_code());
1812 ASSERT(kind == Snapshot::kFull); 1888 ASSERT(kind == Snapshot::kFull);
1813 1889
1814 SubtypeTestCache& result = 1890 SubtypeTestCache& result =
1815 SubtypeTestCache::ZoneHandle(reader->zone(), 1891 SubtypeTestCache::ZoneHandle(reader->zone(),
1816 NEW_OBJECT(SubtypeTestCache)); 1892 NEW_OBJECT(SubtypeTestCache));
1817 reader->AddBackRef(object_id, &result, kIsDeserialized); 1893 reader->AddBackRef(object_id, &result, kIsDeserialized);
1818 1894
1819 // Set all the object fields. 1895 // Set all the object fields.
1820 // TODO(5411462): Need to assert No GC can happen here, even though 1896 // TODO(5411462): Need to assert No GC can happen here, even though
1821 // allocations may happen. 1897 // allocations may happen.
1822 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference); 1898 (*reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference);
1823 result.StorePointer(&result.raw_ptr()->cache_, 1899 result.StorePointer(&result.raw_ptr()->cache_,
1824 reader->ArrayHandle()->raw()); 1900 reader->ArrayHandle()->raw());
1825 1901
1826 return result.raw(); 1902 return result.raw();
1827 } 1903 }
1828 1904
1829 1905
1830 void RawSubtypeTestCache::WriteTo(SnapshotWriter* writer, 1906 void RawSubtypeTestCache::WriteTo(SnapshotWriter* writer,
1831 intptr_t object_id, 1907 intptr_t object_id,
1832 Snapshot::Kind kind) { 1908 Snapshot::Kind kind,
1909 bool as_reference) {
1833 ASSERT(writer->snapshot_code()); 1910 ASSERT(writer->snapshot_code());
1834 ASSERT(kind == Snapshot::kFull); 1911 ASSERT(kind == Snapshot::kFull);
1835 1912
1836 // Write out the serialization header value for this object. 1913 // Write out the serialization header value for this object.
1837 writer->WriteInlinedObjectHeader(object_id); 1914 writer->WriteInlinedObjectHeader(object_id);
1838 1915
1839 // Write out the class and tags information. 1916 // Write out the class and tags information.
1840 writer->WriteVMIsolateObject(kSubtypeTestCacheCid); 1917 writer->WriteVMIsolateObject(kSubtypeTestCacheCid);
1841 writer->WriteTags(writer->GetObjectTags(this)); 1918 writer->WriteTags(writer->GetObjectTags(this));
1842 1919
1843 // Write out all the object pointer fields. 1920 // Write out all the object pointer fields.
1844 writer->WriteObjectImpl(ptr()->cache_, kAsReference); 1921 writer->WriteObjectImpl(ptr()->cache_, kAsReference);
1845 } 1922 }
1846 1923
1847 1924
1848 RawError* Error::ReadFrom(SnapshotReader* reader, 1925 RawError* Error::ReadFrom(SnapshotReader* reader,
1849 intptr_t object_id, 1926 intptr_t object_id,
1850 intptr_t tags, 1927 intptr_t tags,
1851 Snapshot::Kind kind) { 1928 Snapshot::Kind kind,
1929 bool as_referenec) {
1852 UNREACHABLE(); 1930 UNREACHABLE();
1853 return Error::null(); // Error is an abstract class. 1931 return Error::null(); // Error is an abstract class.
1854 } 1932 }
1855 1933
1856 1934
1857 void RawError::WriteTo(SnapshotWriter* writer, 1935 void RawError::WriteTo(SnapshotWriter* writer,
1858 intptr_t object_id, 1936 intptr_t object_id,
1859 Snapshot::Kind kind) { 1937 Snapshot::Kind kind,
1938 bool as_reference) {
1860 UNREACHABLE(); // Error is an abstract class. 1939 UNREACHABLE(); // Error is an abstract class.
1861 } 1940 }
1862 1941
1863 1942
1864 RawApiError* ApiError::ReadFrom(SnapshotReader* reader, 1943 RawApiError* ApiError::ReadFrom(SnapshotReader* reader,
1865 intptr_t object_id, 1944 intptr_t object_id,
1866 intptr_t tags, 1945 intptr_t tags,
1867 Snapshot::Kind kind) { 1946 Snapshot::Kind kind,
1947 bool as_reference) {
1868 ASSERT(reader != NULL); 1948 ASSERT(reader != NULL);
1869 1949
1870 // Allocate ApiError object. 1950 // Allocate ApiError object.
1871 ApiError& api_error = 1951 ApiError& api_error =
1872 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError)); 1952 ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError));
1873 reader->AddBackRef(object_id, &api_error, kIsDeserialized); 1953 reader->AddBackRef(object_id, &api_error, kIsDeserialized);
1874 1954
1875 // Set all the object fields. 1955 // Set all the object fields.
1876 READ_OBJECT_FIELDS(api_error, 1956 READ_OBJECT_FIELDS(api_error,
1877 api_error.raw()->from(), api_error.raw()->to(), 1957 api_error.raw()->from(), api_error.raw()->to(),
1878 kAsReference); 1958 kAsReference);
1879 1959
1880 return api_error.raw(); 1960 return api_error.raw();
1881 } 1961 }
1882 1962
1883 1963
1884 void RawApiError::WriteTo(SnapshotWriter* writer, 1964 void RawApiError::WriteTo(SnapshotWriter* writer,
1885 intptr_t object_id, 1965 intptr_t object_id,
1886 Snapshot::Kind kind) { 1966 Snapshot::Kind kind,
1967 bool as_reference) {
1887 ASSERT(writer != NULL); 1968 ASSERT(writer != NULL);
1888 1969
1889 // Write out the serialization header value for this object. 1970 // Write out the serialization header value for this object.
1890 writer->WriteInlinedObjectHeader(object_id); 1971 writer->WriteInlinedObjectHeader(object_id);
1891 1972
1892 // Write out the class and tags information. 1973 // Write out the class and tags information.
1893 writer->WriteVMIsolateObject(kApiErrorCid); 1974 writer->WriteVMIsolateObject(kApiErrorCid);
1894 writer->WriteTags(writer->GetObjectTags(this)); 1975 writer->WriteTags(writer->GetObjectTags(this));
1895 1976
1896 // Write out all the object pointer fields. 1977 // Write out all the object pointer fields.
1897 SnapshotWriterVisitor visitor(writer, kAsReference); 1978 SnapshotWriterVisitor visitor(writer, kAsReference);
1898 visitor.VisitPointers(from(), to()); 1979 visitor.VisitPointers(from(), to());
1899 } 1980 }
1900 1981
1901 1982
1902 RawLanguageError* LanguageError::ReadFrom(SnapshotReader* reader, 1983 RawLanguageError* LanguageError::ReadFrom(SnapshotReader* reader,
1903 intptr_t object_id, 1984 intptr_t object_id,
1904 intptr_t tags, 1985 intptr_t tags,
1905 Snapshot::Kind kind) { 1986 Snapshot::Kind kind,
1987 bool as_reference) {
1906 ASSERT(reader != NULL); 1988 ASSERT(reader != NULL);
1907 1989
1908 // Allocate LanguageError object. 1990 // Allocate LanguageError object.
1909 LanguageError& language_error = 1991 LanguageError& language_error =
1910 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError)); 1992 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError));
1911 reader->AddBackRef(object_id, &language_error, kIsDeserialized); 1993 reader->AddBackRef(object_id, &language_error, kIsDeserialized);
1912 1994
1913 // Set all non object fields. 1995 // Set all non object fields.
1914 language_error.set_token_pos(reader->Read<int32_t>()); 1996 language_error.set_token_pos(reader->Read<int32_t>());
1915 language_error.set_kind(reader->Read<uint8_t>()); 1997 language_error.set_kind(reader->Read<uint8_t>());
1916 1998
1917 // Set all the object fields. 1999 // Set all the object fields.
1918 READ_OBJECT_FIELDS(language_error, 2000 READ_OBJECT_FIELDS(language_error,
1919 language_error.raw()->from(), language_error.raw()->to(), 2001 language_error.raw()->from(), language_error.raw()->to(),
1920 kAsReference); 2002 kAsReference);
1921 2003
1922 return language_error.raw(); 2004 return language_error.raw();
1923 } 2005 }
1924 2006
1925 2007
1926 void RawLanguageError::WriteTo(SnapshotWriter* writer, 2008 void RawLanguageError::WriteTo(SnapshotWriter* writer,
1927 intptr_t object_id, 2009 intptr_t object_id,
1928 Snapshot::Kind kind) { 2010 Snapshot::Kind kind,
2011 bool as_reference) {
1929 ASSERT(writer != NULL); 2012 ASSERT(writer != NULL);
1930 2013
1931 // Write out the serialization header value for this object. 2014 // Write out the serialization header value for this object.
1932 writer->WriteInlinedObjectHeader(object_id); 2015 writer->WriteInlinedObjectHeader(object_id);
1933 2016
1934 // Write out the class and tags information. 2017 // Write out the class and tags information.
1935 writer->WriteVMIsolateObject(kLanguageErrorCid); 2018 writer->WriteVMIsolateObject(kLanguageErrorCid);
1936 writer->WriteTags(writer->GetObjectTags(this)); 2019 writer->WriteTags(writer->GetObjectTags(this));
1937 2020
1938 // Write out all the non object fields. 2021 // Write out all the non object fields.
1939 writer->Write<int32_t>(ptr()->token_pos_); 2022 writer->Write<int32_t>(ptr()->token_pos_);
1940 writer->Write<uint8_t>(ptr()->kind_); 2023 writer->Write<uint8_t>(ptr()->kind_);
1941 2024
1942 // Write out all the object pointer fields. 2025 // Write out all the object pointer fields.
1943 SnapshotWriterVisitor visitor(writer, kAsReference); 2026 SnapshotWriterVisitor visitor(writer, kAsReference);
1944 visitor.VisitPointers(from(), to()); 2027 visitor.VisitPointers(from(), to());
1945 } 2028 }
1946 2029
1947 2030
1948 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, 2031 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader,
1949 intptr_t object_id, 2032 intptr_t object_id,
1950 intptr_t tags, 2033 intptr_t tags,
1951 Snapshot::Kind kind) { 2034 Snapshot::Kind kind,
2035 bool as_reference) {
1952 UnhandledException& result = UnhandledException::ZoneHandle( 2036 UnhandledException& result = UnhandledException::ZoneHandle(
1953 reader->zone(), NEW_OBJECT(UnhandledException)); 2037 reader->zone(), NEW_OBJECT(UnhandledException));
1954 reader->AddBackRef(object_id, &result, kIsDeserialized); 2038 reader->AddBackRef(object_id, &result, kIsDeserialized);
1955 2039
1956 // Set all the object fields. 2040 // Set all the object fields.
1957 READ_OBJECT_FIELDS(result, 2041 READ_OBJECT_FIELDS(result,
1958 result.raw()->from(), result.raw()->to(), 2042 result.raw()->from(), result.raw()->to(),
1959 kAsReference); 2043 kAsReference);
1960 2044
1961 return result.raw(); 2045 return result.raw();
1962 } 2046 }
1963 2047
1964 2048
1965 void RawUnhandledException::WriteTo(SnapshotWriter* writer, 2049 void RawUnhandledException::WriteTo(SnapshotWriter* writer,
1966 intptr_t object_id, 2050 intptr_t object_id,
1967 Snapshot::Kind kind) { 2051 Snapshot::Kind kind,
2052 bool as_reference) {
1968 // Write out the serialization header value for this object. 2053 // Write out the serialization header value for this object.
1969 writer->WriteInlinedObjectHeader(object_id); 2054 writer->WriteInlinedObjectHeader(object_id);
1970 2055
1971 // Write out the class and tags information. 2056 // Write out the class and tags information.
1972 writer->WriteVMIsolateObject(kUnhandledExceptionCid); 2057 writer->WriteVMIsolateObject(kUnhandledExceptionCid);
1973 writer->WriteTags(writer->GetObjectTags(this)); 2058 writer->WriteTags(writer->GetObjectTags(this));
1974 // Write out all the object pointer fields. 2059 // Write out all the object pointer fields.
1975 SnapshotWriterVisitor visitor(writer, kAsReference); 2060 SnapshotWriterVisitor visitor(writer, kAsReference);
1976 visitor.VisitPointers(from(), to()); 2061 visitor.VisitPointers(from(), to());
1977 } 2062 }
1978 2063
1979 2064
1980 RawUnwindError* UnwindError::ReadFrom(SnapshotReader* reader, 2065 RawUnwindError* UnwindError::ReadFrom(SnapshotReader* reader,
1981 intptr_t object_id, 2066 intptr_t object_id,
1982 intptr_t tags, 2067 intptr_t tags,
1983 Snapshot::Kind kind) { 2068 Snapshot::Kind kind,
2069 bool as_reference) {
1984 UNREACHABLE(); 2070 UNREACHABLE();
1985 return UnwindError::null(); 2071 return UnwindError::null();
1986 } 2072 }
1987 2073
1988 2074
1989 void RawUnwindError::WriteTo(SnapshotWriter* writer, 2075 void RawUnwindError::WriteTo(SnapshotWriter* writer,
1990 intptr_t object_id, 2076 intptr_t object_id,
1991 Snapshot::Kind kind) { 2077 Snapshot::Kind kind,
2078 bool as_reference) {
1992 UNREACHABLE(); 2079 UNREACHABLE();
1993 } 2080 }
1994 2081
1995 2082
1996 RawInstance* Instance::ReadFrom(SnapshotReader* reader, 2083 RawInstance* Instance::ReadFrom(SnapshotReader* reader,
1997 intptr_t object_id, 2084 intptr_t object_id,
1998 intptr_t tags, 2085 intptr_t tags,
1999 Snapshot::Kind kind) { 2086 Snapshot::Kind kind,
2087 bool as_reference) {
2000 ASSERT(reader != NULL); 2088 ASSERT(reader != NULL);
2001 2089
2002 // Create an Instance object or get canonical one if it is a canonical 2090 // Create an Instance object or get canonical one if it is a canonical
2003 // constant. 2091 // constant.
2004 Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null()); 2092 Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
2005 if (kind == Snapshot::kFull) { 2093 if (kind == Snapshot::kFull) {
2006 obj = reader->NewInstance(); 2094 obj = reader->NewInstance();
2007 // Set the canonical bit. 2095 // Set the canonical bit.
2008 if (RawObject::IsCanonical(tags)) { 2096 if (RawObject::IsCanonical(tags)) {
2009 obj.SetCanonical(); 2097 obj.SetCanonical();
2010 } 2098 }
2011 } else { 2099 } else {
2012 obj ^= Object::Allocate(kInstanceCid, 2100 obj ^= Object::Allocate(kInstanceCid,
2013 Instance::InstanceSize(), 2101 Instance::InstanceSize(),
2014 HEAP_SPACE(kind)); 2102 HEAP_SPACE(kind));
2015 if (RawObject::IsCanonical(tags)) { 2103 if (RawObject::IsCanonical(tags)) {
2016 obj = obj.CheckAndCanonicalize(NULL); 2104 obj = obj.CheckAndCanonicalize(NULL);
2017 } 2105 }
2018 } 2106 }
2019 reader->AddBackRef(object_id, &obj, kIsDeserialized); 2107 reader->AddBackRef(object_id, &obj, kIsDeserialized);
2020 2108
2021 return obj.raw(); 2109 return obj.raw();
2022 } 2110 }
2023 2111
2024 2112
2025 void RawInstance::WriteTo(SnapshotWriter* writer, 2113 void RawInstance::WriteTo(SnapshotWriter* writer,
2026 intptr_t object_id, 2114 intptr_t object_id,
2027 Snapshot::Kind kind) { 2115 Snapshot::Kind kind,
2116 bool as_reference) {
2028 ASSERT(writer != NULL); 2117 ASSERT(writer != NULL);
2029 2118
2030 // Write out the serialization header value for this object. 2119 // Write out the serialization header value for this object.
2031 writer->WriteInlinedObjectHeader(object_id); 2120 writer->WriteInlinedObjectHeader(object_id);
2032 2121
2033 // Write out the class and tags information. 2122 // Write out the class and tags information.
2034 writer->WriteIndexedObject(kInstanceCid); 2123 writer->WriteIndexedObject(kInstanceCid);
2035 writer->WriteTags(writer->GetObjectTags(this)); 2124 writer->WriteTags(writer->GetObjectTags(this));
2036 } 2125 }
2037 2126
2038 2127
2039 RawInteger* Mint::ReadFrom(SnapshotReader* reader, 2128 RawInteger* Mint::ReadFrom(SnapshotReader* reader,
2040 intptr_t object_id, 2129 intptr_t object_id,
2041 intptr_t tags, 2130 intptr_t tags,
2042 Snapshot::Kind kind) { 2131 Snapshot::Kind kind,
2132 bool as_reference) {
2043 ASSERT(reader != NULL); 2133 ASSERT(reader != NULL);
2044 2134
2045 // Read the 64 bit value for the object. 2135 // Read the 64 bit value for the object.
2046 int64_t value = reader->Read<int64_t>(); 2136 int64_t value = reader->Read<int64_t>();
2047 2137
2048 // Check if the value could potentially fit in a Smi in our current 2138 // Check if the value could potentially fit in a Smi in our current
2049 // architecture, if so return the object as a Smi. 2139 // architecture, if so return the object as a Smi.
2050 if (Smi::IsValid(value)) { 2140 if (Smi::IsValid(value)) {
2051 Smi& smi = Smi::ZoneHandle(reader->zone(), 2141 Smi& smi = Smi::ZoneHandle(reader->zone(),
2052 Smi::New(static_cast<intptr_t>(value))); 2142 Smi::New(static_cast<intptr_t>(value)));
(...skipping 22 matching lines...) Expand all
2075 mint = Mint::New(value, HEAP_SPACE(kind)); 2165 mint = Mint::New(value, HEAP_SPACE(kind));
2076 } 2166 }
2077 } 2167 }
2078 reader->AddBackRef(object_id, &mint, kIsDeserialized); 2168 reader->AddBackRef(object_id, &mint, kIsDeserialized);
2079 return mint.raw(); 2169 return mint.raw();
2080 } 2170 }
2081 2171
2082 2172
2083 void RawMint::WriteTo(SnapshotWriter* writer, 2173 void RawMint::WriteTo(SnapshotWriter* writer,
2084 intptr_t object_id, 2174 intptr_t object_id,
2085 Snapshot::Kind kind) { 2175 Snapshot::Kind kind,
2176 bool as_reference) {
2086 ASSERT(writer != NULL); 2177 ASSERT(writer != NULL);
2087 2178
2088 // Write out the serialization header value for this object. 2179 // Write out the serialization header value for this object.
2089 writer->WriteInlinedObjectHeader(object_id); 2180 writer->WriteInlinedObjectHeader(object_id);
2090 2181
2091 // Write out the class and tags information. 2182 // Write out the class and tags information.
2092 writer->WriteIndexedObject(kMintCid); 2183 writer->WriteIndexedObject(kMintCid);
2093 writer->WriteTags(writer->GetObjectTags(this)); 2184 writer->WriteTags(writer->GetObjectTags(this));
2094 2185
2095 // Write out the 64 bit value. 2186 // Write out the 64 bit value.
2096 writer->Write<int64_t>(ptr()->value_); 2187 writer->Write<int64_t>(ptr()->value_);
2097 } 2188 }
2098 2189
2099 2190
2100 RawBigint* Bigint::ReadFrom(SnapshotReader* reader, 2191 RawBigint* Bigint::ReadFrom(SnapshotReader* reader,
2101 intptr_t object_id, 2192 intptr_t object_id,
2102 intptr_t tags, 2193 intptr_t tags,
2103 Snapshot::Kind kind) { 2194 Snapshot::Kind kind,
2195 bool as_reference) {
2104 ASSERT(reader != NULL); 2196 ASSERT(reader != NULL);
2105 2197
2106 // Allocate bigint object. 2198 // Allocate bigint object.
2107 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint)); 2199 Bigint& obj = Bigint::ZoneHandle(reader->zone(), NEW_OBJECT(Bigint));
2108 reader->AddBackRef(object_id, &obj, kIsDeserialized); 2200 reader->AddBackRef(object_id, &obj, kIsDeserialized);
2109 2201
2110 // Set all the object fields. 2202 // Set all the object fields.
2111 READ_OBJECT_FIELDS(obj, obj.raw()->from(), obj.raw()->to(), kAsInlinedObject); 2203 READ_OBJECT_FIELDS(obj, obj.raw()->from(), obj.raw()->to(), kAsInlinedObject);
2112 2204
2113 // If it is a canonical constant make it one. 2205 // If it is a canonical constant make it one.
(...skipping 10 matching lines...) Expand all
2124 ASSERT(!obj.IsNull()); 2216 ASSERT(!obj.IsNull());
2125 ASSERT(obj.IsCanonical()); 2217 ASSERT(obj.IsCanonical());
2126 } 2218 }
2127 } 2219 }
2128 return obj.raw(); 2220 return obj.raw();
2129 } 2221 }
2130 2222
2131 2223
2132 void RawBigint::WriteTo(SnapshotWriter* writer, 2224 void RawBigint::WriteTo(SnapshotWriter* writer,
2133 intptr_t object_id, 2225 intptr_t object_id,
2134 Snapshot::Kind kind) { 2226 Snapshot::Kind kind,
2227 bool as_reference) {
2135 ASSERT(writer != NULL); 2228 ASSERT(writer != NULL);
2136 2229
2137 // Write out the serialization header value for this object. 2230 // Write out the serialization header value for this object.
2138 writer->WriteInlinedObjectHeader(object_id); 2231 writer->WriteInlinedObjectHeader(object_id);
2139 2232
2140 // Write out the class and tags information. 2233 // Write out the class and tags information.
2141 writer->WriteIndexedObject(kBigintCid); 2234 writer->WriteIndexedObject(kBigintCid);
2142 writer->WriteTags(writer->GetObjectTags(this)); 2235 writer->WriteTags(writer->GetObjectTags(this));
2143 2236
2144 // Write out all the object pointer fields. 2237 // Write out all the object pointer fields.
2145 SnapshotWriterVisitor visitor(writer, kAsInlinedObject); 2238 SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
2146 visitor.VisitPointers(from(), to()); 2239 visitor.VisitPointers(from(), to());
2147 } 2240 }
2148 2241
2149 2242
2150 RawDouble* Double::ReadFrom(SnapshotReader* reader, 2243 RawDouble* Double::ReadFrom(SnapshotReader* reader,
2151 intptr_t object_id, 2244 intptr_t object_id,
2152 intptr_t tags, 2245 intptr_t tags,
2153 Snapshot::Kind kind) { 2246 Snapshot::Kind kind,
2247 bool as_reference) {
2154 ASSERT(reader != NULL); 2248 ASSERT(reader != NULL);
2155 ASSERT(kind != Snapshot::kMessage); 2249 ASSERT(kind != Snapshot::kMessage);
2156 // Read the double value for the object. 2250 // Read the double value for the object.
2157 double value = reader->ReadDouble(); 2251 double value = reader->ReadDouble();
2158 2252
2159 // Create a Double object or get canonical one if it is a canonical constant. 2253 // Create a Double object or get canonical one if it is a canonical constant.
2160 Double& dbl = Double::ZoneHandle(reader->zone(), Double::null()); 2254 Double& dbl = Double::ZoneHandle(reader->zone(), Double::null());
2161 if (kind == Snapshot::kFull) { 2255 if (kind == Snapshot::kFull) {
2162 dbl = reader->NewDouble(value); 2256 dbl = reader->NewDouble(value);
2163 // Set the canonical bit. 2257 // Set the canonical bit.
(...skipping 12 matching lines...) Expand all
2176 dbl = Double::New(value, HEAP_SPACE(kind)); 2270 dbl = Double::New(value, HEAP_SPACE(kind));
2177 } 2271 }
2178 } 2272 }
2179 reader->AddBackRef(object_id, &dbl, kIsDeserialized); 2273 reader->AddBackRef(object_id, &dbl, kIsDeserialized);
2180 return dbl.raw(); 2274 return dbl.raw();
2181 } 2275 }
2182 2276
2183 2277
2184 void RawDouble::WriteTo(SnapshotWriter* writer, 2278 void RawDouble::WriteTo(SnapshotWriter* writer,
2185 intptr_t object_id, 2279 intptr_t object_id,
2186 Snapshot::Kind kind) { 2280 Snapshot::Kind kind,
2281 bool as_reference) {
2187 ASSERT(writer != NULL); 2282 ASSERT(writer != NULL);
2188 2283
2189 // Write out the serialization header value for this object. 2284 // Write out the serialization header value for this object.
2190 writer->WriteInlinedObjectHeader(object_id); 2285 writer->WriteInlinedObjectHeader(object_id);
2191 2286
2192 // Write out the class and tags information. 2287 // Write out the class and tags information.
2193 writer->WriteIndexedObject(kDoubleCid); 2288 writer->WriteIndexedObject(kDoubleCid);
2194 writer->WriteTags(writer->GetObjectTags(this)); 2289 writer->WriteTags(writer->GetObjectTags(this));
2195 2290
2196 // Write out the double value. 2291 // Write out the double value.
2197 writer->WriteDouble(ptr()->value_); 2292 writer->WriteDouble(ptr()->value_);
2198 } 2293 }
2199 2294
2200 2295
2201 RawString* String::ReadFrom(SnapshotReader* reader, 2296 RawString* String::ReadFrom(SnapshotReader* reader,
2202 intptr_t object_id, 2297 intptr_t object_id,
2203 intptr_t tags, 2298 intptr_t tags,
2204 Snapshot::Kind kind) { 2299 Snapshot::Kind kind,
2300 bool as_reference) {
2205 UNREACHABLE(); // String is an abstract class. 2301 UNREACHABLE(); // String is an abstract class.
2206 return String::null(); 2302 return String::null();
2207 } 2303 }
2208 2304
2209 2305
2210 void RawString::WriteTo(SnapshotWriter* writer, 2306 void RawString::WriteTo(SnapshotWriter* writer,
2211 intptr_t object_id, 2307 intptr_t object_id,
2212 Snapshot::Kind kind) { 2308 Snapshot::Kind kind,
2309 bool as_reference) {
2213 UNREACHABLE(); // String is an abstract class. 2310 UNREACHABLE(); // String is an abstract class.
2214 } 2311 }
2215 2312
2216 2313
2217 template<typename StringType, typename CharacterType, typename CallbackType> 2314 template<typename StringType, typename CharacterType, typename CallbackType>
2218 void String::ReadFromImpl(SnapshotReader* reader, 2315 void String::ReadFromImpl(SnapshotReader* reader,
2219 String* str_obj, 2316 String* str_obj,
2220 intptr_t len, 2317 intptr_t len,
2221 intptr_t tags, 2318 intptr_t tags,
2222 CallbackType new_symbol, 2319 CallbackType new_symbol,
(...skipping 20 matching lines...) Expand all
2243 *str_addr = reader->Read<CharacterType>(); 2340 *str_addr = reader->Read<CharacterType>();
2244 str_addr++; 2341 str_addr++;
2245 } 2342 }
2246 } 2343 }
2247 } 2344 }
2248 2345
2249 2346
2250 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader, 2347 RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader,
2251 intptr_t object_id, 2348 intptr_t object_id,
2252 intptr_t tags, 2349 intptr_t tags,
2253 Snapshot::Kind kind) { 2350 Snapshot::Kind kind,
2351 bool as_reference) {
2254 // Read the length so that we can determine instance size to allocate. 2352 // Read the length so that we can determine instance size to allocate.
2255 ASSERT(reader != NULL); 2353 ASSERT(reader != NULL);
2256 intptr_t len = reader->ReadSmiValue(); 2354 intptr_t len = reader->ReadSmiValue();
2257 intptr_t hash = reader->ReadSmiValue(); 2355 intptr_t hash = reader->ReadSmiValue();
2258 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); 2356 String& str_obj = String::ZoneHandle(reader->zone(), String::null());
2259 2357
2260 if (kind == Snapshot::kFull) { 2358 if (kind == Snapshot::kFull) {
2261 // We currently only expect the Dart mutator to read snapshots. 2359 // We currently only expect the Dart mutator to read snapshots.
2262 reader->isolate()->AssertCurrentThreadIsMutator(); 2360 reader->isolate()->AssertCurrentThreadIsMutator();
2263 ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0); 2361 ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0);
(...skipping 13 matching lines...) Expand all
2277 reader, &str_obj, len, tags, Symbols::FromLatin1, kind); 2375 reader, &str_obj, len, tags, Symbols::FromLatin1, kind);
2278 } 2376 }
2279 reader->AddBackRef(object_id, &str_obj, kIsDeserialized); 2377 reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
2280 return raw(str_obj); 2378 return raw(str_obj);
2281 } 2379 }
2282 2380
2283 2381
2284 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader, 2382 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader,
2285 intptr_t object_id, 2383 intptr_t object_id,
2286 intptr_t tags, 2384 intptr_t tags,
2287 Snapshot::Kind kind) { 2385 Snapshot::Kind kind,
2386 bool as_reference) {
2288 // Read the length so that we can determine instance size to allocate. 2387 // Read the length so that we can determine instance size to allocate.
2289 ASSERT(reader != NULL); 2388 ASSERT(reader != NULL);
2290 intptr_t len = reader->ReadSmiValue(); 2389 intptr_t len = reader->ReadSmiValue();
2291 intptr_t hash = reader->ReadSmiValue(); 2390 intptr_t hash = reader->ReadSmiValue();
2292 String& str_obj = String::ZoneHandle(reader->zone(), String::null()); 2391 String& str_obj = String::ZoneHandle(reader->zone(), String::null());
2293 2392
2294 if (kind == Snapshot::kFull) { 2393 if (kind == Snapshot::kFull) {
2295 RawTwoByteString* obj = reader->NewTwoByteString(len); 2394 RawTwoByteString* obj = reader->NewTwoByteString(len);
2296 str_obj = obj; 2395 str_obj = obj;
2297 if (RawObject::IsCanonical(tags)) { 2396 if (RawObject::IsCanonical(tags)) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 for (intptr_t i = 0; i < len; i++) { 2447 for (intptr_t i = 0; i < len; i++) {
2349 writer->Write(data[i]); 2448 writer->Write(data[i]);
2350 } 2449 }
2351 } 2450 }
2352 } 2451 }
2353 } 2452 }
2354 2453
2355 2454
2356 void RawOneByteString::WriteTo(SnapshotWriter* writer, 2455 void RawOneByteString::WriteTo(SnapshotWriter* writer,
2357 intptr_t object_id, 2456 intptr_t object_id,
2358 Snapshot::Kind kind) { 2457 Snapshot::Kind kind,
2458 bool as_reference) {
2359 StringWriteTo(writer, 2459 StringWriteTo(writer,
2360 object_id, 2460 object_id,
2361 kind, 2461 kind,
2362 kOneByteStringCid, 2462 kOneByteStringCid,
2363 writer->GetObjectTags(this), 2463 writer->GetObjectTags(this),
2364 ptr()->length_, 2464 ptr()->length_,
2365 ptr()->hash_, 2465 ptr()->hash_,
2366 ptr()->data()); 2466 ptr()->data());
2367 } 2467 }
2368 2468
2369 2469
2370 void RawTwoByteString::WriteTo(SnapshotWriter* writer, 2470 void RawTwoByteString::WriteTo(SnapshotWriter* writer,
2371 intptr_t object_id, 2471 intptr_t object_id,
2372 Snapshot::Kind kind) { 2472 Snapshot::Kind kind,
2473 bool as_reference) {
2373 StringWriteTo(writer, 2474 StringWriteTo(writer,
2374 object_id, 2475 object_id,
2375 kind, 2476 kind,
2376 kTwoByteStringCid, 2477 kTwoByteStringCid,
2377 writer->GetObjectTags(this), 2478 writer->GetObjectTags(this),
2378 ptr()->length_, 2479 ptr()->length_,
2379 ptr()->hash_, 2480 ptr()->hash_,
2380 ptr()->data()); 2481 ptr()->data());
2381 } 2482 }
2382 2483
2383 2484
2384 RawExternalOneByteString* ExternalOneByteString::ReadFrom( 2485 RawExternalOneByteString* ExternalOneByteString::ReadFrom(
2385 SnapshotReader* reader, 2486 SnapshotReader* reader,
2386 intptr_t object_id, 2487 intptr_t object_id,
2387 intptr_t tags, 2488 intptr_t tags,
2388 Snapshot::Kind kind) { 2489 Snapshot::Kind kind,
2490 bool as_reference) {
2389 UNREACHABLE(); 2491 UNREACHABLE();
2390 return ExternalOneByteString::null(); 2492 return ExternalOneByteString::null();
2391 } 2493 }
2392 2494
2393 2495
2394 RawExternalTwoByteString* ExternalTwoByteString::ReadFrom( 2496 RawExternalTwoByteString* ExternalTwoByteString::ReadFrom(
2395 SnapshotReader* reader, 2497 SnapshotReader* reader,
2396 intptr_t object_id, 2498 intptr_t object_id,
2397 intptr_t tags, 2499 intptr_t tags,
2398 Snapshot::Kind kind) { 2500 Snapshot::Kind kind,
2501 bool as_reference) {
2399 UNREACHABLE(); 2502 UNREACHABLE();
2400 return ExternalTwoByteString::null(); 2503 return ExternalTwoByteString::null();
2401 } 2504 }
2402 2505
2403 2506
2404 void RawExternalOneByteString::WriteTo(SnapshotWriter* writer, 2507 void RawExternalOneByteString::WriteTo(SnapshotWriter* writer,
2405 intptr_t object_id, 2508 intptr_t object_id,
2406 Snapshot::Kind kind) { 2509 Snapshot::Kind kind,
2510 bool as_reference) {
2407 // Serialize as a non-external one byte string. 2511 // Serialize as a non-external one byte string.
2408 StringWriteTo(writer, 2512 StringWriteTo(writer,
2409 object_id, 2513 object_id,
2410 kind, 2514 kind,
2411 kOneByteStringCid, 2515 kOneByteStringCid,
2412 writer->GetObjectTags(this), 2516 writer->GetObjectTags(this),
2413 ptr()->length_, 2517 ptr()->length_,
2414 ptr()->hash_, 2518 ptr()->hash_,
2415 ptr()->external_data_->data()); 2519 ptr()->external_data_->data());
2416 } 2520 }
2417 2521
2418 2522
2419 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer, 2523 void RawExternalTwoByteString::WriteTo(SnapshotWriter* writer,
2420 intptr_t object_id, 2524 intptr_t object_id,
2421 Snapshot::Kind kind) { 2525 Snapshot::Kind kind,
2526 bool as_reference) {
2422 // Serialize as a non-external two byte string. 2527 // Serialize as a non-external two byte string.
2423 StringWriteTo(writer, 2528 StringWriteTo(writer,
2424 object_id, 2529 object_id,
2425 kind, 2530 kind,
2426 kTwoByteStringCid, 2531 kTwoByteStringCid,
2427 writer->GetObjectTags(this), 2532 writer->GetObjectTags(this),
2428 ptr()->length_, 2533 ptr()->length_,
2429 ptr()->hash_, 2534 ptr()->hash_,
2430 ptr()->external_data_->data()); 2535 ptr()->external_data_->data());
2431 } 2536 }
2432 2537
2433 2538
2434 RawBool* Bool::ReadFrom(SnapshotReader* reader, 2539 RawBool* Bool::ReadFrom(SnapshotReader* reader,
2435 intptr_t object_id, 2540 intptr_t object_id,
2436 intptr_t tags, 2541 intptr_t tags,
2437 Snapshot::Kind kind) { 2542 Snapshot::Kind kind,
2543 bool as_reference) {
2438 UNREACHABLE(); 2544 UNREACHABLE();
2439 return Bool::null(); 2545 return Bool::null();
2440 } 2546 }
2441 2547
2442 2548
2443 void RawBool::WriteTo(SnapshotWriter* writer, 2549 void RawBool::WriteTo(SnapshotWriter* writer,
2444 intptr_t object_id, 2550 intptr_t object_id,
2445 Snapshot::Kind kind) { 2551 Snapshot::Kind kind,
2552 bool as_reference) {
2446 UNREACHABLE(); 2553 UNREACHABLE();
2447 } 2554 }
2448 2555
2449 2556
2450 RawArray* Array::ReadFrom(SnapshotReader* reader, 2557 RawArray* Array::ReadFrom(SnapshotReader* reader,
2451 intptr_t object_id, 2558 intptr_t object_id,
2452 intptr_t tags, 2559 intptr_t tags,
2453 Snapshot::Kind kind) { 2560 Snapshot::Kind kind,
2561 bool as_reference) {
2454 ASSERT(reader != NULL); 2562 ASSERT(reader != NULL);
2455 2563
2456 // Read the length so that we can determine instance size to allocate. 2564 // Read the length so that we can determine instance size to allocate.
2457 intptr_t len = reader->ReadSmiValue(); 2565 intptr_t len = reader->ReadSmiValue();
2458 Array* array = reinterpret_cast<Array*>( 2566 Array* array = reinterpret_cast<Array*>(
2459 reader->GetBackRef(object_id)); 2567 reader->GetBackRef(object_id));
2460 if (array == NULL) { 2568 if (array == NULL) {
2461 array = &(Array::ZoneHandle(reader->zone(), 2569 array = &(Array::ZoneHandle(reader->zone(),
2462 NEW_OBJECT_WITH_LEN_SPACE(Array, len, kind))); 2570 NEW_OBJECT_WITH_LEN_SPACE(Array, len, kind)));
2463 reader->AddBackRef(object_id, array, kIsDeserialized); 2571 reader->AddBackRef(object_id, array, kIsDeserialized);
2464 } 2572 }
2465 ASSERT(!RawObject::IsCanonical(tags)); 2573 ASSERT(!RawObject::IsCanonical(tags));
2466 reader->ArrayReadFrom(object_id, *array, len, tags); 2574 reader->ArrayReadFrom(object_id, *array, len, tags);
2467 return array->raw(); 2575 return array->raw();
2468 } 2576 }
2469 2577
2470 2578
2471 RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader, 2579 RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader,
2472 intptr_t object_id, 2580 intptr_t object_id,
2473 intptr_t tags, 2581 intptr_t tags,
2474 Snapshot::Kind kind) { 2582 Snapshot::Kind kind,
2583 bool as_reference) {
2475 ASSERT(reader != NULL); 2584 ASSERT(reader != NULL);
2476 2585
2477 // Read the length so that we can determine instance size to allocate. 2586 // Read the length so that we can determine instance size to allocate.
2478 intptr_t len = reader->ReadSmiValue(); 2587 intptr_t len = reader->ReadSmiValue();
2479 Array* array = reinterpret_cast<Array*>(reader->GetBackRef(object_id)); 2588 Array* array = reinterpret_cast<Array*>(reader->GetBackRef(object_id));
2480 if (array == NULL) { 2589 if (array == NULL) {
2481 array = &(Array::ZoneHandle( 2590 array = &(Array::ZoneHandle(
2482 reader->zone(), 2591 reader->zone(),
2483 NEW_OBJECT_WITH_LEN_SPACE(ImmutableArray, len, kind))); 2592 NEW_OBJECT_WITH_LEN_SPACE(ImmutableArray, len, kind)));
2484 reader->AddBackRef(object_id, array, kIsDeserialized); 2593 reader->AddBackRef(object_id, array, kIsDeserialized);
2485 } 2594 }
2486 reader->ArrayReadFrom(object_id, *array, len, tags); 2595 reader->ArrayReadFrom(object_id, *array, len, tags);
2487 if (RawObject::IsCanonical(tags)) { 2596 if (RawObject::IsCanonical(tags)) {
2488 if (kind == Snapshot::kFull) { 2597 if (kind == Snapshot::kFull) {
2489 array->SetCanonical(); 2598 array->SetCanonical();
2490 } else { 2599 } else {
2491 *array ^= array->CheckAndCanonicalize(NULL); 2600 *array ^= array->CheckAndCanonicalize(NULL);
2492 } 2601 }
2493 } 2602 }
2494 return raw(*array); 2603 return raw(*array);
2495 } 2604 }
2496 2605
2497 2606
2498 void RawArray::WriteTo(SnapshotWriter* writer, 2607 void RawArray::WriteTo(SnapshotWriter* writer,
2499 intptr_t object_id, 2608 intptr_t object_id,
2500 Snapshot::Kind kind) { 2609 Snapshot::Kind kind,
2610 bool as_reference) {
2501 ASSERT(!RawObject::IsCanonical(writer->GetObjectTags(this))); 2611 ASSERT(!RawObject::IsCanonical(writer->GetObjectTags(this)));
2502 writer->ArrayWriteTo(object_id, 2612 writer->ArrayWriteTo(object_id,
2503 kArrayCid, 2613 kArrayCid,
2504 writer->GetObjectTags(this), 2614 writer->GetObjectTags(this),
2505 ptr()->length_, 2615 ptr()->length_,
2506 ptr()->type_arguments_, 2616 ptr()->type_arguments_,
2507 ptr()->data()); 2617 ptr()->data(),
2618 as_reference);
2508 } 2619 }
2509 2620
2510 2621
2511 void RawImmutableArray::WriteTo(SnapshotWriter* writer, 2622 void RawImmutableArray::WriteTo(SnapshotWriter* writer,
2512 intptr_t object_id, 2623 intptr_t object_id,
2513 Snapshot::Kind kind) { 2624 Snapshot::Kind kind,
2625 bool as_reference) {
2514 writer->ArrayWriteTo(object_id, 2626 writer->ArrayWriteTo(object_id,
2515 kImmutableArrayCid, 2627 kImmutableArrayCid,
2516 writer->GetObjectTags(this), 2628 writer->GetObjectTags(this),
2517 ptr()->length_, 2629 ptr()->length_,
2518 ptr()->type_arguments_, 2630 ptr()->type_arguments_,
2519 ptr()->data()); 2631 ptr()->data(),
2632 as_reference);
2520 } 2633 }
2521 2634
2522 2635
2523 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader, 2636 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader,
2524 intptr_t object_id, 2637 intptr_t object_id,
2525 intptr_t tags, 2638 intptr_t tags,
2526 Snapshot::Kind kind) { 2639 Snapshot::Kind kind,
2640 bool as_reference) {
2527 ASSERT(reader != NULL); 2641 ASSERT(reader != NULL);
2528 2642
2529 // Read the length so that we can determine instance size to allocate. 2643 // Read the length so that we can determine instance size to allocate.
2530 GrowableObjectArray& array = GrowableObjectArray::ZoneHandle( 2644 GrowableObjectArray& array = GrowableObjectArray::ZoneHandle(
2531 reader->zone(), GrowableObjectArray::null()); 2645 reader->zone(), GrowableObjectArray::null());
2532 if (kind == Snapshot::kFull) { 2646 if (kind == Snapshot::kFull) {
2533 array = reader->NewGrowableObjectArray(); 2647 array = reader->NewGrowableObjectArray();
2534 } else { 2648 } else {
2535 array = GrowableObjectArray::New(0, HEAP_SPACE(kind)); 2649 array = GrowableObjectArray::New(0, HEAP_SPACE(kind));
2536 } 2650 }
2537 reader->AddBackRef(object_id, &array, kIsDeserialized); 2651 reader->AddBackRef(object_id, &array, kIsDeserialized);
2538 2652
2539 // Read type arguments of growable array object. 2653 // Read type arguments of growable array object.
2540 const intptr_t typeargs_offset = 2654 const intptr_t typeargs_offset =
2541 GrowableObjectArray::type_arguments_offset() / kWordSize; 2655 GrowableObjectArray::type_arguments_offset() / kWordSize;
2542 *reader->TypeArgumentsHandle() ^= 2656 *reader->TypeArgumentsHandle() ^=
2543 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset); 2657 reader->ReadObjectImpl(kAsInlinedObject, object_id, typeargs_offset);
2544 array.StorePointer(&array.raw_ptr()->type_arguments_, 2658 array.StorePointer(&array.raw_ptr()->type_arguments_,
2545 reader->TypeArgumentsHandle()->raw()); 2659 reader->TypeArgumentsHandle()->raw());
2546 2660
2547 // Read length of growable array object. 2661 // Read length of growable array object.
2548 array.SetLength(reader->ReadSmiValue()); 2662 array.SetLength(reader->ReadSmiValue());
2549 2663
2550 // Read the backing array of growable array object. 2664 // Read the backing array of growable array object.
2551 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsInlinedObject); 2665 *(reader->ArrayHandle()) ^= reader->ReadObjectImpl(kAsReference);
2552 array.SetData(*(reader->ArrayHandle())); 2666 array.SetData(*(reader->ArrayHandle()));
2553 2667
2554 return array.raw(); 2668 return array.raw();
2555 } 2669 }
2556 2670
2557 2671
2558 void RawGrowableObjectArray::WriteTo(SnapshotWriter* writer, 2672 void RawGrowableObjectArray::WriteTo(SnapshotWriter* writer,
2559 intptr_t object_id, 2673 intptr_t object_id,
2560 Snapshot::Kind kind) { 2674 Snapshot::Kind kind,
2675 bool as_reference) {
2561 ASSERT(writer != NULL); 2676 ASSERT(writer != NULL);
2562 2677
2563 // Write out the serialization header value for this object. 2678 // Write out the serialization header value for this object.
2564 writer->WriteInlinedObjectHeader(object_id); 2679 writer->WriteInlinedObjectHeader(object_id);
2565 2680
2566 // Write out the class and tags information. 2681 // Write out the class and tags information.
2567 writer->WriteIndexedObject(kGrowableObjectArrayCid); 2682 writer->WriteIndexedObject(kGrowableObjectArrayCid);
2568 writer->WriteTags(writer->GetObjectTags(this)); 2683 writer->WriteTags(writer->GetObjectTags(this));
2569 2684
2570 // Write out the type arguments field. 2685 // Write out the type arguments field.
2571 writer->WriteObjectImpl(ptr()->type_arguments_, kAsInlinedObject); 2686 writer->WriteObjectImpl(ptr()->type_arguments_, kAsInlinedObject);
2572 2687
2573 // Write out the used length field. 2688 // Write out the used length field.
2574 writer->Write<RawObject*>(ptr()->length_); 2689 writer->Write<RawObject*>(ptr()->length_);
2575 2690
2576 // Write out the Array object. 2691 // Write out the Array object.
2577 writer->WriteObjectImpl(ptr()->data_, kAsInlinedObject); 2692 writer->WriteObjectImpl(ptr()->data_, kAsReference);
2578 } 2693 }
2579 2694
2580 2695
2581 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader, 2696 RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader,
2582 intptr_t object_id, 2697 intptr_t object_id,
2583 intptr_t tags, 2698 intptr_t tags,
2584 Snapshot::Kind kind) { 2699 Snapshot::Kind kind,
2700 bool as_reference) {
2585 ASSERT(reader != NULL); 2701 ASSERT(reader != NULL);
2586 2702
2587 LinkedHashMap& map = LinkedHashMap::ZoneHandle( 2703 LinkedHashMap& map = LinkedHashMap::ZoneHandle(
2588 reader->zone(), LinkedHashMap::null()); 2704 reader->zone(), LinkedHashMap::null());
2589 if ((kind == Snapshot::kFull && !reader->snapshot_code()) || 2705 if ((kind == Snapshot::kFull && !reader->snapshot_code()) ||
2590 kind == Snapshot::kScript) { 2706 kind == Snapshot::kScript) {
2591 // The immutable maps that seed map literals are not yet VM-internal, so 2707 // The immutable maps that seed map literals are not yet VM-internal, so
2592 // we don't reach this. 2708 // we don't reach this.
2593 UNREACHABLE(); 2709 UNREACHABLE();
2594 } else { 2710 } else {
(...skipping 30 matching lines...) Expand all
2625 map.SetDeletedKeys(0); 2741 map.SetDeletedKeys(0);
2626 2742
2627 // The index and hashMask is regenerated by the maps themselves on demand. 2743 // The index and hashMask is regenerated by the maps themselves on demand.
2628 // Thus, the index will probably be allocated in new space (unless it's huge). 2744 // Thus, the index will probably be allocated in new space (unless it's huge).
2629 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and 2745 // TODO(koda): Eagerly rehash here when no keys have user-defined '==', and
2630 // in particular, if/when (const) maps are needed in the VM isolate snapshot. 2746 // in particular, if/when (const) maps are needed in the VM isolate snapshot.
2631 ASSERT(reader->isolate() != Dart::vm_isolate()); 2747 ASSERT(reader->isolate() != Dart::vm_isolate());
2632 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback. 2748 map.SetHashMask(0); // Prefer sentinel 0 over null for better type feedback.
2633 2749
2634 // Read the keys and values. 2750 // Read the keys and values.
2635 bool as_reference = RawObject::IsCanonical(tags) ? false : true; 2751 bool read_as_reference = RawObject::IsCanonical(tags) ? false : true;
2636 for (intptr_t i = 0; i < used_data; i++) { 2752 for (intptr_t i = 0; i < used_data; i++) {
2637 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(as_reference); 2753 *reader->PassiveObjectHandle() = reader->ReadObjectImpl(read_as_reference);
2638 data.SetAt(i, *reader->PassiveObjectHandle()); 2754 data.SetAt(i, *reader->PassiveObjectHandle());
2639 } 2755 }
2640 return map.raw(); 2756 return map.raw();
2641 } 2757 }
2642 2758
2643 2759
2644 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer, 2760 void RawLinkedHashMap::WriteTo(SnapshotWriter* writer,
2645 intptr_t object_id, 2761 intptr_t object_id,
2646 Snapshot::Kind kind) { 2762 Snapshot::Kind kind,
2763 bool as_reference) {
2647 if ((kind == Snapshot::kFull && !writer->snapshot_code()) || 2764 if ((kind == Snapshot::kFull && !writer->snapshot_code()) ||
2648 kind == Snapshot::kScript) { 2765 kind == Snapshot::kScript) {
2649 // The immutable maps that seed map literals are not yet VM-internal, so 2766 // The immutable maps that seed map literals are not yet VM-internal, so
2650 // we don't reach this. 2767 // we don't reach this.
2651 } 2768 }
2652 ASSERT(writer != NULL); 2769 ASSERT(writer != NULL);
2653 2770
2654 // Write out the serialization header value for this object. 2771 // Write out the serialization header value for this object.
2655 writer->WriteInlinedObjectHeader(object_id); 2772 writer->WriteInlinedObjectHeader(object_id);
2656 2773
2657 // Write out the class and tags information. 2774 // Write out the class and tags information.
2658 writer->WriteIndexedObject(kLinkedHashMapCid); 2775 writer->WriteIndexedObject(kLinkedHashMapCid);
2659 const uword tags = writer->GetObjectTags(this); 2776 const uword tags = writer->GetObjectTags(this);
2660 writer->WriteTags(tags); 2777 writer->WriteTags(tags);
2661 2778
2662 // Write out the type arguments. 2779 // Write out the type arguments.
2663 writer->WriteObjectImpl(ptr()->type_arguments_, kAsInlinedObject); 2780 writer->WriteObjectImpl(ptr()->type_arguments_, kAsInlinedObject);
2664 2781
2665 const intptr_t used_data = Smi::Value(ptr()->used_data_); 2782 const intptr_t used_data = Smi::Value(ptr()->used_data_);
2666 ASSERT((used_data & 1) == 0); // Keys + values, so must be even. 2783 ASSERT((used_data & 1) == 0); // Keys + values, so must be even.
2667 const intptr_t deleted_keys = Smi::Value(ptr()->deleted_keys_); 2784 const intptr_t deleted_keys = Smi::Value(ptr()->deleted_keys_);
2668 2785
2669 // Write out the number of (not deleted) key/value pairs that will follow. 2786 // Write out the number of (not deleted) key/value pairs that will follow.
2670 writer->Write<RawObject*>(Smi::New((used_data >> 1) - deleted_keys)); 2787 writer->Write<RawObject*>(Smi::New((used_data >> 1) - deleted_keys));
2671 2788
2672 // Write out the keys and values. 2789 // Write out the keys and values.
2673 const bool as_reference = RawObject::IsCanonical(tags) ? false : true; 2790 bool write_as_reference = RawObject::IsCanonical(tags) ? false : true;
2674 RawArray* data_array = ptr()->data_; 2791 RawArray* data_array = ptr()->data_;
2675 RawObject** data_elements = data_array->ptr()->data(); 2792 RawObject** data_elements = data_array->ptr()->data();
2676 ASSERT(used_data <= Smi::Value(data_array->ptr()->length_)); 2793 ASSERT(used_data <= Smi::Value(data_array->ptr()->length_));
2677 #if defined(DEBUG) 2794 #if defined(DEBUG)
2678 intptr_t deleted_keys_found = 0; 2795 intptr_t deleted_keys_found = 0;
2679 #endif // DEBUG 2796 #endif // DEBUG
2680 for (intptr_t i = 0; i < used_data; i += 2) { 2797 for (intptr_t i = 0; i < used_data; i += 2) {
2681 RawObject* key = data_elements[i]; 2798 RawObject* key = data_elements[i];
2682 if (key == data_array) { 2799 if (key == data_array) {
2683 #if defined(DEBUG) 2800 #if defined(DEBUG)
2684 ++deleted_keys_found; 2801 ++deleted_keys_found;
2685 #endif // DEBUG 2802 #endif // DEBUG
2686 continue; 2803 continue;
2687 } 2804 }
2688 RawObject* value = data_elements[i + 1]; 2805 RawObject* value = data_elements[i + 1];
2689 writer->WriteObjectImpl(key, as_reference); 2806 writer->WriteObjectImpl(key, write_as_reference);
2690 writer->WriteObjectImpl(value, as_reference); 2807 writer->WriteObjectImpl(value, write_as_reference);
2691 } 2808 }
2692 DEBUG_ASSERT(deleted_keys_found == deleted_keys); 2809 DEBUG_ASSERT(deleted_keys_found == deleted_keys);
2693 } 2810 }
2694 2811
2695 2812
2696 RawFloat32x4* Float32x4::ReadFrom(SnapshotReader* reader, 2813 RawFloat32x4* Float32x4::ReadFrom(SnapshotReader* reader,
2697 intptr_t object_id, 2814 intptr_t object_id,
2698 intptr_t tags, 2815 intptr_t tags,
2699 Snapshot::Kind kind) { 2816 Snapshot::Kind kind,
2817 bool as_reference) {
2700 ASSERT(reader != NULL); 2818 ASSERT(reader != NULL);
2701 // Read the values. 2819 // Read the values.
2702 float value0 = reader->Read<float>(); 2820 float value0 = reader->Read<float>();
2703 float value1 = reader->Read<float>(); 2821 float value1 = reader->Read<float>();
2704 float value2 = reader->Read<float>(); 2822 float value2 = reader->Read<float>();
2705 float value3 = reader->Read<float>(); 2823 float value3 = reader->Read<float>();
2706 2824
2707 // Create a Float32x4 object. 2825 // Create a Float32x4 object.
2708 Float32x4& simd = Float32x4::ZoneHandle(reader->zone(), 2826 Float32x4& simd = Float32x4::ZoneHandle(reader->zone(),
2709 Float32x4::null()); 2827 Float32x4::null());
2710 if (kind == Snapshot::kFull) { 2828 if (kind == Snapshot::kFull) {
2711 simd = reader->NewFloat32x4(value0, value1, value2, value3); 2829 simd = reader->NewFloat32x4(value0, value1, value2, value3);
2712 } else { 2830 } else {
2713 simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); 2831 simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
2714 } 2832 }
2715 reader->AddBackRef(object_id, &simd, kIsDeserialized); 2833 reader->AddBackRef(object_id, &simd, kIsDeserialized);
2716 return simd.raw(); 2834 return simd.raw();
2717 } 2835 }
2718 2836
2719 2837
2720 void RawFloat32x4::WriteTo(SnapshotWriter* writer, 2838 void RawFloat32x4::WriteTo(SnapshotWriter* writer,
2721 intptr_t object_id, 2839 intptr_t object_id,
2722 Snapshot::Kind kind) { 2840 Snapshot::Kind kind,
2841 bool as_reference) {
2723 ASSERT(writer != NULL); 2842 ASSERT(writer != NULL);
2724 2843
2725 // Write out the serialization header value for this object. 2844 // Write out the serialization header value for this object.
2726 writer->WriteInlinedObjectHeader(object_id); 2845 writer->WriteInlinedObjectHeader(object_id);
2727 2846
2728 // Write out the class and tags information. 2847 // Write out the class and tags information.
2729 writer->WriteIndexedObject(kFloat32x4Cid); 2848 writer->WriteIndexedObject(kFloat32x4Cid);
2730 writer->WriteTags(writer->GetObjectTags(this)); 2849 writer->WriteTags(writer->GetObjectTags(this));
2731 2850
2732 // Write out the float values. 2851 // Write out the float values.
2733 writer->Write<float>(ptr()->value_[0]); 2852 writer->Write<float>(ptr()->value_[0]);
2734 writer->Write<float>(ptr()->value_[1]); 2853 writer->Write<float>(ptr()->value_[1]);
2735 writer->Write<float>(ptr()->value_[2]); 2854 writer->Write<float>(ptr()->value_[2]);
2736 writer->Write<float>(ptr()->value_[3]); 2855 writer->Write<float>(ptr()->value_[3]);
2737 } 2856 }
2738 2857
2739 2858
2740 RawInt32x4* Int32x4::ReadFrom(SnapshotReader* reader, 2859 RawInt32x4* Int32x4::ReadFrom(SnapshotReader* reader,
2741 intptr_t object_id, 2860 intptr_t object_id,
2742 intptr_t tags, 2861 intptr_t tags,
2743 Snapshot::Kind kind) { 2862 Snapshot::Kind kind,
2863 bool as_reference) {
2744 ASSERT(reader != NULL); 2864 ASSERT(reader != NULL);
2745 // Read the values. 2865 // Read the values.
2746 uint32_t value0 = reader->Read<uint32_t>(); 2866 uint32_t value0 = reader->Read<uint32_t>();
2747 uint32_t value1 = reader->Read<uint32_t>(); 2867 uint32_t value1 = reader->Read<uint32_t>();
2748 uint32_t value2 = reader->Read<uint32_t>(); 2868 uint32_t value2 = reader->Read<uint32_t>();
2749 uint32_t value3 = reader->Read<uint32_t>(); 2869 uint32_t value3 = reader->Read<uint32_t>();
2750 2870
2751 // Create a Float32x4 object. 2871 // Create a Float32x4 object.
2752 Int32x4& simd = Int32x4::ZoneHandle(reader->zone(), Int32x4::null()); 2872 Int32x4& simd = Int32x4::ZoneHandle(reader->zone(), Int32x4::null());
2753 2873
2754 if (kind == Snapshot::kFull) { 2874 if (kind == Snapshot::kFull) {
2755 simd = reader->NewInt32x4(value0, value1, value2, value3); 2875 simd = reader->NewInt32x4(value0, value1, value2, value3);
2756 } else { 2876 } else {
2757 simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind)); 2877 simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
2758 } 2878 }
2759 reader->AddBackRef(object_id, &simd, kIsDeserialized); 2879 reader->AddBackRef(object_id, &simd, kIsDeserialized);
2760 return simd.raw(); 2880 return simd.raw();
2761 } 2881 }
2762 2882
2763 2883
2764 void RawInt32x4::WriteTo(SnapshotWriter* writer, 2884 void RawInt32x4::WriteTo(SnapshotWriter* writer,
2765 intptr_t object_id, 2885 intptr_t object_id,
2766 Snapshot::Kind kind) { 2886 Snapshot::Kind kind,
2887 bool as_reference) {
2767 ASSERT(writer != NULL); 2888 ASSERT(writer != NULL);
2768 2889
2769 // Write out the serialization header value for this object. 2890 // Write out the serialization header value for this object.
2770 writer->WriteInlinedObjectHeader(object_id); 2891 writer->WriteInlinedObjectHeader(object_id);
2771 2892
2772 // Write out the class and tags information. 2893 // Write out the class and tags information.
2773 writer->WriteIndexedObject(kInt32x4Cid); 2894 writer->WriteIndexedObject(kInt32x4Cid);
2774 writer->WriteTags(writer->GetObjectTags(this)); 2895 writer->WriteTags(writer->GetObjectTags(this));
2775 2896
2776 // Write out the mask values. 2897 // Write out the mask values.
2777 writer->Write<uint32_t>(ptr()->value_[0]); 2898 writer->Write<uint32_t>(ptr()->value_[0]);
2778 writer->Write<uint32_t>(ptr()->value_[1]); 2899 writer->Write<uint32_t>(ptr()->value_[1]);
2779 writer->Write<uint32_t>(ptr()->value_[2]); 2900 writer->Write<uint32_t>(ptr()->value_[2]);
2780 writer->Write<uint32_t>(ptr()->value_[3]); 2901 writer->Write<uint32_t>(ptr()->value_[3]);
2781 } 2902 }
2782 2903
2783 2904
2784 RawFloat64x2* Float64x2::ReadFrom(SnapshotReader* reader, 2905 RawFloat64x2* Float64x2::ReadFrom(SnapshotReader* reader,
2785 intptr_t object_id, 2906 intptr_t object_id,
2786 intptr_t tags, 2907 intptr_t tags,
2787 Snapshot::Kind kind) { 2908 Snapshot::Kind kind,
2909 bool as_reference) {
2788 ASSERT(reader != NULL); 2910 ASSERT(reader != NULL);
2789 // Read the values. 2911 // Read the values.
2790 double value0 = reader->Read<double>(); 2912 double value0 = reader->Read<double>();
2791 double value1 = reader->Read<double>(); 2913 double value1 = reader->Read<double>();
2792 2914
2793 // Create a Float64x2 object. 2915 // Create a Float64x2 object.
2794 Float64x2& simd = Float64x2::ZoneHandle(reader->zone(), 2916 Float64x2& simd = Float64x2::ZoneHandle(reader->zone(),
2795 Float64x2::null()); 2917 Float64x2::null());
2796 if (kind == Snapshot::kFull) { 2918 if (kind == Snapshot::kFull) {
2797 simd = reader->NewFloat64x2(value0, value1); 2919 simd = reader->NewFloat64x2(value0, value1);
2798 } else { 2920 } else {
2799 simd = Float64x2::New(value0, value1, HEAP_SPACE(kind)); 2921 simd = Float64x2::New(value0, value1, HEAP_SPACE(kind));
2800 } 2922 }
2801 reader->AddBackRef(object_id, &simd, kIsDeserialized); 2923 reader->AddBackRef(object_id, &simd, kIsDeserialized);
2802 return simd.raw(); 2924 return simd.raw();
2803 } 2925 }
2804 2926
2805 2927
2806 void RawFloat64x2::WriteTo(SnapshotWriter* writer, 2928 void RawFloat64x2::WriteTo(SnapshotWriter* writer,
2807 intptr_t object_id, 2929 intptr_t object_id,
2808 Snapshot::Kind kind) { 2930 Snapshot::Kind kind,
2931 bool as_reference) {
2809 ASSERT(writer != NULL); 2932 ASSERT(writer != NULL);
2810 2933
2811 // Write out the serialization header value for this object. 2934 // Write out the serialization header value for this object.
2812 writer->WriteInlinedObjectHeader(object_id); 2935 writer->WriteInlinedObjectHeader(object_id);
2813 2936
2814 // Write out the class and tags information. 2937 // Write out the class and tags information.
2815 writer->WriteIndexedObject(kFloat64x2Cid); 2938 writer->WriteIndexedObject(kFloat64x2Cid);
2816 writer->WriteTags(writer->GetObjectTags(this)); 2939 writer->WriteTags(writer->GetObjectTags(this));
2817 2940
2818 // Write out the float values. 2941 // Write out the float values.
2819 writer->Write<double>(ptr()->value_[0]); 2942 writer->Write<double>(ptr()->value_[0]);
2820 writer->Write<double>(ptr()->value_[1]); 2943 writer->Write<double>(ptr()->value_[1]);
2821 } 2944 }
2822 2945
2823 2946
2824 #define TYPED_DATA_READ(setter, type) \ 2947 #define TYPED_DATA_READ(setter, type) \
2825 for (intptr_t i = 0; i < length_in_bytes; i += element_size) { \ 2948 for (intptr_t i = 0; i < length_in_bytes; i += element_size) { \
2826 result.Set##setter(i, reader->Read<type>()); \ 2949 result.Set##setter(i, reader->Read<type>()); \
2827 } \ 2950 } \
2828 2951
2829 2952
2830 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader, 2953 RawTypedData* TypedData::ReadFrom(SnapshotReader* reader,
2831 intptr_t object_id, 2954 intptr_t object_id,
2832 intptr_t tags, 2955 intptr_t tags,
2833 Snapshot::Kind kind) { 2956 Snapshot::Kind kind,
2957 bool as_reference) {
2834 ASSERT(reader != NULL); 2958 ASSERT(reader != NULL);
2835 2959
2836 intptr_t cid = RawObject::ClassIdTag::decode(tags); 2960 intptr_t cid = RawObject::ClassIdTag::decode(tags);
2837 intptr_t len = reader->ReadSmiValue(); 2961 intptr_t len = reader->ReadSmiValue();
2838 TypedData& result = TypedData::ZoneHandle(reader->zone(), 2962 TypedData& result = TypedData::ZoneHandle(reader->zone(),
2839 (kind == Snapshot::kFull) ? reader->NewTypedData(cid, len) 2963 (kind == Snapshot::kFull) ? reader->NewTypedData(cid, len)
2840 : TypedData::New(cid, len, HEAP_SPACE(kind))); 2964 : TypedData::New(cid, len, HEAP_SPACE(kind)));
2841 reader->AddBackRef(object_id, &result, kIsDeserialized); 2965 reader->AddBackRef(object_id, &result, kIsDeserialized);
2842 2966
2843 // Setup the array elements. 2967 // Setup the array elements.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2880 UNREACHABLE(); 3004 UNREACHABLE();
2881 } 3005 }
2882 return result.raw(); 3006 return result.raw();
2883 } 3007 }
2884 #undef TYPED_DATA_READ 3008 #undef TYPED_DATA_READ
2885 3009
2886 3010
2887 RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader, 3011 RawExternalTypedData* ExternalTypedData::ReadFrom(SnapshotReader* reader,
2888 intptr_t object_id, 3012 intptr_t object_id,
2889 intptr_t tags, 3013 intptr_t tags,
2890 Snapshot::Kind kind) { 3014 Snapshot::Kind kind,
3015 bool as_reference) {
2891 ASSERT(kind != Snapshot::kFull); 3016 ASSERT(kind != Snapshot::kFull);
2892 intptr_t cid = RawObject::ClassIdTag::decode(tags); 3017 intptr_t cid = RawObject::ClassIdTag::decode(tags);
2893 intptr_t length = reader->ReadSmiValue(); 3018 intptr_t length = reader->ReadSmiValue();
2894 uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue()); 3019 uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue());
2895 ExternalTypedData& obj = ExternalTypedData::ZoneHandle( 3020 ExternalTypedData& obj = ExternalTypedData::ZoneHandle(
2896 ExternalTypedData::New(cid, data, length)); 3021 ExternalTypedData::New(cid, data, length));
2897 reader->AddBackRef(object_id, &obj, kIsDeserialized); 3022 reader->AddBackRef(object_id, &obj, kIsDeserialized);
2898 void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue()); 3023 void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue());
2899 Dart_WeakPersistentHandleFinalizer callback = 3024 Dart_WeakPersistentHandleFinalizer callback =
2900 reinterpret_cast<Dart_WeakPersistentHandleFinalizer>( 3025 reinterpret_cast<Dart_WeakPersistentHandleFinalizer>(
2901 reader->ReadRawPointerValue()); 3026 reader->ReadRawPointerValue());
2902 obj.AddFinalizer(peer, callback); 3027 obj.AddFinalizer(peer, callback);
2903 return obj.raw(); 3028 return obj.raw();
2904 } 3029 }
2905 3030
2906 3031
2907 #define TYPED_DATA_WRITE(type) \ 3032 #define TYPED_DATA_WRITE(type) \
2908 { \ 3033 { \
2909 type* data = reinterpret_cast<type*>(ptr()->data()); \ 3034 type* data = reinterpret_cast<type*>(ptr()->data()); \
2910 for (intptr_t i = 0; i < len; i++) { \ 3035 for (intptr_t i = 0; i < len; i++) { \
2911 writer->Write(data[i]); \ 3036 writer->Write(data[i]); \
2912 } \ 3037 } \
2913 } \ 3038 } \
2914 3039
2915 3040
2916 void RawTypedData::WriteTo(SnapshotWriter* writer, 3041 void RawTypedData::WriteTo(SnapshotWriter* writer,
2917 intptr_t object_id, 3042 intptr_t object_id,
2918 Snapshot::Kind kind) { 3043 Snapshot::Kind kind,
3044 bool as_reference) {
2919 ASSERT(writer != NULL); 3045 ASSERT(writer != NULL);
2920 intptr_t tags = writer->GetObjectTags(this); 3046 intptr_t tags = writer->GetObjectTags(this);
2921 intptr_t cid = ClassIdTag::decode(tags); 3047 intptr_t cid = ClassIdTag::decode(tags);
2922 intptr_t len = Smi::Value(ptr()->length_); 3048 intptr_t len = Smi::Value(ptr()->length_);
2923 3049
2924 // Write out the serialization header value for this object. 3050 // Write out the serialization header value for this object.
2925 writer->WriteInlinedObjectHeader(object_id); 3051 writer->WriteInlinedObjectHeader(object_id);
2926 3052
2927 // Write out the class and tags information. 3053 // Write out the class and tags information.
2928 writer->WriteIndexedObject(cid); 3054 writer->WriteIndexedObject(cid);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 3107
2982 #define EXT_TYPED_DATA_WRITE(cid, type) \ 3108 #define EXT_TYPED_DATA_WRITE(cid, type) \
2983 writer->WriteIndexedObject(cid); \ 3109 writer->WriteIndexedObject(cid); \
2984 writer->WriteTags(RawObject::ClassIdTag::update(cid, tags)); \ 3110 writer->WriteTags(RawObject::ClassIdTag::update(cid, tags)); \
2985 writer->Write<RawObject*>(ptr()->length_); \ 3111 writer->Write<RawObject*>(ptr()->length_); \
2986 TYPED_EXT_DATA_WRITE(type) \ 3112 TYPED_EXT_DATA_WRITE(type) \
2987 3113
2988 3114
2989 void RawExternalTypedData::WriteTo(SnapshotWriter* writer, 3115 void RawExternalTypedData::WriteTo(SnapshotWriter* writer,
2990 intptr_t object_id, 3116 intptr_t object_id,
2991 Snapshot::Kind kind) { 3117 Snapshot::Kind kind,
3118 bool as_reference) {
2992 ASSERT(writer != NULL); 3119 ASSERT(writer != NULL);
2993 intptr_t tags = writer->GetObjectTags(this); 3120 intptr_t tags = writer->GetObjectTags(this);
2994 intptr_t cid = ClassIdTag::decode(tags); 3121 intptr_t cid = ClassIdTag::decode(tags);
2995 intptr_t len = Smi::Value(ptr()->length_); 3122 intptr_t len = Smi::Value(ptr()->length_);
2996 3123
2997 // Write out the serialization header value for this object. 3124 // Write out the serialization header value for this object.
2998 writer->WriteInlinedObjectHeader(object_id); 3125 writer->WriteInlinedObjectHeader(object_id);
2999 3126
3000 switch (cid) { 3127 switch (cid) {
3001 case kExternalTypedDataInt8ArrayCid: 3128 case kExternalTypedDataInt8ArrayCid:
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3035 UNREACHABLE(); 3162 UNREACHABLE();
3036 } 3163 }
3037 } 3164 }
3038 #undef TYPED_DATA_WRITE 3165 #undef TYPED_DATA_WRITE
3039 #undef EXT_TYPED_DATA_WRITE 3166 #undef EXT_TYPED_DATA_WRITE
3040 3167
3041 3168
3042 RawCapability* Capability::ReadFrom(SnapshotReader* reader, 3169 RawCapability* Capability::ReadFrom(SnapshotReader* reader,
3043 intptr_t object_id, 3170 intptr_t object_id,
3044 intptr_t tags, 3171 intptr_t tags,
3045 Snapshot::Kind kind) { 3172 Snapshot::Kind kind,
3173 bool as_reference) {
3046 uint64_t id = reader->Read<uint64_t>(); 3174 uint64_t id = reader->Read<uint64_t>();
3047 3175
3048 Capability& result = Capability::ZoneHandle(reader->zone(), 3176 Capability& result = Capability::ZoneHandle(reader->zone(),
3049 Capability::New(id)); 3177 Capability::New(id));
3050 reader->AddBackRef(object_id, &result, kIsDeserialized); 3178 reader->AddBackRef(object_id, &result, kIsDeserialized);
3051 return result.raw(); 3179 return result.raw();
3052 } 3180 }
3053 3181
3054 3182
3055 void RawCapability::WriteTo(SnapshotWriter* writer, 3183 void RawCapability::WriteTo(SnapshotWriter* writer,
3056 intptr_t object_id, 3184 intptr_t object_id,
3057 Snapshot::Kind kind) { 3185 Snapshot::Kind kind,
3186 bool as_reference) {
3058 // Write out the serialization header value for this object. 3187 // Write out the serialization header value for this object.
3059 writer->WriteInlinedObjectHeader(object_id); 3188 writer->WriteInlinedObjectHeader(object_id);
3060 3189
3061 // Write out the class and tags information. 3190 // Write out the class and tags information.
3062 writer->WriteIndexedObject(kCapabilityCid); 3191 writer->WriteIndexedObject(kCapabilityCid);
3063 writer->WriteTags(writer->GetObjectTags(this)); 3192 writer->WriteTags(writer->GetObjectTags(this));
3064 3193
3065 writer->Write<uint64_t>(ptr()->id_); 3194 writer->Write<uint64_t>(ptr()->id_);
3066 } 3195 }
3067 3196
3068 3197
3069 RawReceivePort* ReceivePort::ReadFrom(SnapshotReader* reader, 3198 RawReceivePort* ReceivePort::ReadFrom(SnapshotReader* reader,
3070 intptr_t object_id, 3199 intptr_t object_id,
3071 intptr_t tags, 3200 intptr_t tags,
3072 Snapshot::Kind kind) { 3201 Snapshot::Kind kind,
3202 bool as_reference) {
3073 UNREACHABLE(); 3203 UNREACHABLE();
3074 return ReceivePort::null(); 3204 return ReceivePort::null();
3075 } 3205 }
3076 3206
3077 3207
3078 void RawReceivePort::WriteTo(SnapshotWriter* writer, 3208 void RawReceivePort::WriteTo(SnapshotWriter* writer,
3079 intptr_t object_id, 3209 intptr_t object_id,
3080 Snapshot::Kind kind) { 3210 Snapshot::Kind kind,
3211 bool as_reference) {
3081 if (kind == Snapshot::kMessage) { 3212 if (kind == Snapshot::kMessage) {
3082 // We do not allow objects with native fields in an isolate message. 3213 // We do not allow objects with native fields in an isolate message.
3083 writer->SetWriteException(Exceptions::kArgument, 3214 writer->SetWriteException(Exceptions::kArgument,
3084 "Illegal argument in isolate message" 3215 "Illegal argument in isolate message"
3085 " : (object is a RawReceivePort)"); 3216 " : (object is a RawReceivePort)");
3086 } else { 3217 } else {
3087 UNREACHABLE(); 3218 UNREACHABLE();
3088 } 3219 }
3089 } 3220 }
3090 3221
3091 3222
3092 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader, 3223 RawSendPort* SendPort::ReadFrom(SnapshotReader* reader,
3093 intptr_t object_id, 3224 intptr_t object_id,
3094 intptr_t tags, 3225 intptr_t tags,
3095 Snapshot::Kind kind) { 3226 Snapshot::Kind kind,
3227 bool as_reference) {
3096 ASSERT(kind == Snapshot::kMessage || reader->snapshot_code()); 3228 ASSERT(kind == Snapshot::kMessage || reader->snapshot_code());
3097 3229
3098 uint64_t id = reader->Read<uint64_t>(); 3230 uint64_t id = reader->Read<uint64_t>();
3099 uint64_t origin_id = reader->Read<uint64_t>(); 3231 uint64_t origin_id = reader->Read<uint64_t>();
3100 3232
3101 SendPort& result = SendPort::ZoneHandle(reader->zone()); 3233 SendPort& result = SendPort::ZoneHandle(reader->zone());
3102 if (reader->snapshot_code()) { 3234 if (reader->snapshot_code()) {
3103 // TODO(rmacnak): Reset fields in precompiled snapshots and assert 3235 // TODO(rmacnak): Reset fields in precompiled snapshots and assert
3104 // this is unreachable. 3236 // this is unreachable.
3105 } else { 3237 } else {
3106 result = SendPort::New(id, origin_id); 3238 result = SendPort::New(id, origin_id);
3107 } 3239 }
3108 reader->AddBackRef(object_id, &result, kIsDeserialized); 3240 reader->AddBackRef(object_id, &result, kIsDeserialized);
3109 return result.raw(); 3241 return result.raw();
3110 } 3242 }
3111 3243
3112 3244
3113 void RawSendPort::WriteTo(SnapshotWriter* writer, 3245 void RawSendPort::WriteTo(SnapshotWriter* writer,
3114 intptr_t object_id, 3246 intptr_t object_id,
3115 Snapshot::Kind kind) { 3247 Snapshot::Kind kind,
3248 bool as_reference) {
3116 // Write out the serialization header value for this object. 3249 // Write out the serialization header value for this object.
3117 writer->WriteInlinedObjectHeader(object_id); 3250 writer->WriteInlinedObjectHeader(object_id);
3118 3251
3119 // Write out the class and tags information. 3252 // Write out the class and tags information.
3120 writer->WriteIndexedObject(kSendPortCid); 3253 writer->WriteIndexedObject(kSendPortCid);
3121 writer->WriteTags(writer->GetObjectTags(this)); 3254 writer->WriteTags(writer->GetObjectTags(this));
3122 3255
3123 writer->Write<uint64_t>(ptr()->id_); 3256 writer->Write<uint64_t>(ptr()->id_);
3124 writer->Write<uint64_t>(ptr()->origin_id_); 3257 writer->Write<uint64_t>(ptr()->origin_id_);
3125 } 3258 }
3126 3259
3127 3260
3128 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader, 3261 RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader,
3129 intptr_t object_id, 3262 intptr_t object_id,
3130 intptr_t tags, 3263 intptr_t tags,
3131 Snapshot::Kind kind) { 3264 Snapshot::Kind kind,
3265 bool as_reference) {
3132 if (kind == Snapshot::kFull) { 3266 if (kind == Snapshot::kFull) {
3133 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(), 3267 Stacktrace& result = Stacktrace::ZoneHandle(reader->zone(),
3134 reader->NewStacktrace()); 3268 reader->NewStacktrace());
3135 reader->AddBackRef(object_id, &result, kIsDeserialized); 3269 reader->AddBackRef(object_id, &result, kIsDeserialized);
3136 3270
3137 bool expand_inlined = reader->Read<bool>(); 3271 bool expand_inlined = reader->Read<bool>();
3138 result.set_expand_inlined(expand_inlined); 3272 result.set_expand_inlined(expand_inlined);
3139 3273
3140 // Set all the object fields. 3274 // Set all the object fields.
3141 READ_OBJECT_FIELDS(result, 3275 READ_OBJECT_FIELDS(result,
3142 result.raw()->from(), result.raw()->to(), 3276 result.raw()->from(), result.raw()->to(),
3143 kAsReference); 3277 kAsReference);
3144 3278
3145 return result.raw(); 3279 return result.raw();
3146 } 3280 }
3147 UNREACHABLE(); // Stacktraces are not sent in a snapshot. 3281 UNREACHABLE(); // Stacktraces are not sent in a snapshot.
3148 return Stacktrace::null(); 3282 return Stacktrace::null();
3149 } 3283 }
3150 3284
3151 3285
3152 void RawStacktrace::WriteTo(SnapshotWriter* writer, 3286 void RawStacktrace::WriteTo(SnapshotWriter* writer,
3153 intptr_t object_id, 3287 intptr_t object_id,
3154 Snapshot::Kind kind) { 3288 Snapshot::Kind kind,
3289 bool as_reference) {
3155 if (kind == Snapshot::kFull) { 3290 if (kind == Snapshot::kFull) {
3156 ASSERT(writer != NULL); 3291 ASSERT(writer != NULL);
3157 ASSERT(this == Isolate::Current()->object_store()-> 3292 ASSERT(this == Isolate::Current()->object_store()->
3158 preallocated_stack_trace()); 3293 preallocated_stack_trace());
3159 3294
3160 // Write out the serialization header value for this object. 3295 // Write out the serialization header value for this object.
3161 writer->WriteInlinedObjectHeader(object_id); 3296 writer->WriteInlinedObjectHeader(object_id);
3162 3297
3163 // Write out the class and tags information. 3298 // Write out the class and tags information.
3164 writer->WriteIndexedObject(kStacktraceCid); 3299 writer->WriteIndexedObject(kStacktraceCid);
3165 writer->WriteTags(writer->GetObjectTags(this)); 3300 writer->WriteTags(writer->GetObjectTags(this));
3166 3301
3167 writer->Write(ptr()->expand_inlined_); 3302 writer->Write(ptr()->expand_inlined_);
3168 3303
3169 // Write out all the object pointer fields. 3304 // Write out all the object pointer fields.
3170 SnapshotWriterVisitor visitor(writer, kAsReference); 3305 SnapshotWriterVisitor visitor(writer, kAsReference);
3171 visitor.VisitPointers(from(), to()); 3306 visitor.VisitPointers(from(), to());
3172 } else { 3307 } else {
3173 // Stacktraces are not allowed in other snapshot forms. 3308 // Stacktraces are not allowed in other snapshot forms.
3174 writer->SetWriteException(Exceptions::kArgument, 3309 writer->SetWriteException(Exceptions::kArgument,
3175 "Illegal argument in isolate message" 3310 "Illegal argument in isolate message"
3176 " : (object is a stacktrace)"); 3311 " : (object is a stacktrace)");
3177 } 3312 }
3178 } 3313 }
3179 3314
3180 3315
3181 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader, 3316 RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader,
3182 intptr_t object_id, 3317 intptr_t object_id,
3183 intptr_t tags, 3318 intptr_t tags,
3184 Snapshot::Kind kind) { 3319 Snapshot::Kind kind,
3320 bool as_reference) {
3185 ASSERT(reader != NULL); 3321 ASSERT(reader != NULL);
3186 ASSERT(kind == Snapshot::kMessage); 3322 ASSERT(kind == Snapshot::kMessage);
3187 3323
3188 // Allocate JSRegExp object. 3324 // Allocate JSRegExp object.
3189 JSRegExp& regex = JSRegExp::ZoneHandle( 3325 JSRegExp& regex = JSRegExp::ZoneHandle(
3190 reader->zone(), JSRegExp::New(HEAP_SPACE(kind))); 3326 reader->zone(), JSRegExp::New(HEAP_SPACE(kind)));
3191 reader->AddBackRef(object_id, &regex, kIsDeserialized); 3327 reader->AddBackRef(object_id, &regex, kIsDeserialized);
3192 3328
3193 // Read and Set all the other fields. 3329 // Read and Set all the other fields.
3194 regex.StoreSmi(&regex.raw_ptr()->num_bracket_expressions_, 3330 regex.StoreSmi(&regex.raw_ptr()->num_bracket_expressions_,
3195 reader->ReadAsSmi()); 3331 reader->ReadAsSmi());
3196 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); 3332 *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
3197 regex.set_pattern(*reader->StringHandle()); 3333 regex.set_pattern(*reader->StringHandle());
3198 regex.StoreNonPointer(&regex.raw_ptr()->num_registers_, 3334 regex.StoreNonPointer(&regex.raw_ptr()->num_registers_,
3199 reader->Read<int32_t>()); 3335 reader->Read<int32_t>());
3200 regex.StoreNonPointer(&regex.raw_ptr()->type_flags_, 3336 regex.StoreNonPointer(&regex.raw_ptr()->type_flags_,
3201 reader->Read<int8_t>()); 3337 reader->Read<int8_t>());
3202 3338
3203 // TODO(18854): Need to implement a way of recreating the irrexp functions. 3339 // TODO(18854): Need to implement a way of recreating the irrexp functions.
3204 return regex.raw(); 3340 return regex.raw();
3205 } 3341 }
3206 3342
3207 3343
3208 void RawJSRegExp::WriteTo(SnapshotWriter* writer, 3344 void RawJSRegExp::WriteTo(SnapshotWriter* writer,
3209 intptr_t object_id, 3345 intptr_t object_id,
3210 Snapshot::Kind kind) { 3346 Snapshot::Kind kind,
3347 bool as_reference) {
3211 ASSERT(writer != NULL); 3348 ASSERT(writer != NULL);
3212 ASSERT(kind == Snapshot::kMessage); 3349 ASSERT(kind == Snapshot::kMessage);
3213 3350
3214 // Write out the serialization header value for this object. 3351 // Write out the serialization header value for this object.
3215 writer->WriteInlinedObjectHeader(object_id); 3352 writer->WriteInlinedObjectHeader(object_id);
3216 3353
3217 // Write out the class and tags information. 3354 // Write out the class and tags information.
3218 writer->WriteIndexedObject(kJSRegExpCid); 3355 writer->WriteIndexedObject(kJSRegExpCid);
3219 writer->WriteTags(writer->GetObjectTags(this)); 3356 writer->WriteTags(writer->GetObjectTags(this));
3220 3357
3221 // Write out all the other fields. 3358 // Write out all the other fields.
3222 writer->Write<RawObject*>(ptr()->num_bracket_expressions_); 3359 writer->Write<RawObject*>(ptr()->num_bracket_expressions_);
3223 writer->WriteObjectImpl(ptr()->pattern_, kAsInlinedObject); 3360 writer->WriteObjectImpl(ptr()->pattern_, kAsInlinedObject);
3224 writer->Write<int32_t>(ptr()->num_registers_); 3361 writer->Write<int32_t>(ptr()->num_registers_);
3225 writer->Write<int8_t>(ptr()->type_flags_); 3362 writer->Write<int8_t>(ptr()->type_flags_);
3226 } 3363 }
3227 3364
3228 3365
3229 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, 3366 RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader,
3230 intptr_t object_id, 3367 intptr_t object_id,
3231 intptr_t tags, 3368 intptr_t tags,
3232 Snapshot::Kind kind) { 3369 Snapshot::Kind kind,
3370 bool as_reference) {
3233 ASSERT(reader != NULL); 3371 ASSERT(reader != NULL);
3234 3372
3235 // Allocate the weak property object. 3373 // Allocate the weak property object.
3236 WeakProperty& weak_property = WeakProperty::ZoneHandle( 3374 WeakProperty& weak_property = WeakProperty::ZoneHandle(
3237 reader->zone(), WeakProperty::New(HEAP_SPACE(kind))); 3375 reader->zone(), WeakProperty::New(HEAP_SPACE(kind)));
3238 reader->AddBackRef(object_id, &weak_property, kIsDeserialized); 3376 reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
3239 3377
3240 // Set all the object fields. 3378 // Set all the object fields.
3241 READ_OBJECT_FIELDS(weak_property, 3379 READ_OBJECT_FIELDS(weak_property,
3242 weak_property.raw()->from(), weak_property.raw()->to(), 3380 weak_property.raw()->from(), weak_property.raw()->to(),
3243 kAsReference); 3381 kAsReference);
3244 3382
3245 return weak_property.raw(); 3383 return weak_property.raw();
3246 } 3384 }
3247 3385
3248 3386
3249 void RawWeakProperty::WriteTo(SnapshotWriter* writer, 3387 void RawWeakProperty::WriteTo(SnapshotWriter* writer,
3250 intptr_t object_id, 3388 intptr_t object_id,
3251 Snapshot::Kind kind) { 3389 Snapshot::Kind kind,
3390 bool as_reference) {
3252 ASSERT(writer != NULL); 3391 ASSERT(writer != NULL);
3253 3392
3254 // Write out the serialization header value for this object. 3393 // Write out the serialization header value for this object.
3255 writer->WriteInlinedObjectHeader(object_id); 3394 writer->WriteInlinedObjectHeader(object_id);
3256 3395
3257 // Write out the class and tags information. 3396 // Write out the class and tags information.
3258 writer->WriteIndexedObject(kWeakPropertyCid); 3397 writer->WriteIndexedObject(kWeakPropertyCid);
3259 writer->WriteTags(writer->GetObjectTags(this)); 3398 writer->WriteTags(writer->GetObjectTags(this));
3260 3399
3261 // Write out all the object pointer fields. 3400 // Write out all the object pointer fields.
3262 SnapshotWriterVisitor visitor(writer, kAsReference); 3401 SnapshotWriterVisitor visitor(writer, kAsReference);
3263 visitor.VisitPointers(from(), to()); 3402 visitor.VisitPointers(from(), to());
3264 } 3403 }
3265 3404
3266 3405
3267 RawMirrorReference* MirrorReference::ReadFrom(SnapshotReader* reader, 3406 RawMirrorReference* MirrorReference::ReadFrom(SnapshotReader* reader,
3268 intptr_t object_id, 3407 intptr_t object_id,
3269 intptr_t tags, 3408 intptr_t tags,
3270 Snapshot::Kind kind) { 3409 Snapshot::Kind kind,
3410 bool as_referenec) {
3271 UNREACHABLE(); 3411 UNREACHABLE();
3272 return MirrorReference::null(); 3412 return MirrorReference::null();
3273 } 3413 }
3274 3414
3275 3415
3276 void RawMirrorReference::WriteTo(SnapshotWriter* writer, 3416 void RawMirrorReference::WriteTo(SnapshotWriter* writer,
3277 intptr_t object_id, 3417 intptr_t object_id,
3278 Snapshot::Kind kind) { 3418 Snapshot::Kind kind,
3419 bool as_reference) {
3279 if (kind == Snapshot::kMessage) { 3420 if (kind == Snapshot::kMessage) {
3280 // We do not allow objects with native fields in an isolate message. 3421 // We do not allow objects with native fields in an isolate message.
3281 writer->SetWriteException(Exceptions::kArgument, 3422 writer->SetWriteException(Exceptions::kArgument,
3282 "Illegal argument in isolate message" 3423 "Illegal argument in isolate message"
3283 " : (object is a MirrorReference)"); 3424 " : (object is a MirrorReference)");
3284 } else { 3425 } else {
3285 UNREACHABLE(); 3426 UNREACHABLE();
3286 } 3427 }
3287 } 3428 }
3288 3429
3289 3430
3290 RawUserTag* UserTag::ReadFrom(SnapshotReader* reader, 3431 RawUserTag* UserTag::ReadFrom(SnapshotReader* reader,
3291 intptr_t object_id, 3432 intptr_t object_id,
3292 intptr_t tags, 3433 intptr_t tags,
3293 Snapshot::Kind kind) { 3434 Snapshot::Kind kind,
3435 bool as_reference) {
3294 UNREACHABLE(); 3436 UNREACHABLE();
3295 return UserTag::null(); 3437 return UserTag::null();
3296 } 3438 }
3297 3439
3298 3440
3299 void RawUserTag::WriteTo(SnapshotWriter* writer, 3441 void RawUserTag::WriteTo(SnapshotWriter* writer,
3300 intptr_t object_id, 3442 intptr_t object_id,
3301 Snapshot::Kind kind) { 3443 Snapshot::Kind kind,
3444 bool as_reference) {
3302 if (kind == Snapshot::kMessage) { 3445 if (kind == Snapshot::kMessage) {
3303 // We do not allow objects with native fields in an isolate message. 3446 // We do not allow objects with native fields in an isolate message.
3304 writer->SetWriteException(Exceptions::kArgument, 3447 writer->SetWriteException(Exceptions::kArgument,
3305 "Illegal argument in isolate message" 3448 "Illegal argument in isolate message"
3306 " : (object is a UserTag)"); 3449 " : (object is a UserTag)");
3307 } else { 3450 } else {
3308 UNREACHABLE(); 3451 UNREACHABLE();
3309 } 3452 }
3310 } 3453 }
3311 3454
3312 } // namespace dart 3455 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698