| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/bigint_operations.h" | 5 #include "vm/bigint_operations.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/visitor.h" | 9 #include "vm/visitor.h" |
| 10 | 10 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) { | 34 (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) { |
| 35 // Read in the base information. | 35 // Read in the base information. |
| 36 ObjectKind object_kind = reader->Read<ObjectKind>(); | 36 ObjectKind object_kind = reader->Read<ObjectKind>(); |
| 37 | 37 |
| 38 // Allocate class object of specified kind. | 38 // Allocate class object of specified kind. |
| 39 if (kind == Snapshot::kFull) { | 39 if (kind == Snapshot::kFull) { |
| 40 cls = reader->NewClass(object_kind); | 40 cls = reader->NewClass(object_kind); |
| 41 } else { | 41 } else { |
| 42 cls = Class::GetClass(object_kind); | 42 cls = Class::GetClass(object_kind); |
| 43 } | 43 } |
| 44 reader->AddBackwardReference(object_id, &cls); | 44 reader->AddBackwardReference(object_id, &cls, true); |
| 45 | 45 |
| 46 // Set the object tags. | 46 // Set the object tags. |
| 47 cls.set_tags(tags); | 47 cls.set_tags(tags); |
| 48 | 48 |
| 49 // Set all non object fields. | 49 // Set all non object fields. |
| 50 cls.set_instance_size(reader->ReadIntptrValue()); | 50 cls.set_instance_size(reader->ReadIntptrValue()); |
| 51 cls.set_type_arguments_instance_field_offset(reader->ReadIntptrValue()); | 51 cls.set_type_arguments_instance_field_offset(reader->ReadIntptrValue()); |
| 52 cls.set_next_field_offset(reader->ReadIntptrValue()); | 52 cls.set_next_field_offset(reader->ReadIntptrValue()); |
| 53 cls.set_num_native_fields(reader->ReadIntptrValue()); | 53 cls.set_num_native_fields(reader->ReadIntptrValue()); |
| 54 cls.set_token_index(reader->ReadIntptrValue()); | 54 cls.set_token_index(reader->ReadIntptrValue()); |
| 55 cls.set_class_state(reader->Read<int8_t>()); | 55 cls.set_class_state(reader->Read<int8_t>()); |
| 56 if (reader->Read<bool>()) { | 56 if (reader->Read<bool>()) { |
| 57 cls.set_is_const(); | 57 cls.set_is_const(); |
| 58 } | 58 } |
| 59 if (reader->Read<bool>()) { | 59 if (reader->Read<bool>()) { |
| 60 cls.set_is_interface(); | 60 cls.set_is_interface(); |
| 61 } | 61 } |
| 62 | 62 |
| 63 // Set all the object fields. | 63 // Set all the object fields. |
| 64 // TODO(5411462): Need to assert No GC can happen here, even though | 64 // TODO(5411462): Need to assert No GC can happen here, even though |
| 65 // allocations may happen. | 65 // allocations may happen. |
| 66 intptr_t num_flds = (cls.raw()->to() - cls.raw()->from()); | 66 intptr_t num_flds = (cls.raw()->to() - cls.raw()->from()); |
| 67 for (intptr_t i = 0; i <= num_flds; i++) { | 67 for (intptr_t i = 0; i <= num_flds; i++) { |
| 68 *(cls.raw()->from() + i) = reader->ReadObject(); | 68 *(cls.raw()->from() + i) = reader->ReadObjectRef(); |
| 69 } | 69 } |
| 70 } else { | 70 } else { |
| 71 cls ^= reader->ReadClassId(object_id); | 71 cls ^= reader->ReadClassId(object_id); |
| 72 } | 72 } |
| 73 return cls.raw(); | 73 return cls.raw(); |
| 74 } | 74 } |
| 75 | 75 |
| 76 | 76 |
| 77 void RawClass::WriteTo(SnapshotWriter* writer, | 77 void RawClass::WriteTo(SnapshotWriter* writer, |
| 78 intptr_t object_id, | 78 intptr_t object_id, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 | 111 |
| 112 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader, | 112 RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader, |
| 113 intptr_t object_id, | 113 intptr_t object_id, |
| 114 intptr_t tags, | 114 intptr_t tags, |
| 115 Snapshot::Kind kind) { | 115 Snapshot::Kind kind) { |
| 116 ASSERT(reader != NULL); | 116 ASSERT(reader != NULL); |
| 117 | 117 |
| 118 // Allocate parameterized type object. | 118 // Allocate parameterized type object. |
| 119 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( | 119 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( |
| 120 reader->isolate(), NEW_OBJECT(UnresolvedClass)); | 120 reader->isolate(), NEW_OBJECT(UnresolvedClass)); |
| 121 reader->AddBackwardReference(object_id, &unresolved_class); | 121 reader->AddBackwardReference(object_id, &unresolved_class, true); |
| 122 | 122 |
| 123 // Set the object tags. | 123 // Set the object tags. |
| 124 unresolved_class.set_tags(tags); | 124 unresolved_class.set_tags(tags); |
| 125 | 125 |
| 126 // Set all non object fields. | 126 // Set all non object fields. |
| 127 unresolved_class.set_token_index(reader->ReadIntptrValue()); | 127 unresolved_class.set_token_index(reader->ReadIntptrValue()); |
| 128 | 128 |
| 129 // Set all the object fields. | 129 // Set all the object fields. |
| 130 // TODO(5411462): Need to assert No GC can happen here, even though | 130 // TODO(5411462): Need to assert No GC can happen here, even though |
| 131 // allocations may happen. | 131 // allocations may happen. |
| 132 intptr_t num_flds = (unresolved_class.raw()->to() - | 132 intptr_t num_flds = (unresolved_class.raw()->to() - |
| 133 unresolved_class.raw()->from()); | 133 unresolved_class.raw()->from()); |
| 134 for (intptr_t i = 0; i <= num_flds; i++) { | 134 for (intptr_t i = 0; i <= num_flds; i++) { |
| 135 *(unresolved_class.raw()->from() + i) = reader->ReadObject(); | 135 *(unresolved_class.raw()->from() + i) = reader->ReadObjectRef(); |
| 136 } | 136 } |
| 137 return unresolved_class.raw(); | 137 return unresolved_class.raw(); |
| 138 } | 138 } |
| 139 | 139 |
| 140 | 140 |
| 141 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, | 141 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, |
| 142 intptr_t object_id, | 142 intptr_t object_id, |
| 143 Snapshot::Kind kind) { | 143 Snapshot::Kind kind) { |
| 144 ASSERT(writer != NULL); | 144 ASSERT(writer != NULL); |
| 145 | 145 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 | 177 |
| 178 RawType* Type::ReadFrom(SnapshotReader* reader, | 178 RawType* Type::ReadFrom(SnapshotReader* reader, |
| 179 intptr_t object_id, | 179 intptr_t object_id, |
| 180 intptr_t tags, | 180 intptr_t tags, |
| 181 Snapshot::Kind kind) { | 181 Snapshot::Kind kind) { |
| 182 ASSERT(reader != NULL); | 182 ASSERT(reader != NULL); |
| 183 | 183 |
| 184 // Allocate parameterized type object. | 184 // Allocate parameterized type object. |
| 185 Type& parameterized_type = Type::ZoneHandle( | 185 Type& parameterized_type = Type::ZoneHandle( |
| 186 reader->isolate(), NEW_OBJECT(Type)); | 186 reader->isolate(), NEW_OBJECT(Type)); |
| 187 reader->AddBackwardReference(object_id, ¶meterized_type); | 187 reader->AddBackwardReference(object_id, ¶meterized_type, true); |
| 188 | 188 |
| 189 // Set the object tags. | 189 // Set the object tags. |
| 190 parameterized_type.set_tags(tags); | 190 parameterized_type.set_tags(tags); |
| 191 | 191 |
| 192 // Set all non object fields. | 192 // Set all non object fields. |
| 193 parameterized_type.set_token_index(reader->ReadIntptrValue()); | 193 parameterized_type.set_token_index(reader->ReadIntptrValue()); |
| 194 parameterized_type.set_type_state(reader->Read<int8_t>()); | 194 parameterized_type.set_type_state(reader->Read<int8_t>()); |
| 195 | 195 |
| 196 // Set all the object fields. | 196 // Set all the object fields. |
| 197 // TODO(5411462): Need to assert No GC can happen here, even though | 197 // TODO(5411462): Need to assert No GC can happen here, even though |
| 198 // allocations may happen. | 198 // allocations may happen. |
| 199 intptr_t num_flds = (parameterized_type.raw()->to() - | 199 intptr_t num_flds = (parameterized_type.raw()->to() - |
| 200 parameterized_type.raw()->from()); | 200 parameterized_type.raw()->from()); |
| 201 for (intptr_t i = 0; i <= num_flds; i++) { | 201 for (intptr_t i = 0; i <= num_flds; i++) { |
| 202 *(parameterized_type.raw()->from() + i) = reader->ReadObject(); | 202 *(parameterized_type.raw()->from() + i) = reader->ReadObjectImpl(); |
| 203 } | 203 } |
| 204 | 204 |
| 205 // If object needs to be a canonical object, Canonicalize it. | 205 // If object needs to be a canonical object, Canonicalize it. |
| 206 if ((kind != Snapshot::kFull) && parameterized_type.IsCanonical()) { | 206 if ((kind != Snapshot::kFull) && parameterized_type.IsCanonical()) { |
| 207 parameterized_type ^= parameterized_type.Canonicalize(); | 207 parameterized_type ^= parameterized_type.Canonicalize(); |
| 208 } | 208 } |
| 209 return parameterized_type.raw(); | 209 return parameterized_type.raw(); |
| 210 } | 210 } |
| 211 | 211 |
| 212 | 212 |
| 213 void RawType::WriteTo(SnapshotWriter* writer, | 213 void RawType::WriteTo(SnapshotWriter* writer, |
| 214 intptr_t object_id, | 214 intptr_t object_id, |
| 215 Snapshot::Kind kind) { | 215 Snapshot::Kind kind) { |
| 216 ASSERT(writer != NULL); | 216 ASSERT(writer != NULL); |
| 217 | 217 |
| 218 // Write out the serialization header value for this object. | 218 // Write out the serialization header value for this object. |
| 219 writer->WriteSerializationMarker(kInlined, object_id); | 219 writer->WriteSerializationMarker(kInlined, object_id); |
| 220 | 220 |
| 221 // Write out the class and tags information. | 221 // Write out the class and tags information. |
| 222 writer->WriteObjectHeader(Object::kTypeClass, writer->GetObjectTags(this)); | 222 writer->WriteObjectHeader(Object::kTypeClass, writer->GetObjectTags(this)); |
| 223 | 223 |
| 224 // Write out all the non object pointer fields. | 224 // Write out all the non object pointer fields. |
| 225 writer->WriteIntptrValue(ptr()->token_index_); | 225 writer->WriteIntptrValue(ptr()->token_index_); |
| 226 writer->Write<int8_t>(ptr()->type_state_); | 226 writer->Write<int8_t>(ptr()->type_state_); |
| 227 | 227 |
| 228 // Write out all the object pointer fields. | 228 // Write out all the object pointer fields. |
| 229 SnapshotWriterVisitor visitor(writer); | 229 SnapshotWriterVisitor visitor(writer, false); |
| 230 visitor.VisitPointers(from(), to()); | 230 visitor.VisitPointers(from(), to()); |
| 231 } | 231 } |
| 232 | 232 |
| 233 | 233 |
| 234 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader, | 234 RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader, |
| 235 intptr_t object_id, | 235 intptr_t object_id, |
| 236 intptr_t tags, | 236 intptr_t tags, |
| 237 Snapshot::Kind kind) { | 237 Snapshot::Kind kind) { |
| 238 ASSERT(reader != NULL); | 238 ASSERT(reader != NULL); |
| 239 | 239 |
| 240 // Allocate type parameter object. | 240 // Allocate type parameter object. |
| 241 TypeParameter& type_parameter = TypeParameter::ZoneHandle( | 241 TypeParameter& type_parameter = TypeParameter::ZoneHandle( |
| 242 reader->isolate(), NEW_OBJECT(TypeParameter)); | 242 reader->isolate(), NEW_OBJECT(TypeParameter)); |
| 243 reader->AddBackwardReference(object_id, &type_parameter); | 243 reader->AddBackwardReference(object_id, &type_parameter, true); |
| 244 | 244 |
| 245 // Set the object tags. | 245 // Set the object tags. |
| 246 type_parameter.set_tags(tags); | 246 type_parameter.set_tags(tags); |
| 247 | 247 |
| 248 // Set all non object fields. | 248 // Set all non object fields. |
| 249 type_parameter.set_index(reader->ReadIntptrValue()); | 249 type_parameter.set_index(reader->ReadIntptrValue()); |
| 250 type_parameter.set_token_index(reader->ReadIntptrValue()); | 250 type_parameter.set_token_index(reader->ReadIntptrValue()); |
| 251 type_parameter.set_type_state(reader->Read<int8_t>()); | 251 type_parameter.set_type_state(reader->Read<int8_t>()); |
| 252 | 252 |
| 253 // Set all the object fields. | 253 // Set all the object fields. |
| 254 // TODO(5411462): Need to assert No GC can happen here, even though | 254 // TODO(5411462): Need to assert No GC can happen here, even though |
| 255 // allocations may happen. | 255 // allocations may happen. |
| 256 intptr_t num_flds = (type_parameter.raw()->to() - | 256 intptr_t num_flds = (type_parameter.raw()->to() - |
| 257 type_parameter.raw()->from()); | 257 type_parameter.raw()->from()); |
| 258 for (intptr_t i = 0; i <= num_flds; i++) { | 258 for (intptr_t i = 0; i <= num_flds; i++) { |
| 259 *(type_parameter.raw()->from() + i) = reader->ReadObject(); | 259 *(type_parameter.raw()->from() + i) = reader->ReadObjectImpl(); |
| 260 } | 260 } |
| 261 | 261 |
| 262 return type_parameter.raw(); | 262 return type_parameter.raw(); |
| 263 } | 263 } |
| 264 | 264 |
| 265 | 265 |
| 266 void RawTypeParameter::WriteTo(SnapshotWriter* writer, | 266 void RawTypeParameter::WriteTo(SnapshotWriter* writer, |
| 267 intptr_t object_id, | 267 intptr_t object_id, |
| 268 Snapshot::Kind kind) { | 268 Snapshot::Kind kind) { |
| 269 ASSERT(writer != NULL); | 269 ASSERT(writer != NULL); |
| 270 | 270 |
| 271 // Write out the serialization header value for this object. | 271 // Write out the serialization header value for this object. |
| 272 writer->WriteSerializationMarker(kInlined, object_id); | 272 writer->WriteSerializationMarker(kInlined, object_id); |
| 273 | 273 |
| 274 // Write out the class and tags information. | 274 // Write out the class and tags information. |
| 275 writer->WriteObjectHeader(Object::kTypeParameterClass, | 275 writer->WriteObjectHeader(Object::kTypeParameterClass, |
| 276 writer->GetObjectTags(this)); | 276 writer->GetObjectTags(this)); |
| 277 | 277 |
| 278 // Write out all the non object pointer fields. | 278 // Write out all the non object pointer fields. |
| 279 writer->WriteIntptrValue(ptr()->index_); | 279 writer->WriteIntptrValue(ptr()->index_); |
| 280 writer->WriteIntptrValue(ptr()->token_index_); | 280 writer->WriteIntptrValue(ptr()->token_index_); |
| 281 writer->Write<int8_t>(ptr()->type_state_); | 281 writer->Write<int8_t>(ptr()->type_state_); |
| 282 | 282 |
| 283 // Write out all the object pointer fields. | 283 // Write out all the object pointer fields. |
| 284 SnapshotWriterVisitor visitor(writer); | 284 SnapshotWriterVisitor visitor(writer, false); |
| 285 visitor.VisitPointers(from(), to()); | 285 visitor.VisitPointers(from(), to()); |
| 286 } | 286 } |
| 287 | 287 |
| 288 | 288 |
| 289 RawAbstractTypeArguments* AbstractTypeArguments::ReadFrom( | 289 RawAbstractTypeArguments* AbstractTypeArguments::ReadFrom( |
| 290 SnapshotReader* reader, | 290 SnapshotReader* reader, |
| 291 intptr_t object_id, | 291 intptr_t object_id, |
| 292 intptr_t tags, | 292 intptr_t tags, |
| 293 Snapshot::Kind kind) { | 293 Snapshot::Kind kind) { |
| 294 UNREACHABLE(); // AbstractTypeArguments is an abstract class. | 294 UNREACHABLE(); // AbstractTypeArguments is an abstract class. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 307 intptr_t object_id, | 307 intptr_t object_id, |
| 308 intptr_t tags, | 308 intptr_t tags, |
| 309 Snapshot::Kind kind) { | 309 Snapshot::Kind kind) { |
| 310 ASSERT(reader != NULL); | 310 ASSERT(reader != NULL); |
| 311 | 311 |
| 312 // Read the length so that we can determine instance size to allocate. | 312 // Read the length so that we can determine instance size to allocate. |
| 313 intptr_t len = reader->ReadSmiValue(); | 313 intptr_t len = reader->ReadSmiValue(); |
| 314 | 314 |
| 315 TypeArguments& type_arguments = TypeArguments::ZoneHandle( | 315 TypeArguments& type_arguments = TypeArguments::ZoneHandle( |
| 316 reader->isolate(), NEW_OBJECT_WITH_LEN(TypeArguments, len)); | 316 reader->isolate(), NEW_OBJECT_WITH_LEN(TypeArguments, len)); |
| 317 reader->AddBackwardReference(object_id, &type_arguments); | 317 reader->AddBackwardReference(object_id, &type_arguments, true); |
| 318 | 318 |
| 319 // Now set all the object fields. | 319 // Now set all the object fields. |
| 320 for (intptr_t i = 0; i < len; i++) { | 320 for (intptr_t i = 0; i < len; i++) { |
| 321 *reader->TypeHandle() ^= reader->ReadObject(); | 321 *reader->TypeHandle() ^= reader->ReadObjectImpl(); |
| 322 type_arguments.SetTypeAt(i, *reader->TypeHandle()); | 322 type_arguments.SetTypeAt(i, *reader->TypeHandle()); |
| 323 } | 323 } |
| 324 | 324 |
| 325 // Set the object tags (This is done after setting the object fields | 325 // Set the object tags (This is done after setting the object fields |
| 326 // because 'SetTypeAt' has an assertion to check if the object is not | 326 // because 'SetTypeAt' has an assertion to check if the object is not |
| 327 // already canonical). | 327 // already canonical). |
| 328 type_arguments.set_tags(tags); | 328 type_arguments.set_tags(tags); |
| 329 | 329 |
| 330 // If object needs to be a canonical object, Canonicalize it. | 330 // If object needs to be a canonical object, Canonicalize it. |
| 331 if ((kind != Snapshot::kFull) && type_arguments.IsCanonical()) { | 331 if ((kind != Snapshot::kFull) && type_arguments.IsCanonical()) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 346 // Write out the class and tags information. | 346 // Write out the class and tags information. |
| 347 writer->WriteObjectHeader(Object::kTypeArgumentsClass, | 347 writer->WriteObjectHeader(Object::kTypeArgumentsClass, |
| 348 writer->GetObjectTags(this)); | 348 writer->GetObjectTags(this)); |
| 349 | 349 |
| 350 // Write out the length field. | 350 // Write out the length field. |
| 351 writer->Write<RawObject*>(ptr()->length_); | 351 writer->Write<RawObject*>(ptr()->length_); |
| 352 | 352 |
| 353 // Write out the individual types. | 353 // Write out the individual types. |
| 354 intptr_t len = Smi::Value(ptr()->length_); | 354 intptr_t len = Smi::Value(ptr()->length_); |
| 355 for (intptr_t i = 0; i < len; i++) { | 355 for (intptr_t i = 0; i < len; i++) { |
| 356 writer->WriteObject(ptr()->types_[i]); | 356 writer->WriteObjectImpl(ptr()->types_[i]); |
| 357 } | 357 } |
| 358 } | 358 } |
| 359 | 359 |
| 360 | 360 |
| 361 RawInstantiatedTypeArguments* InstantiatedTypeArguments::ReadFrom( | 361 RawInstantiatedTypeArguments* InstantiatedTypeArguments::ReadFrom( |
| 362 SnapshotReader* reader, | 362 SnapshotReader* reader, |
| 363 intptr_t object_id, | 363 intptr_t object_id, |
| 364 intptr_t tags, | 364 intptr_t tags, |
| 365 Snapshot::Kind kind) { | 365 Snapshot::Kind kind) { |
| 366 ASSERT(reader != NULL); | 366 ASSERT(reader != NULL); |
| 367 ASSERT(kind == Snapshot::kMessage); | 367 ASSERT(kind == Snapshot::kMessage); |
| 368 | 368 |
| 369 // Allocate instantiated types object. | 369 // Allocate instantiated types object. |
| 370 InstantiatedTypeArguments& instantiated_type_arguments = | 370 InstantiatedTypeArguments& instantiated_type_arguments = |
| 371 InstantiatedTypeArguments::ZoneHandle(reader->isolate(), | 371 InstantiatedTypeArguments::ZoneHandle(reader->isolate(), |
| 372 InstantiatedTypeArguments::New()); | 372 InstantiatedTypeArguments::New()); |
| 373 reader->AddBackwardReference(object_id, &instantiated_type_arguments); | 373 reader->AddBackwardReference(object_id, &instantiated_type_arguments, true); |
| 374 | 374 |
| 375 // Set the object tags. | 375 // Set the object tags. |
| 376 instantiated_type_arguments.set_tags(tags); | 376 instantiated_type_arguments.set_tags(tags); |
| 377 | 377 |
| 378 // Set all the object fields. | 378 // Set all the object fields. |
| 379 // TODO(5411462): Need to assert No GC can happen here, even though | 379 // TODO(5411462): Need to assert No GC can happen here, even though |
| 380 // allocations may happen. | 380 // allocations may happen. |
| 381 intptr_t num_flds = (instantiated_type_arguments.raw()->to() - | 381 intptr_t num_flds = (instantiated_type_arguments.raw()->to() - |
| 382 instantiated_type_arguments.raw()->from()); | 382 instantiated_type_arguments.raw()->from()); |
| 383 for (intptr_t i = 0; i <= num_flds; i++) { | 383 for (intptr_t i = 0; i <= num_flds; i++) { |
| 384 *(instantiated_type_arguments.raw()->from() + i) = reader->ReadObject(); | 384 *(instantiated_type_arguments.raw()->from() + i) = reader->ReadObjectImpl(); |
| 385 } | 385 } |
| 386 return instantiated_type_arguments.raw(); | 386 return instantiated_type_arguments.raw(); |
| 387 } | 387 } |
| 388 | 388 |
| 389 | 389 |
| 390 void RawInstantiatedTypeArguments::WriteTo(SnapshotWriter* writer, | 390 void RawInstantiatedTypeArguments::WriteTo(SnapshotWriter* writer, |
| 391 intptr_t object_id, | 391 intptr_t object_id, |
| 392 Snapshot::Kind kind) { | 392 Snapshot::Kind kind) { |
| 393 ASSERT(writer != NULL); | 393 ASSERT(writer != NULL); |
| 394 ASSERT(kind == Snapshot::kMessage); | 394 ASSERT(kind == Snapshot::kMessage); |
| 395 | 395 |
| 396 // Write out the serialization header value for this object. | 396 // Write out the serialization header value for this object. |
| 397 writer->WriteSerializationMarker(kInlined, object_id); | 397 writer->WriteSerializationMarker(kInlined, object_id); |
| 398 | 398 |
| 399 // Write out the class and tags information. | 399 // Write out the class and tags information. |
| 400 writer->WriteObjectHeader(Object::kInstantiatedTypeArgumentsClass, | 400 writer->WriteObjectHeader(Object::kInstantiatedTypeArgumentsClass, |
| 401 writer->GetObjectTags(this)); | 401 writer->GetObjectTags(this)); |
| 402 | 402 |
| 403 // Write out all the object pointer fields. | 403 // Write out all the object pointer fields. |
| 404 SnapshotWriterVisitor visitor(writer); | 404 SnapshotWriterVisitor visitor(writer, false); |
| 405 visitor.VisitPointers(from(), to()); | 405 visitor.VisitPointers(from(), to()); |
| 406 } | 406 } |
| 407 | 407 |
| 408 | 408 |
| 409 RawFunction* Function::ReadFrom(SnapshotReader* reader, | 409 RawFunction* Function::ReadFrom(SnapshotReader* reader, |
| 410 intptr_t object_id, | 410 intptr_t object_id, |
| 411 intptr_t tags, | 411 intptr_t tags, |
| 412 Snapshot::Kind kind) { | 412 Snapshot::Kind kind) { |
| 413 ASSERT(reader != NULL); | 413 ASSERT(reader != NULL); |
| 414 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); | 414 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); |
| 415 | 415 |
| 416 // Allocate function object. | 416 // Allocate function object. |
| 417 Function& func = Function::ZoneHandle( | 417 Function& func = Function::ZoneHandle( |
| 418 reader->isolate(), NEW_OBJECT(Function)); | 418 reader->isolate(), NEW_OBJECT(Function)); |
| 419 reader->AddBackwardReference(object_id, &func); | 419 reader->AddBackwardReference(object_id, &func, true); |
| 420 | 420 |
| 421 // Set the object tags. | 421 // Set the object tags. |
| 422 func.set_tags(tags); | 422 func.set_tags(tags); |
| 423 | 423 |
| 424 // Set all the non object fields. | 424 // Set all the non object fields. |
| 425 func.set_token_index(reader->ReadIntptrValue()); | 425 func.set_token_index(reader->ReadIntptrValue()); |
| 426 func.set_end_token_index(reader->ReadIntptrValue()); | 426 func.set_end_token_index(reader->ReadIntptrValue()); |
| 427 func.set_num_fixed_parameters(reader->ReadIntptrValue()); | 427 func.set_num_fixed_parameters(reader->ReadIntptrValue()); |
| 428 func.set_num_optional_parameters(reader->ReadIntptrValue()); | 428 func.set_num_optional_parameters(reader->ReadIntptrValue()); |
| 429 func.set_usage_counter(reader->ReadIntptrValue()); | 429 func.set_usage_counter(reader->ReadIntptrValue()); |
| 430 func.set_deoptimization_counter(reader->ReadIntptrValue()); | 430 func.set_deoptimization_counter(reader->ReadIntptrValue()); |
| 431 func.set_kind(static_cast<RawFunction::Kind >(reader->ReadIntptrValue())); | 431 func.set_kind(static_cast<RawFunction::Kind >(reader->ReadIntptrValue())); |
| 432 func.set_is_static(reader->Read<bool>()); | 432 func.set_is_static(reader->Read<bool>()); |
| 433 func.set_is_const(reader->Read<bool>()); | 433 func.set_is_const(reader->Read<bool>()); |
| 434 func.set_is_optimizable(reader->Read<bool>()); | 434 func.set_is_optimizable(reader->Read<bool>()); |
| 435 | 435 |
| 436 // Set all the object fields. | 436 // Set all the object fields. |
| 437 // TODO(5411462): Need to assert No GC can happen here, even though | 437 // TODO(5411462): Need to assert No GC can happen here, even though |
| 438 // allocations may happen. | 438 // allocations may happen. |
| 439 intptr_t num_flds = (func.raw()->to() - func.raw()->from()); | 439 intptr_t num_flds = (func.raw()->to() - func.raw()->from()); |
| 440 for (intptr_t i = 0; i <= num_flds; i++) { | 440 for (intptr_t i = 0; i <= num_flds; i++) { |
| 441 *(func.raw()->from() + i) = reader->ReadObject(); | 441 *(func.raw()->from() + i) = reader->ReadObjectRef(); |
| 442 } | 442 } |
| 443 | 443 |
| 444 return func.raw(); | 444 return func.raw(); |
| 445 } | 445 } |
| 446 | 446 |
| 447 | 447 |
| 448 void RawFunction::WriteTo(SnapshotWriter* writer, | 448 void RawFunction::WriteTo(SnapshotWriter* writer, |
| 449 intptr_t object_id, | 449 intptr_t object_id, |
| 450 Snapshot::Kind kind) { | 450 Snapshot::Kind kind) { |
| 451 ASSERT(writer != NULL); | 451 ASSERT(writer != NULL); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 479 | 479 |
| 480 RawField* Field::ReadFrom(SnapshotReader* reader, | 480 RawField* Field::ReadFrom(SnapshotReader* reader, |
| 481 intptr_t object_id, | 481 intptr_t object_id, |
| 482 intptr_t tags, | 482 intptr_t tags, |
| 483 Snapshot::Kind kind) { | 483 Snapshot::Kind kind) { |
| 484 ASSERT(reader != NULL); | 484 ASSERT(reader != NULL); |
| 485 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); | 485 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); |
| 486 | 486 |
| 487 // Allocate field object. | 487 // Allocate field object. |
| 488 Field& field = Field::ZoneHandle(reader->isolate(), NEW_OBJECT(Field)); | 488 Field& field = Field::ZoneHandle(reader->isolate(), NEW_OBJECT(Field)); |
| 489 reader->AddBackwardReference(object_id, &field); | 489 reader->AddBackwardReference(object_id, &field, true); |
| 490 | 490 |
| 491 // Set the object tags. | 491 // Set the object tags. |
| 492 field.set_tags(tags); | 492 field.set_tags(tags); |
| 493 | 493 |
| 494 // Set all non object fields. | 494 // Set all non object fields. |
| 495 field.set_token_index(reader->ReadIntptrValue()); | 495 field.set_token_index(reader->ReadIntptrValue()); |
| 496 field.set_is_static(reader->Read<bool>()); | 496 field.set_is_static(reader->Read<bool>()); |
| 497 field.set_is_final(reader->Read<bool>()); | 497 field.set_is_final(reader->Read<bool>()); |
| 498 field.set_has_initializer(reader->Read<bool>()); | 498 field.set_has_initializer(reader->Read<bool>()); |
| 499 | 499 |
| 500 // Set all the object fields. | 500 // Set all the object fields. |
| 501 // TODO(5411462): Need to assert No GC can happen here, even though | 501 // TODO(5411462): Need to assert No GC can happen here, even though |
| 502 // allocations may happen. | 502 // allocations may happen. |
| 503 intptr_t num_flds = (field.raw()->to() - field.raw()->from()); | 503 intptr_t num_flds = (field.raw()->to() - field.raw()->from()); |
| 504 for (intptr_t i = 0; i <= num_flds; i++) { | 504 for (intptr_t i = 0; i <= num_flds; i++) { |
| 505 *(field.raw()->from() + i) = reader->ReadObject(); | 505 *(field.raw()->from() + i) = reader->ReadObjectRef(); |
| 506 } | 506 } |
| 507 | 507 |
| 508 return field.raw(); | 508 return field.raw(); |
| 509 } | 509 } |
| 510 | 510 |
| 511 | 511 |
| 512 void RawField::WriteTo(SnapshotWriter* writer, | 512 void RawField::WriteTo(SnapshotWriter* writer, |
| 513 intptr_t object_id, | 513 intptr_t object_id, |
| 514 Snapshot::Kind kind) { | 514 Snapshot::Kind kind) { |
| 515 ASSERT(writer != NULL); | 515 ASSERT(writer != NULL); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 537 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, | 537 RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, |
| 538 intptr_t object_id, | 538 intptr_t object_id, |
| 539 intptr_t tags, | 539 intptr_t tags, |
| 540 Snapshot::Kind kind) { | 540 Snapshot::Kind kind) { |
| 541 ASSERT(reader != NULL); | 541 ASSERT(reader != NULL); |
| 542 ASSERT(kind != Snapshot::kMessage); | 542 ASSERT(kind != Snapshot::kMessage); |
| 543 | 543 |
| 544 // Create the literal token object. | 544 // Create the literal token object. |
| 545 LiteralToken& literal_token = LiteralToken::ZoneHandle( | 545 LiteralToken& literal_token = LiteralToken::ZoneHandle( |
| 546 reader->isolate(), NEW_OBJECT(LiteralToken)); | 546 reader->isolate(), NEW_OBJECT(LiteralToken)); |
| 547 reader->AddBackwardReference(object_id, &literal_token); | 547 reader->AddBackwardReference(object_id, &literal_token, true); |
| 548 | 548 |
| 549 // Set the object tags. | 549 // Set the object tags. |
| 550 literal_token.set_tags(tags); | 550 literal_token.set_tags(tags); |
| 551 | 551 |
| 552 // Read the token attributes. | 552 // Read the token attributes. |
| 553 Token::Kind token_kind = static_cast<Token::Kind>(reader->ReadIntptrValue()); | 553 Token::Kind token_kind = static_cast<Token::Kind>(reader->ReadIntptrValue()); |
| 554 literal_token.set_kind(token_kind); | 554 literal_token.set_kind(token_kind); |
| 555 *reader->StringHandle() ^= reader->ReadObject(); | 555 *reader->StringHandle() ^= reader->ReadObjectImpl(); |
| 556 literal_token.set_literal(*reader->StringHandle()); | 556 literal_token.set_literal(*reader->StringHandle()); |
| 557 *reader->ObjectHandle() = reader->ReadObject(); | 557 *reader->ObjectHandle() = reader->ReadObjectImpl(); |
| 558 literal_token.set_value(*reader->ObjectHandle()); | 558 literal_token.set_value(*reader->ObjectHandle()); |
| 559 | 559 |
| 560 return literal_token.raw(); | 560 return literal_token.raw(); |
| 561 } | 561 } |
| 562 | 562 |
| 563 | 563 |
| 564 void RawLiteralToken::WriteTo(SnapshotWriter* writer, | 564 void RawLiteralToken::WriteTo(SnapshotWriter* writer, |
| 565 intptr_t object_id, | 565 intptr_t object_id, |
| 566 Snapshot::Kind kind) { | 566 Snapshot::Kind kind) { |
| 567 ASSERT(writer != NULL); | 567 ASSERT(writer != NULL); |
| 568 ASSERT(kind != Snapshot::kMessage); | 568 ASSERT(kind != Snapshot::kMessage); |
| 569 | 569 |
| 570 // Write out the serialization header value for this object. | 570 // Write out the serialization header value for this object. |
| 571 writer->WriteSerializationMarker(kInlined, object_id); | 571 writer->WriteSerializationMarker(kInlined, object_id); |
| 572 | 572 |
| 573 // Write out the class and tags information. | 573 // Write out the class and tags information. |
| 574 writer->WriteObjectHeader(Object::kLiteralTokenClass, | 574 writer->WriteObjectHeader(Object::kLiteralTokenClass, |
| 575 writer->GetObjectTags(this)); | 575 writer->GetObjectTags(this)); |
| 576 | 576 |
| 577 // Write out the kind field. | 577 // Write out the kind field. |
| 578 writer->Write<intptr_t>(ptr()->kind_); | 578 writer->Write<intptr_t>(ptr()->kind_); |
| 579 | 579 |
| 580 // Write out literal and value fields. | 580 // Write out literal and value fields. |
| 581 writer->WriteObject(ptr()->literal_); | 581 writer->WriteObjectImpl(ptr()->literal_); |
| 582 writer->WriteObject(ptr()->value_); | 582 writer->WriteObjectImpl(ptr()->value_); |
| 583 } | 583 } |
| 584 | 584 |
| 585 | 585 |
| 586 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, | 586 RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader, |
| 587 intptr_t object_id, | 587 intptr_t object_id, |
| 588 intptr_t tags, | 588 intptr_t tags, |
| 589 Snapshot::Kind kind) { | 589 Snapshot::Kind kind) { |
| 590 ASSERT(reader != NULL); | 590 ASSERT(reader != NULL); |
| 591 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); | 591 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); |
| 592 | 592 |
| 593 // Read the length so that we can determine number of tokens to read. | 593 // Read the length so that we can determine number of tokens to read. |
| 594 intptr_t len = reader->ReadSmiValue(); | 594 intptr_t len = reader->ReadSmiValue(); |
| 595 | 595 |
| 596 // Create the token stream object. | 596 // Create the token stream object. |
| 597 TokenStream& token_stream = TokenStream::ZoneHandle( | 597 TokenStream& token_stream = TokenStream::ZoneHandle( |
| 598 reader->isolate(), NEW_OBJECT_WITH_LEN(TokenStream, len)); | 598 reader->isolate(), NEW_OBJECT_WITH_LEN(TokenStream, len)); |
| 599 reader->AddBackwardReference(object_id, &token_stream); | 599 reader->AddBackwardReference(object_id, &token_stream, true); |
| 600 | 600 |
| 601 // Set the object tags. | 601 // Set the object tags. |
| 602 token_stream.set_tags(tags); | 602 token_stream.set_tags(tags); |
| 603 | 603 |
| 604 // Read the token stream into the TokenStream. | 604 // Read the token stream into the TokenStream. |
| 605 for (intptr_t i = 0; i < len; i++) { | 605 for (intptr_t i = 0; i < len; i++) { |
| 606 *reader->ObjectHandle() = reader->ReadObject(); | 606 *reader->ObjectHandle() = reader->ReadObjectImpl(); |
| 607 token_stream.SetTokenAt(i, *reader->ObjectHandle()); | 607 token_stream.SetTokenAt(i, *reader->ObjectHandle()); |
| 608 } | 608 } |
| 609 return token_stream.raw(); | 609 return token_stream.raw(); |
| 610 } | 610 } |
| 611 | 611 |
| 612 | 612 |
| 613 void RawTokenStream::WriteTo(SnapshotWriter* writer, | 613 void RawTokenStream::WriteTo(SnapshotWriter* writer, |
| 614 intptr_t object_id, | 614 intptr_t object_id, |
| 615 Snapshot::Kind kind) { | 615 Snapshot::Kind kind) { |
| 616 ASSERT(writer != NULL); | 616 ASSERT(writer != NULL); |
| 617 ASSERT(kind != Snapshot::kMessage && | 617 ASSERT(kind != Snapshot::kMessage && |
| 618 !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))); | 618 !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))); |
| 619 | 619 |
| 620 // Write out the serialization header value for this object. | 620 // Write out the serialization header value for this object. |
| 621 writer->WriteSerializationMarker(kInlined, object_id); | 621 writer->WriteSerializationMarker(kInlined, object_id); |
| 622 | 622 |
| 623 // Write out the class and tags information. | 623 // Write out the class and tags information. |
| 624 writer->WriteObjectHeader(Object::kTokenStreamClass, | 624 writer->WriteObjectHeader(Object::kTokenStreamClass, |
| 625 writer->GetObjectTags(this)); | 625 writer->GetObjectTags(this)); |
| 626 | 626 |
| 627 // Write out the length field. | 627 // Write out the length field. |
| 628 writer->Write<RawObject*>(ptr()->length_); | 628 writer->Write<RawObject*>(ptr()->length_); |
| 629 | 629 |
| 630 // Write out the token stream (token kind and literal). | 630 // Write out the token stream (token kind and literal). |
| 631 intptr_t len = Smi::Value(ptr()->length_); | 631 intptr_t len = Smi::Value(ptr()->length_); |
| 632 for (intptr_t i = 0; i < TokenStream::StreamLength(len); i++) { | 632 for (intptr_t i = 0; i < TokenStream::StreamLength(len); i++) { |
| 633 writer->WriteObject(ptr()->data_[i]); | 633 writer->WriteObjectImpl(ptr()->data_[i]); |
| 634 } | 634 } |
| 635 } | 635 } |
| 636 | 636 |
| 637 | 637 |
| 638 RawScript* Script::ReadFrom(SnapshotReader* reader, | 638 RawScript* Script::ReadFrom(SnapshotReader* reader, |
| 639 intptr_t object_id, | 639 intptr_t object_id, |
| 640 intptr_t tags, | 640 intptr_t tags, |
| 641 Snapshot::Kind kind) { | 641 Snapshot::Kind kind) { |
| 642 ASSERT(reader != NULL); | 642 ASSERT(reader != NULL); |
| 643 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); | 643 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); |
| 644 | 644 |
| 645 // Allocate script object. | 645 // Allocate script object. |
| 646 Script& script = Script::ZoneHandle(reader->isolate(), NEW_OBJECT(Script)); | 646 Script& script = Script::ZoneHandle(reader->isolate(), NEW_OBJECT(Script)); |
| 647 reader->AddBackwardReference(object_id, &script); | 647 reader->AddBackwardReference(object_id, &script, true); |
| 648 | 648 |
| 649 // Set the object tags. | 649 // Set the object tags. |
| 650 script.set_tags(tags); | 650 script.set_tags(tags); |
| 651 | 651 |
| 652 // Set all the object fields. | 652 // Set all the object fields. |
| 653 // TODO(5411462): Need to assert No GC can happen here, even though | 653 // TODO(5411462): Need to assert No GC can happen here, even though |
| 654 // allocations may happen. | 654 // allocations may happen. |
| 655 *reader->StringHandle() ^= reader->ReadObject(); | 655 *reader->StringHandle() ^= reader->ReadObjectImpl(); |
| 656 script.set_url(*reader->StringHandle()); | 656 script.set_url(*reader->StringHandle()); |
| 657 *reader->StringHandle() ^= String::null(); | 657 *reader->StringHandle() ^= String::null(); |
| 658 script.set_source(*reader->StringHandle()); | 658 script.set_source(*reader->StringHandle()); |
| 659 TokenStream& stream = TokenStream::Handle(); | 659 TokenStream& stream = TokenStream::Handle(); |
| 660 stream ^= reader->ReadObject(); | 660 stream ^= reader->ReadObjectImpl(); |
| 661 script.set_tokens(stream); | 661 script.set_tokens(stream); |
| 662 | 662 |
| 663 return script.raw(); | 663 return script.raw(); |
| 664 } | 664 } |
| 665 | 665 |
| 666 | 666 |
| 667 void RawScript::WriteTo(SnapshotWriter* writer, | 667 void RawScript::WriteTo(SnapshotWriter* writer, |
| 668 intptr_t object_id, | 668 intptr_t object_id, |
| 669 Snapshot::Kind kind) { | 669 Snapshot::Kind kind) { |
| 670 ASSERT(writer != NULL); | 670 ASSERT(writer != NULL); |
| 671 ASSERT(tokens_ != TokenStream::null()); | 671 ASSERT(tokens_ != TokenStream::null()); |
| 672 ASSERT(kind != Snapshot::kMessage && | 672 ASSERT(kind != Snapshot::kMessage && |
| 673 !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))); | 673 !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))); |
| 674 | 674 |
| 675 // Write out the serialization header value for this object. | 675 // Write out the serialization header value for this object. |
| 676 writer->WriteSerializationMarker(kInlined, object_id); | 676 writer->WriteSerializationMarker(kInlined, object_id); |
| 677 | 677 |
| 678 // Write out the class and tags information. | 678 // Write out the class and tags information. |
| 679 writer->WriteObjectHeader(Object::kScriptClass, writer->GetObjectTags(this)); | 679 writer->WriteObjectHeader(Object::kScriptClass, writer->GetObjectTags(this)); |
| 680 | 680 |
| 681 // Write out all the object pointer fields. | 681 // Write out all the object pointer fields. |
| 682 writer->WriteObject(ptr()->url_); | 682 writer->WriteObjectImpl(ptr()->url_); |
| 683 writer->WriteObject(ptr()->tokens_); | 683 writer->WriteObjectImpl(ptr()->tokens_); |
| 684 } | 684 } |
| 685 | 685 |
| 686 | 686 |
| 687 RawLibrary* Library::ReadFrom(SnapshotReader* reader, | 687 RawLibrary* Library::ReadFrom(SnapshotReader* reader, |
| 688 intptr_t object_id, | 688 intptr_t object_id, |
| 689 intptr_t tags, | 689 intptr_t tags, |
| 690 Snapshot::Kind kind) { | 690 Snapshot::Kind kind) { |
| 691 ASSERT(reader != NULL); | 691 ASSERT(reader != NULL); |
| 692 ASSERT(kind != Snapshot::kMessage); | 692 ASSERT(kind != Snapshot::kMessage); |
| 693 | 693 |
| 694 Library& library = Library::ZoneHandle(reader->isolate(), Library::null()); | 694 Library& library = Library::ZoneHandle(reader->isolate(), Library::null()); |
| 695 reader->AddBackwardReference(object_id, &library); | 695 reader->AddBackwardReference(object_id, &library, true); |
| 696 | 696 |
| 697 if (RawObject::IsCreatedFromSnapshot(tags)) { | 697 if (RawObject::IsCreatedFromSnapshot(tags)) { |
| 698 ASSERT(kind != Snapshot::kFull); | 698 ASSERT(kind != Snapshot::kFull); |
| 699 // Lookup the object as it should already exist in the heap. | 699 // Lookup the object as it should already exist in the heap. |
| 700 *reader->StringHandle() ^= reader->ReadObject(); | 700 *reader->StringHandle() ^= reader->ReadObjectImpl(); |
| 701 library = Library::LookupLibrary(*reader->StringHandle()); | 701 library = Library::LookupLibrary(*reader->StringHandle()); |
| 702 } else { | 702 } else { |
| 703 // Allocate library object. | 703 // Allocate library object. |
| 704 library = NEW_OBJECT(Library); | 704 library = NEW_OBJECT(Library); |
| 705 | 705 |
| 706 // Set the object tags. | 706 // Set the object tags. |
| 707 library.set_tags(tags); | 707 library.set_tags(tags); |
| 708 | 708 |
| 709 // Set all non object fields. | 709 // Set all non object fields. |
| 710 library.raw_ptr()->index_ = reader->ReadIntptrValue(); | 710 library.raw_ptr()->index_ = reader->ReadIntptrValue(); |
| 711 library.raw_ptr()->num_imports_ = reader->ReadIntptrValue(); | 711 library.raw_ptr()->num_imports_ = reader->ReadIntptrValue(); |
| 712 library.raw_ptr()->num_imported_into_ = reader->ReadIntptrValue(); | 712 library.raw_ptr()->num_imported_into_ = reader->ReadIntptrValue(); |
| 713 library.raw_ptr()->num_anonymous_ = reader->ReadIntptrValue(); | 713 library.raw_ptr()->num_anonymous_ = reader->ReadIntptrValue(); |
| 714 library.raw_ptr()->corelib_imported_ = reader->Read<bool>(); | 714 library.raw_ptr()->corelib_imported_ = reader->Read<bool>(); |
| 715 library.raw_ptr()->debuggable_ = reader->Read<bool>(); | 715 library.raw_ptr()->debuggable_ = reader->Read<bool>(); |
| 716 library.raw_ptr()->load_state_ = reader->Read<int8_t>(); | 716 library.raw_ptr()->load_state_ = reader->Read<int8_t>(); |
| 717 // The native resolver is not serialized. | 717 // The native resolver is not serialized. |
| 718 Dart_NativeEntryResolver resolver = | 718 Dart_NativeEntryResolver resolver = |
| 719 reader->Read<Dart_NativeEntryResolver>(); | 719 reader->Read<Dart_NativeEntryResolver>(); |
| 720 ASSERT(resolver == NULL); | 720 ASSERT(resolver == NULL); |
| 721 library.set_native_entry_resolver(resolver); | 721 library.set_native_entry_resolver(resolver); |
| 722 // The cache of loaded scripts is not serialized. | 722 // The cache of loaded scripts is not serialized. |
| 723 library.raw_ptr()->loaded_scripts_ = Array::null(); | 723 library.raw_ptr()->loaded_scripts_ = Array::null(); |
| 724 | 724 |
| 725 // Set all the object fields. | 725 // Set all the object fields. |
| 726 // TODO(5411462): Need to assert No GC can happen here, even though | 726 // TODO(5411462): Need to assert No GC can happen here, even though |
| 727 // allocations may happen. | 727 // allocations may happen. |
| 728 intptr_t num_flds = (library.raw()->to() - library.raw()->from()); | 728 intptr_t num_flds = (library.raw()->to() - library.raw()->from()); |
| 729 for (intptr_t i = 0; i <= num_flds; i++) { | 729 for (intptr_t i = 0; i <= num_flds; i++) { |
| 730 *(library.raw()->from() + i) = reader->ReadObject(); | 730 *(library.raw()->from() + i) = reader->ReadObjectRef(); |
| 731 } | 731 } |
| 732 if (kind != Snapshot::kFull) { | 732 if (kind != Snapshot::kFull) { |
| 733 library.Register(); | 733 library.Register(); |
| 734 } | 734 } |
| 735 } | 735 } |
| 736 return library.raw(); | 736 return library.raw(); |
| 737 } | 737 } |
| 738 | 738 |
| 739 | 739 |
| 740 void RawLibrary::WriteTo(SnapshotWriter* writer, | 740 void RawLibrary::WriteTo(SnapshotWriter* writer, |
| 741 intptr_t object_id, | 741 intptr_t object_id, |
| 742 Snapshot::Kind kind) { | 742 Snapshot::Kind kind) { |
| 743 ASSERT(writer != NULL); | 743 ASSERT(writer != NULL); |
| 744 ASSERT(kind != Snapshot::kMessage); | 744 ASSERT(kind != Snapshot::kMessage); |
| 745 | 745 |
| 746 // Write out the serialization header value for this object. | 746 // Write out the serialization header value for this object. |
| 747 writer->WriteSerializationMarker(kInlined, object_id); | 747 writer->WriteSerializationMarker(kInlined, object_id); |
| 748 | 748 |
| 749 // Write out the class and tags information. | 749 // Write out the class and tags information. |
| 750 writer->WriteObjectHeader(Object::kLibraryClass, writer->GetObjectTags(this)); | 750 writer->WriteObjectHeader(Object::kLibraryClass, writer->GetObjectTags(this)); |
| 751 | 751 |
| 752 if (RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) { | 752 if (RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) { |
| 753 ASSERT(kind != Snapshot::kFull); | 753 ASSERT(kind != Snapshot::kFull); |
| 754 // Write out library URL so that it can be looked up when reading. | 754 // Write out library URL so that it can be looked up when reading. |
| 755 writer->WriteObject(ptr()->url_); | 755 writer->WriteObjectImpl(ptr()->url_); |
| 756 } else { | 756 } else { |
| 757 // Write out all non object fields. | 757 // Write out all non object fields. |
| 758 writer->WriteIntptrValue(ptr()->index_); | 758 writer->WriteIntptrValue(ptr()->index_); |
| 759 writer->WriteIntptrValue(ptr()->num_imports_); | 759 writer->WriteIntptrValue(ptr()->num_imports_); |
| 760 writer->WriteIntptrValue(ptr()->num_imported_into_); | 760 writer->WriteIntptrValue(ptr()->num_imported_into_); |
| 761 writer->WriteIntptrValue(ptr()->num_anonymous_); | 761 writer->WriteIntptrValue(ptr()->num_anonymous_); |
| 762 writer->Write<bool>(ptr()->corelib_imported_); | 762 writer->Write<bool>(ptr()->corelib_imported_); |
| 763 writer->Write<bool>(ptr()->debuggable_); | 763 writer->Write<bool>(ptr()->debuggable_); |
| 764 writer->Write<int8_t>(ptr()->load_state_); | 764 writer->Write<int8_t>(ptr()->load_state_); |
| 765 // We do not serialize the native resolver over, this needs to be explicitly | 765 // We do not serialize the native resolver over, this needs to be explicitly |
| (...skipping 13 matching lines...) Expand all Loading... |
| 779 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, | 779 RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, |
| 780 intptr_t object_id, | 780 intptr_t object_id, |
| 781 intptr_t tags, | 781 intptr_t tags, |
| 782 Snapshot::Kind kind) { | 782 Snapshot::Kind kind) { |
| 783 ASSERT(reader != NULL); | 783 ASSERT(reader != NULL); |
| 784 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); | 784 ASSERT(kind != Snapshot::kMessage && !RawObject::IsCreatedFromSnapshot(tags)); |
| 785 | 785 |
| 786 // Allocate library prefix object. | 786 // Allocate library prefix object. |
| 787 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle( | 787 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle( |
| 788 reader->isolate(), NEW_OBJECT(LibraryPrefix)); | 788 reader->isolate(), NEW_OBJECT(LibraryPrefix)); |
| 789 reader->AddBackwardReference(object_id, &prefix); | 789 reader->AddBackwardReference(object_id, &prefix, true); |
| 790 | 790 |
| 791 // Set the object tags. | 791 // Set the object tags. |
| 792 prefix.set_tags(tags); | 792 prefix.set_tags(tags); |
| 793 | 793 |
| 794 // Set all non object fields. | 794 // Set all non object fields. |
| 795 prefix.raw_ptr()->num_libs_ = reader->ReadIntptrValue(); | 795 prefix.raw_ptr()->num_libs_ = reader->ReadIntptrValue(); |
| 796 | 796 |
| 797 // Set all the object fields. | 797 // Set all the object fields. |
| 798 // TODO(5411462): Need to assert No GC can happen here, even though | 798 // TODO(5411462): Need to assert No GC can happen here, even though |
| 799 // allocations may happen. | 799 // allocations may happen. |
| 800 intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from()); | 800 intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from()); |
| 801 for (intptr_t i = 0; i <= num_flds; i++) { | 801 for (intptr_t i = 0; i <= num_flds; i++) { |
| 802 *(prefix.raw()->from() + i) = reader->ReadObject(); | 802 *(prefix.raw()->from() + i) = reader->ReadObjectRef(); |
| 803 } | 803 } |
| 804 | 804 |
| 805 return prefix.raw(); | 805 return prefix.raw(); |
| 806 } | 806 } |
| 807 | 807 |
| 808 | 808 |
| 809 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, | 809 void RawLibraryPrefix::WriteTo(SnapshotWriter* writer, |
| 810 intptr_t object_id, | 810 intptr_t object_id, |
| 811 Snapshot::Kind kind) { | 811 Snapshot::Kind kind) { |
| 812 ASSERT(writer != NULL); | 812 ASSERT(writer != NULL); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 ASSERT(reader != NULL); | 934 ASSERT(reader != NULL); |
| 935 | 935 |
| 936 // Allocate context object. | 936 // Allocate context object. |
| 937 intptr_t num_vars = reader->ReadIntptrValue(); | 937 intptr_t num_vars = reader->ReadIntptrValue(); |
| 938 Context& context = Context::ZoneHandle(reader->isolate(), Context::null()); | 938 Context& context = Context::ZoneHandle(reader->isolate(), Context::null()); |
| 939 if (kind == Snapshot::kFull) { | 939 if (kind == Snapshot::kFull) { |
| 940 context = reader->NewContext(num_vars); | 940 context = reader->NewContext(num_vars); |
| 941 } else { | 941 } else { |
| 942 context = Context::New(num_vars); | 942 context = Context::New(num_vars); |
| 943 } | 943 } |
| 944 reader->AddBackwardReference(object_id, &context); | 944 reader->AddBackwardReference(object_id, &context, true); |
| 945 | 945 |
| 946 // Set the object tags. | 946 // Set the object tags. |
| 947 context.set_tags(tags); | 947 context.set_tags(tags); |
| 948 | 948 |
| 949 // Set the isolate implicitly. | 949 // Set the isolate implicitly. |
| 950 context.set_isolate(Isolate::Current()); | 950 context.set_isolate(Isolate::Current()); |
| 951 | 951 |
| 952 // Set all the object fields. | 952 // Set all the object fields. |
| 953 // TODO(5411462): Need to assert No GC can happen here, even though | 953 // TODO(5411462): Need to assert No GC can happen here, even though |
| 954 // allocations may happen. | 954 // allocations may happen. |
| 955 intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from()); | 955 intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from()); |
| 956 for (intptr_t i = 0; i <= num_flds; i++) { | 956 for (intptr_t i = 0; i <= num_flds; i++) { |
| 957 *(context.raw()->from() + i) = reader->ReadObject(); | 957 *(context.raw()->from() + i) = reader->ReadObjectRef(); |
| 958 } | 958 } |
| 959 | 959 |
| 960 return context.raw(); | 960 return context.raw(); |
| 961 } | 961 } |
| 962 | 962 |
| 963 | 963 |
| 964 void RawContext::WriteTo(SnapshotWriter* writer, | 964 void RawContext::WriteTo(SnapshotWriter* writer, |
| 965 intptr_t object_id, | 965 intptr_t object_id, |
| 966 Snapshot::Kind kind) { | 966 Snapshot::Kind kind) { |
| 967 ASSERT(writer != NULL); | 967 ASSERT(writer != NULL); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 987 intptr_t object_id, | 987 intptr_t object_id, |
| 988 intptr_t tags, | 988 intptr_t tags, |
| 989 Snapshot::Kind kind) { | 989 Snapshot::Kind kind) { |
| 990 ASSERT(reader != NULL); | 990 ASSERT(reader != NULL); |
| 991 ASSERT(kind == Snapshot::kMessage); | 991 ASSERT(kind == Snapshot::kMessage); |
| 992 | 992 |
| 993 // Allocate context scope object. | 993 // Allocate context scope object. |
| 994 intptr_t num_vars = reader->ReadIntptrValue(); | 994 intptr_t num_vars = reader->ReadIntptrValue(); |
| 995 ContextScope& scope = ContextScope::ZoneHandle(reader->isolate(), | 995 ContextScope& scope = ContextScope::ZoneHandle(reader->isolate(), |
| 996 ContextScope::New(num_vars)); | 996 ContextScope::New(num_vars)); |
| 997 reader->AddBackwardReference(object_id, &scope); | 997 reader->AddBackwardReference(object_id, &scope, true); |
| 998 | 998 |
| 999 // Set the object tags. | 999 // Set the object tags. |
| 1000 scope.set_tags(tags); | 1000 scope.set_tags(tags); |
| 1001 | 1001 |
| 1002 // Set all the object fields. | 1002 // Set all the object fields. |
| 1003 // TODO(5411462): Need to assert No GC can happen here, even though | 1003 // TODO(5411462): Need to assert No GC can happen here, even though |
| 1004 // allocations may happen. | 1004 // allocations may happen. |
| 1005 intptr_t num_flds = (scope.raw()->to(num_vars) - scope.raw()->from()); | 1005 intptr_t num_flds = (scope.raw()->to(num_vars) - scope.raw()->from()); |
| 1006 for (intptr_t i = 0; i <= num_flds; i++) { | 1006 for (intptr_t i = 0; i <= num_flds; i++) { |
| 1007 *(scope.raw()->from() + i) = reader->ReadObject(); | 1007 *(scope.raw()->from() + i) = reader->ReadObjectRef(); |
| 1008 } | 1008 } |
| 1009 | 1009 |
| 1010 return scope.raw(); | 1010 return scope.raw(); |
| 1011 } | 1011 } |
| 1012 | 1012 |
| 1013 | 1013 |
| 1014 void RawContextScope::WriteTo(SnapshotWriter* writer, | 1014 void RawContextScope::WriteTo(SnapshotWriter* writer, |
| 1015 intptr_t object_id, | 1015 intptr_t object_id, |
| 1016 Snapshot::Kind kind) { | 1016 Snapshot::Kind kind) { |
| 1017 ASSERT(writer != NULL); | 1017 ASSERT(writer != NULL); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1174 Mint& mint = Mint::ZoneHandle(reader->isolate(), Mint::null()); | 1174 Mint& mint = Mint::ZoneHandle(reader->isolate(), Mint::null()); |
| 1175 if (kind == Snapshot::kFull) { | 1175 if (kind == Snapshot::kFull) { |
| 1176 mint = reader->NewMint(value); | 1176 mint = reader->NewMint(value); |
| 1177 } else { | 1177 } else { |
| 1178 if (RawObject::IsCanonical(tags)) { | 1178 if (RawObject::IsCanonical(tags)) { |
| 1179 mint = Mint::NewCanonical(value); | 1179 mint = Mint::NewCanonical(value); |
| 1180 } else { | 1180 } else { |
| 1181 mint = Mint::New(value, Heap::kNew); | 1181 mint = Mint::New(value, Heap::kNew); |
| 1182 } | 1182 } |
| 1183 } | 1183 } |
| 1184 reader->AddBackwardReference(object_id, &mint); | 1184 reader->AddBackwardReference(object_id, &mint, true); |
| 1185 | 1185 |
| 1186 // Set the object tags. | 1186 // Set the object tags. |
| 1187 mint.set_tags(tags); | 1187 mint.set_tags(tags); |
| 1188 | 1188 |
| 1189 return mint.raw(); | 1189 return mint.raw(); |
| 1190 } | 1190 } |
| 1191 | 1191 |
| 1192 | 1192 |
| 1193 void RawMint::WriteTo(SnapshotWriter* writer, | 1193 void RawMint::WriteTo(SnapshotWriter* writer, |
| 1194 intptr_t object_id, | 1194 intptr_t object_id, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1222 // Create a Bigint object from HexCString. | 1222 // Create a Bigint object from HexCString. |
| 1223 Bigint& obj = Bigint::ZoneHandle( | 1223 Bigint& obj = Bigint::ZoneHandle( |
| 1224 reader->isolate(), | 1224 reader->isolate(), |
| 1225 (kind == Snapshot::kFull) ? reader->NewBigint(str) : | 1225 (kind == Snapshot::kFull) ? reader->NewBigint(str) : |
| 1226 BigintOperations::FromHexCString(str)); | 1226 BigintOperations::FromHexCString(str)); |
| 1227 | 1227 |
| 1228 // If it is a canonical constant make it one. | 1228 // If it is a canonical constant make it one. |
| 1229 if ((kind != Snapshot::kFull) && RawObject::IsCanonical(tags)) { | 1229 if ((kind != Snapshot::kFull) && RawObject::IsCanonical(tags)) { |
| 1230 obj ^= obj.Canonicalize(); | 1230 obj ^= obj.Canonicalize(); |
| 1231 } | 1231 } |
| 1232 reader->AddBackwardReference(object_id, &obj); | 1232 reader->AddBackwardReference(object_id, &obj, true); |
| 1233 | 1233 |
| 1234 // Set the object tags. | 1234 // Set the object tags. |
| 1235 obj.set_tags(tags); | 1235 obj.set_tags(tags); |
| 1236 | 1236 |
| 1237 return obj.raw(); | 1237 return obj.raw(); |
| 1238 } | 1238 } |
| 1239 | 1239 |
| 1240 | 1240 |
| 1241 void RawBigint::WriteTo(SnapshotWriter* writer, | 1241 void RawBigint::WriteTo(SnapshotWriter* writer, |
| 1242 intptr_t object_id, | 1242 intptr_t object_id, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 Double& dbl = Double::ZoneHandle(reader->isolate(), Double::null()); | 1294 Double& dbl = Double::ZoneHandle(reader->isolate(), Double::null()); |
| 1295 if (kind == Snapshot::kFull) { | 1295 if (kind == Snapshot::kFull) { |
| 1296 dbl = reader->NewDouble(value); | 1296 dbl = reader->NewDouble(value); |
| 1297 } else { | 1297 } else { |
| 1298 if (RawObject::IsCanonical(tags)) { | 1298 if (RawObject::IsCanonical(tags)) { |
| 1299 dbl = Double::NewCanonical(value); | 1299 dbl = Double::NewCanonical(value); |
| 1300 } else { | 1300 } else { |
| 1301 dbl = Double::New(value, Heap::kNew); | 1301 dbl = Double::New(value, Heap::kNew); |
| 1302 } | 1302 } |
| 1303 } | 1303 } |
| 1304 reader->AddBackwardReference(object_id, &dbl); | 1304 reader->AddBackwardReference(object_id, &dbl, true); |
| 1305 | 1305 |
| 1306 // Set the object tags. | 1306 // Set the object tags. |
| 1307 dbl.set_tags(tags); | 1307 dbl.set_tags(tags); |
| 1308 | 1308 |
| 1309 return dbl.raw(); | 1309 return dbl.raw(); |
| 1310 } | 1310 } |
| 1311 | 1311 |
| 1312 | 1312 |
| 1313 void RawDouble::WriteTo(SnapshotWriter* writer, | 1313 void RawDouble::WriteTo(SnapshotWriter* writer, |
| 1314 intptr_t object_id, | 1314 intptr_t object_id, |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 str_obj.set_tags(tags); | 1387 str_obj.set_tags(tags); |
| 1388 obj->ptr()->hash_ = Smi::New(hash); | 1388 obj->ptr()->hash_ = Smi::New(hash); |
| 1389 if (len > 0) { | 1389 if (len > 0) { |
| 1390 uint8_t* raw_ptr = str_obj.CharAddr(0); | 1390 uint8_t* raw_ptr = str_obj.CharAddr(0); |
| 1391 reader->ReadBytes(raw_ptr, len); | 1391 reader->ReadBytes(raw_ptr, len); |
| 1392 } | 1392 } |
| 1393 ASSERT((hash == 0) || (String::Hash(str_obj, 0, str_obj.Length()) == hash)); | 1393 ASSERT((hash == 0) || (String::Hash(str_obj, 0, str_obj.Length()) == hash)); |
| 1394 } else { | 1394 } else { |
| 1395 ReadFromImpl<OneByteString, uint8_t>(reader, &str_obj, len, tags); | 1395 ReadFromImpl<OneByteString, uint8_t>(reader, &str_obj, len, tags); |
| 1396 } | 1396 } |
| 1397 reader->AddBackwardReference(object_id, &str_obj); | 1397 reader->AddBackwardReference(object_id, &str_obj, true); |
| 1398 return str_obj.raw(); | 1398 return str_obj.raw(); |
| 1399 } | 1399 } |
| 1400 | 1400 |
| 1401 | 1401 |
| 1402 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader, | 1402 RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader, |
| 1403 intptr_t object_id, | 1403 intptr_t object_id, |
| 1404 intptr_t tags, | 1404 intptr_t tags, |
| 1405 Snapshot::Kind kind) { | 1405 Snapshot::Kind kind) { |
| 1406 // Read the length so that we can determine instance size to allocate. | 1406 // Read the length so that we can determine instance size to allocate. |
| 1407 ASSERT(reader != NULL); | 1407 ASSERT(reader != NULL); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1418 uint16_t* raw_ptr = (len > 0)? str_obj.CharAddr(0) : NULL; | 1418 uint16_t* raw_ptr = (len > 0)? str_obj.CharAddr(0) : NULL; |
| 1419 for (intptr_t i = 0; i < len; i++) { | 1419 for (intptr_t i = 0; i < len; i++) { |
| 1420 ASSERT(str_obj.CharAddr(i) == raw_ptr); // Will trigger assertions. | 1420 ASSERT(str_obj.CharAddr(i) == raw_ptr); // Will trigger assertions. |
| 1421 *raw_ptr = reader->Read<uint16_t>(); | 1421 *raw_ptr = reader->Read<uint16_t>(); |
| 1422 raw_ptr += 1; | 1422 raw_ptr += 1; |
| 1423 } | 1423 } |
| 1424 ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash); | 1424 ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash); |
| 1425 } else { | 1425 } else { |
| 1426 ReadFromImpl<TwoByteString, uint16_t>(reader, &str_obj, len, tags); | 1426 ReadFromImpl<TwoByteString, uint16_t>(reader, &str_obj, len, tags); |
| 1427 } | 1427 } |
| 1428 reader->AddBackwardReference(object_id, &str_obj); | 1428 reader->AddBackwardReference(object_id, &str_obj, true); |
| 1429 return str_obj.raw(); | 1429 return str_obj.raw(); |
| 1430 } | 1430 } |
| 1431 | 1431 |
| 1432 | 1432 |
| 1433 RawFourByteString* FourByteString::ReadFrom(SnapshotReader* reader, | 1433 RawFourByteString* FourByteString::ReadFrom(SnapshotReader* reader, |
| 1434 intptr_t object_id, | 1434 intptr_t object_id, |
| 1435 intptr_t tags, | 1435 intptr_t tags, |
| 1436 Snapshot::Kind kind) { | 1436 Snapshot::Kind kind) { |
| 1437 // Read the length so that we can determine instance size to allocate. | 1437 // Read the length so that we can determine instance size to allocate. |
| 1438 ASSERT(reader != NULL); | 1438 ASSERT(reader != NULL); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1449 uint32_t* raw_ptr = (len > 0)? str_obj.CharAddr(0) : NULL; | 1449 uint32_t* raw_ptr = (len > 0)? str_obj.CharAddr(0) : NULL; |
| 1450 for (intptr_t i = 0; i < len; i++) { | 1450 for (intptr_t i = 0; i < len; i++) { |
| 1451 ASSERT(str_obj.CharAddr(i) == raw_ptr); // Will trigger assertions. | 1451 ASSERT(str_obj.CharAddr(i) == raw_ptr); // Will trigger assertions. |
| 1452 *raw_ptr = reader->Read<uint32_t>(); | 1452 *raw_ptr = reader->Read<uint32_t>(); |
| 1453 raw_ptr += 1; | 1453 raw_ptr += 1; |
| 1454 } | 1454 } |
| 1455 ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash); | 1455 ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash); |
| 1456 } else { | 1456 } else { |
| 1457 ReadFromImpl<FourByteString, uint32_t>(reader, &str_obj, len, tags); | 1457 ReadFromImpl<FourByteString, uint32_t>(reader, &str_obj, len, tags); |
| 1458 } | 1458 } |
| 1459 reader->AddBackwardReference(object_id, &str_obj); | 1459 reader->AddBackwardReference(object_id, &str_obj, true); |
| 1460 return str_obj.raw(); | 1460 return str_obj.raw(); |
| 1461 } | 1461 } |
| 1462 | 1462 |
| 1463 | 1463 |
| 1464 template<typename T> | 1464 template<typename T> |
| 1465 static void StringWriteTo(SnapshotWriter* writer, | 1465 static void StringWriteTo(SnapshotWriter* writer, |
| 1466 intptr_t object_id, | 1466 intptr_t object_id, |
| 1467 Snapshot::Kind kind, | 1467 Snapshot::Kind kind, |
| 1468 intptr_t class_id, | 1468 intptr_t class_id, |
| 1469 intptr_t tags, | 1469 intptr_t tags, |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1618 } | 1618 } |
| 1619 | 1619 |
| 1620 | 1620 |
| 1621 void RawBool::WriteTo(SnapshotWriter* writer, | 1621 void RawBool::WriteTo(SnapshotWriter* writer, |
| 1622 intptr_t object_id, | 1622 intptr_t object_id, |
| 1623 Snapshot::Kind kind) { | 1623 Snapshot::Kind kind) { |
| 1624 UNREACHABLE(); | 1624 UNREACHABLE(); |
| 1625 } | 1625 } |
| 1626 | 1626 |
| 1627 | 1627 |
| 1628 static void ArrayReadFrom(SnapshotReader* reader, | |
| 1629 const Array& result, | |
| 1630 intptr_t len, | |
| 1631 intptr_t tags) { | |
| 1632 ASSERT(reader != NULL); | |
| 1633 | |
| 1634 // Set the object tags. | |
| 1635 result.set_tags(tags); | |
| 1636 | |
| 1637 // Setup the object fields. | |
| 1638 *reader->TypeArgumentsHandle() ^= reader->ReadObject(); | |
| 1639 result.SetTypeArguments(*reader->TypeArgumentsHandle()); | |
| 1640 | |
| 1641 for (intptr_t i = 0; i < len; i++) { | |
| 1642 *reader->ObjectHandle() = reader->ReadObject(); | |
| 1643 result.SetAt(i, *reader->ObjectHandle()); | |
| 1644 } | |
| 1645 } | |
| 1646 | |
| 1647 | |
| 1648 RawArray* Array::ReadFrom(SnapshotReader* reader, | 1628 RawArray* Array::ReadFrom(SnapshotReader* reader, |
| 1649 intptr_t object_id, | 1629 intptr_t object_id, |
| 1650 intptr_t tags, | 1630 intptr_t tags, |
| 1651 Snapshot::Kind kind) { | 1631 Snapshot::Kind kind) { |
| 1652 ASSERT(reader != NULL); | 1632 ASSERT(reader != NULL); |
| 1653 | 1633 |
| 1654 // Read the length so that we can determine instance size to allocate. | 1634 // Read the length so that we can determine instance size to allocate. |
| 1655 intptr_t len = reader->ReadSmiValue(); | 1635 intptr_t len = reader->ReadSmiValue(); |
| 1656 Array& array = Array::ZoneHandle(reader->isolate(), | 1636 Array* array = reinterpret_cast<Array*>( |
| 1657 NEW_OBJECT_WITH_LEN(Array, len)); | 1637 reader->GetBackwardReference(object_id)); |
| 1658 reader->AddBackwardReference(object_id, &array); | 1638 if (array == NULL) { |
| 1659 ArrayReadFrom(reader, array, len, tags); | 1639 array = &(Array::ZoneHandle(reader->isolate(), |
| 1660 return array.raw(); | 1640 NEW_OBJECT_WITH_LEN(Array, len))); |
| 1641 reader->AddBackwardReference(object_id, array, true); |
| 1642 } |
| 1643 reader->ArrayReadFrom(*array, len, tags); |
| 1644 return array->raw(); |
| 1661 } | 1645 } |
| 1662 | 1646 |
| 1663 | 1647 |
| 1664 RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader, | 1648 RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader, |
| 1665 intptr_t object_id, | 1649 intptr_t object_id, |
| 1666 intptr_t tags, | 1650 intptr_t tags, |
| 1667 Snapshot::Kind kind) { | 1651 Snapshot::Kind kind) { |
| 1668 ASSERT(reader != NULL); | 1652 ASSERT(reader != NULL); |
| 1669 | 1653 |
| 1670 // Read the length so that we can determine instance size to allocate. | 1654 // Read the length so that we can determine instance size to allocate. |
| 1671 intptr_t len = reader->ReadSmiValue(); | 1655 intptr_t len = reader->ReadSmiValue(); |
| 1672 ImmutableArray& array = ImmutableArray::ZoneHandle( | 1656 ImmutableArray* array = reinterpret_cast<ImmutableArray*>( |
| 1673 reader->isolate(), NEW_OBJECT_WITH_LEN(ImmutableArray, len)); | 1657 reader->GetBackwardReference(object_id)); |
| 1674 reader->AddBackwardReference(object_id, &array); | 1658 if (array == NULL) { |
| 1675 ArrayReadFrom(reader, array, len, tags); | 1659 array = &(ImmutableArray::ZoneHandle( |
| 1676 return array.raw(); | 1660 reader->isolate(), NEW_OBJECT_WITH_LEN(ImmutableArray, len))); |
| 1677 } | 1661 reader->AddBackwardReference(object_id, array, true); |
| 1678 | |
| 1679 | |
| 1680 static void ArrayWriteTo(SnapshotWriter* writer, | |
| 1681 intptr_t object_id, | |
| 1682 Snapshot::Kind kind, | |
| 1683 intptr_t array_kind, | |
| 1684 intptr_t tags, | |
| 1685 RawSmi* length, | |
| 1686 RawAbstractTypeArguments* type_arguments, | |
| 1687 RawObject* data[]) { | |
| 1688 ASSERT(writer != NULL); | |
| 1689 intptr_t len = Smi::Value(length); | |
| 1690 | |
| 1691 // Write out the serialization header value for this object. | |
| 1692 writer->WriteSerializationMarker(kInlined, object_id); | |
| 1693 | |
| 1694 // Write out the class and tags information. | |
| 1695 writer->WriteObjectHeader(array_kind, tags); | |
| 1696 | |
| 1697 // Write out the length field. | |
| 1698 writer->Write<RawObject*>(length); | |
| 1699 | |
| 1700 // Write out the type arguments. | |
| 1701 writer->WriteObject(type_arguments); | |
| 1702 | |
| 1703 // Write out the individual objects. | |
| 1704 for (intptr_t i = 0; i < len; i++) { | |
| 1705 writer->WriteObject(data[i]); | |
| 1706 } | 1662 } |
| 1663 reader->ArrayReadFrom(*array, len, tags); |
| 1664 return array->raw(); |
| 1707 } | 1665 } |
| 1708 | 1666 |
| 1709 | 1667 |
| 1710 void RawArray::WriteTo(SnapshotWriter* writer, | 1668 void RawArray::WriteTo(SnapshotWriter* writer, |
| 1711 intptr_t object_id, | 1669 intptr_t object_id, |
| 1712 Snapshot::Kind kind) { | 1670 Snapshot::Kind kind) { |
| 1713 ArrayWriteTo(writer, | 1671 writer->ArrayWriteTo(object_id, |
| 1714 object_id, | 1672 ObjectStore::kArrayClass, |
| 1715 kind, | 1673 writer->GetObjectTags(this), |
| 1716 ObjectStore::kArrayClass, | 1674 ptr()->length_, |
| 1717 writer->GetObjectTags(this), | 1675 ptr()->type_arguments_, |
| 1718 ptr()->length_, | 1676 ptr()->data()); |
| 1719 ptr()->type_arguments_, | |
| 1720 ptr()->data()); | |
| 1721 } | 1677 } |
| 1722 | 1678 |
| 1723 | 1679 |
| 1724 void RawImmutableArray::WriteTo(SnapshotWriter* writer, | 1680 void RawImmutableArray::WriteTo(SnapshotWriter* writer, |
| 1725 intptr_t object_id, | 1681 intptr_t object_id, |
| 1726 Snapshot::Kind kind) { | 1682 Snapshot::Kind kind) { |
| 1727 ArrayWriteTo(writer, | 1683 writer->ArrayWriteTo(object_id, |
| 1728 object_id, | 1684 ObjectStore::kImmutableArrayClass, |
| 1729 kind, | 1685 writer->GetObjectTags(this), |
| 1730 ObjectStore::kImmutableArrayClass, | 1686 ptr()->length_, |
| 1731 writer->GetObjectTags(this), | 1687 ptr()->type_arguments_, |
| 1732 ptr()->length_, | 1688 ptr()->data()); |
| 1733 ptr()->type_arguments_, | |
| 1734 ptr()->data()); | |
| 1735 } | 1689 } |
| 1736 | 1690 |
| 1737 | 1691 |
| 1738 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader, | 1692 RawGrowableObjectArray* GrowableObjectArray::ReadFrom(SnapshotReader* reader, |
| 1739 intptr_t object_id, | 1693 intptr_t object_id, |
| 1740 intptr_t tags, | 1694 intptr_t tags, |
| 1741 Snapshot::Kind kind) { | 1695 Snapshot::Kind kind) { |
| 1742 ASSERT(reader != NULL); | 1696 ASSERT(reader != NULL); |
| 1743 | 1697 |
| 1744 // Read the length so that we can determine instance size to allocate. | 1698 // Read the length so that we can determine instance size to allocate. |
| 1745 GrowableObjectArray& array = GrowableObjectArray::ZoneHandle( | 1699 GrowableObjectArray& array = GrowableObjectArray::ZoneHandle( |
| 1746 reader->isolate(), GrowableObjectArray::null()); | 1700 reader->isolate(), GrowableObjectArray::null()); |
| 1747 if (kind == Snapshot::kFull) { | 1701 if (kind == Snapshot::kFull) { |
| 1748 array = reader->NewGrowableObjectArray(); | 1702 array = reader->NewGrowableObjectArray(); |
| 1749 } else { | 1703 } else { |
| 1750 array = GrowableObjectArray::New(0); | 1704 array = GrowableObjectArray::New(0); |
| 1751 } | 1705 } |
| 1752 reader->AddBackwardReference(object_id, &array); | 1706 reader->AddBackwardReference(object_id, &array, true); |
| 1753 intptr_t length = reader->ReadSmiValue(); | 1707 intptr_t length = reader->ReadSmiValue(); |
| 1754 array.SetLength(length); | 1708 array.SetLength(length); |
| 1755 Array& contents = Array::Handle(); | 1709 Array& contents = Array::Handle(); |
| 1756 contents ^= reader->ReadObject(); | 1710 contents ^= reader->ReadObjectImpl(); |
| 1757 array.SetData(contents); | 1711 array.SetData(contents); |
| 1758 const AbstractTypeArguments& type_arguments = | 1712 const AbstractTypeArguments& type_arguments = |
| 1759 AbstractTypeArguments::Handle(contents.GetTypeArguments()); | 1713 AbstractTypeArguments::Handle(contents.GetTypeArguments()); |
| 1760 array.SetTypeArguments(type_arguments); | 1714 array.SetTypeArguments(type_arguments); |
| 1761 return array.raw(); | 1715 return array.raw(); |
| 1762 } | 1716 } |
| 1763 | 1717 |
| 1764 | 1718 |
| 1765 void RawGrowableObjectArray::WriteTo(SnapshotWriter* writer, | 1719 void RawGrowableObjectArray::WriteTo(SnapshotWriter* writer, |
| 1766 intptr_t object_id, | 1720 intptr_t object_id, |
| 1767 Snapshot::Kind kind) { | 1721 Snapshot::Kind kind) { |
| 1768 ASSERT(writer != NULL); | 1722 ASSERT(writer != NULL); |
| 1769 | 1723 |
| 1770 // Write out the serialization header value for this object. | 1724 // Write out the serialization header value for this object. |
| 1771 writer->WriteSerializationMarker(kInlined, object_id); | 1725 writer->WriteSerializationMarker(kInlined, object_id); |
| 1772 | 1726 |
| 1773 // Write out the class and tags information. | 1727 // Write out the class and tags information. |
| 1774 writer->WriteObjectHeader(ObjectStore::kGrowableObjectArrayClass, | 1728 writer->WriteObjectHeader(ObjectStore::kGrowableObjectArrayClass, |
| 1775 writer->GetObjectTags(this)); | 1729 writer->GetObjectTags(this)); |
| 1776 | 1730 |
| 1777 // Write out the used length field. | 1731 // Write out the used length field. |
| 1778 writer->Write<RawObject*>(ptr()->length_); | 1732 writer->Write<RawObject*>(ptr()->length_); |
| 1779 | 1733 |
| 1780 // Write out the Array object. | 1734 // Write out the Array object. |
| 1781 writer->WriteObject(ptr()->data_); | 1735 writer->WriteObjectImpl(ptr()->data_); |
| 1782 } | 1736 } |
| 1783 | 1737 |
| 1784 | 1738 |
| 1785 RawByteArray* ByteArray::ReadFrom(SnapshotReader* reader, | 1739 RawByteArray* ByteArray::ReadFrom(SnapshotReader* reader, |
| 1786 intptr_t object_id, | 1740 intptr_t object_id, |
| 1787 intptr_t tags, | 1741 intptr_t tags, |
| 1788 Snapshot::Kind kind) { | 1742 Snapshot::Kind kind) { |
| 1789 UNREACHABLE(); // ByteArray is an abstract class. | 1743 UNREACHABLE(); // ByteArray is an abstract class. |
| 1790 return ByteArray::null(); | 1744 return ByteArray::null(); |
| 1791 } | 1745 } |
| 1792 | 1746 |
| 1793 | 1747 |
| 1794 template<typename HandleT, typename RawT, typename ElementT> | 1748 template<typename HandleT, typename RawT, typename ElementT> |
| 1795 RawT* ByteArray::ReadFromImpl(SnapshotReader* reader, | 1749 RawT* ByteArray::ReadFromImpl(SnapshotReader* reader, |
| 1796 intptr_t object_id, | 1750 intptr_t object_id, |
| 1797 intptr_t tags, | 1751 intptr_t tags, |
| 1798 Snapshot::Kind kind) { | 1752 Snapshot::Kind kind) { |
| 1799 ASSERT(reader != NULL); | 1753 ASSERT(reader != NULL); |
| 1800 | 1754 |
| 1801 intptr_t len = reader->ReadSmiValue(); | 1755 intptr_t len = reader->ReadSmiValue(); |
| 1802 Heap::Space space = (kind == Snapshot::kFull) ? Heap::kOld : Heap::kNew; | 1756 Heap::Space space = (kind == Snapshot::kFull) ? Heap::kOld : Heap::kNew; |
| 1803 HandleT& result = | 1757 HandleT& result = |
| 1804 HandleT::ZoneHandle(reader->isolate(), HandleT::New(len, space)); | 1758 HandleT::ZoneHandle(reader->isolate(), HandleT::New(len, space)); |
| 1805 reader->AddBackwardReference(object_id, &result); | 1759 reader->AddBackwardReference(object_id, &result, true); |
| 1806 | 1760 |
| 1807 // Set the object tags. | 1761 // Set the object tags. |
| 1808 result.set_tags(tags); | 1762 result.set_tags(tags); |
| 1809 | 1763 |
| 1810 // Setup the array elements. | 1764 // Setup the array elements. |
| 1811 for (intptr_t i = 0; i < len; ++i) { | 1765 for (intptr_t i = 0; i < len; ++i) { |
| 1812 result.SetAt(i, reader->Read<ElementT>()); | 1766 result.SetAt(i, reader->Read<ElementT>()); |
| 1813 } | 1767 } |
| 1814 return result.raw(); | 1768 return result.raw(); |
| 1815 } | 1769 } |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1968 ASSERT(reader != NULL); | 1922 ASSERT(reader != NULL); |
| 1969 ASSERT(kind == Snapshot::kMessage); | 1923 ASSERT(kind == Snapshot::kMessage); |
| 1970 | 1924 |
| 1971 // Read the length so that we can determine instance size to allocate. | 1925 // Read the length so that we can determine instance size to allocate. |
| 1972 intptr_t len = reader->ReadSmiValue(); | 1926 intptr_t len = reader->ReadSmiValue(); |
| 1973 | 1927 |
| 1974 // Allocate JSRegExp object. | 1928 // Allocate JSRegExp object. |
| 1975 JSRegExp& regex = JSRegExp::ZoneHandle( | 1929 JSRegExp& regex = JSRegExp::ZoneHandle( |
| 1976 reader->isolate(), | 1930 reader->isolate(), |
| 1977 JSRegExp::New(len, (kind == Snapshot::kFull) ? Heap::kOld : Heap::kNew)); | 1931 JSRegExp::New(len, (kind == Snapshot::kFull) ? Heap::kOld : Heap::kNew)); |
| 1978 reader->AddBackwardReference(object_id, ®ex); | 1932 reader->AddBackwardReference(object_id, ®ex, true); |
| 1979 | 1933 |
| 1980 // Set the object tags. | 1934 // Set the object tags. |
| 1981 regex.set_tags(tags); | 1935 regex.set_tags(tags); |
| 1982 | 1936 |
| 1983 // Read and Set all the other fields. | 1937 // Read and Set all the other fields. |
| 1984 regex.raw_ptr()->num_bracket_expressions_ = reader->ReadAsSmi(); | 1938 regex.raw_ptr()->num_bracket_expressions_ = reader->ReadAsSmi(); |
| 1985 *reader->StringHandle() ^= reader->ReadObject(); | 1939 *reader->StringHandle() ^= reader->ReadObjectImpl(); |
| 1986 regex.raw_ptr()->pattern_ = (*reader->StringHandle()).raw(); | 1940 regex.raw_ptr()->pattern_ = (*reader->StringHandle()).raw(); |
| 1987 regex.raw_ptr()->type_ = reader->ReadIntptrValue(); | 1941 regex.raw_ptr()->type_ = reader->ReadIntptrValue(); |
| 1988 regex.raw_ptr()->flags_ = reader->ReadIntptrValue(); | 1942 regex.raw_ptr()->flags_ = reader->ReadIntptrValue(); |
| 1989 | 1943 |
| 1990 // TODO(5411462): Need to implement a way of recompiling the regex. | 1944 // TODO(5411462): Need to implement a way of recompiling the regex. |
| 1991 | 1945 |
| 1992 return regex.raw(); | 1946 return regex.raw(); |
| 1993 } | 1947 } |
| 1994 | 1948 |
| 1995 | 1949 |
| 1996 void RawJSRegExp::WriteTo(SnapshotWriter* writer, | 1950 void RawJSRegExp::WriteTo(SnapshotWriter* writer, |
| 1997 intptr_t object_id, | 1951 intptr_t object_id, |
| 1998 Snapshot::Kind kind) { | 1952 Snapshot::Kind kind) { |
| 1999 ASSERT(writer != NULL); | 1953 ASSERT(writer != NULL); |
| 2000 ASSERT(kind == Snapshot::kMessage); | 1954 ASSERT(kind == Snapshot::kMessage); |
| 2001 | 1955 |
| 2002 // Write out the serialization header value for this object. | 1956 // Write out the serialization header value for this object. |
| 2003 writer->WriteSerializationMarker(kInlined, object_id); | 1957 writer->WriteSerializationMarker(kInlined, object_id); |
| 2004 | 1958 |
| 2005 // Write out the class and tags information. | 1959 // Write out the class and tags information. |
| 2006 writer->WriteObjectHeader(ObjectStore::kJSRegExpClass, | 1960 writer->WriteObjectHeader(ObjectStore::kJSRegExpClass, |
| 2007 writer->GetObjectTags(this)); | 1961 writer->GetObjectTags(this)); |
| 2008 | 1962 |
| 2009 // Write out the data length field. | 1963 // Write out the data length field. |
| 2010 writer->Write<RawObject*>(ptr()->data_length_); | 1964 writer->Write<RawObject*>(ptr()->data_length_); |
| 2011 | 1965 |
| 2012 // Write out all the other fields. | 1966 // Write out all the other fields. |
| 2013 writer->Write<RawObject*>(ptr()->num_bracket_expressions_); | 1967 writer->Write<RawObject*>(ptr()->num_bracket_expressions_); |
| 2014 writer->WriteObject(ptr()->pattern_); | 1968 writer->WriteObjectImpl(ptr()->pattern_); |
| 2015 writer->WriteIntptrValue(ptr()->type_); | 1969 writer->WriteIntptrValue(ptr()->type_); |
| 2016 writer->WriteIntptrValue(ptr()->flags_); | 1970 writer->WriteIntptrValue(ptr()->flags_); |
| 2017 | 1971 |
| 2018 // Do not write out the data part which is native. | 1972 // Do not write out the data part which is native. |
| 2019 } | 1973 } |
| 2020 | 1974 |
| 2021 | 1975 |
| 2022 } // namespace dart | 1976 } // namespace dart |
| OLD | NEW |