OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/native_entry.h" | 5 #include "vm/native_entry.h" |
6 #include "vm/object.h" | 6 #include "vm/object.h" |
7 #include "vm/object_store.h" | 7 #include "vm/object_store.h" |
8 #include "vm/snapshot.h" | 8 #include "vm/snapshot.h" |
9 #include "vm/stub_code.h" | 9 #include "vm/stub_code.h" |
10 #include "vm/symbols.h" | 10 #include "vm/symbols.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 // Set all non object fields. | 70 // Set all non object fields. |
71 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { | 71 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { |
72 // Instance size of a VM defined class is already set up. | 72 // Instance size of a VM defined class is already set up. |
73 cls.set_instance_size_in_words(reader->Read<int32_t>()); | 73 cls.set_instance_size_in_words(reader->Read<int32_t>()); |
74 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); | 74 cls.set_next_field_offset_in_words(reader->Read<int32_t>()); |
75 } | 75 } |
76 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); | 76 cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>()); |
77 cls.set_num_type_arguments(reader->Read<int16_t>()); | 77 cls.set_num_type_arguments(reader->Read<int16_t>()); |
78 cls.set_num_own_type_arguments(reader->Read<int16_t>()); | 78 cls.set_num_own_type_arguments(reader->Read<int16_t>()); |
79 cls.set_num_native_fields(reader->Read<uint16_t>()); | 79 cls.set_num_native_fields(reader->Read<uint16_t>()); |
80 cls.set_token_pos(reader->Read<int32_t>()); | 80 cls.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
81 cls.set_state_bits(reader->Read<uint16_t>()); | 81 cls.set_state_bits(reader->Read<uint16_t>()); |
82 | 82 |
83 // Set all the object fields. | 83 // Set all the object fields. |
84 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); | 84 READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference); |
85 ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull)); | 85 ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull)); |
86 } else { | 86 } else { |
87 cls ^= reader->ReadClassId(object_id); | 87 cls ^= reader->ReadClassId(object_id); |
88 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); | 88 ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot()); |
89 } | 89 } |
90 return cls.raw(); | 90 return cls.raw(); |
(...skipping 29 matching lines...) Expand all Loading... |
120 // We don't write the instance size of VM defined classes as they | 120 // We don't write the instance size of VM defined classes as they |
121 // are already setup during initialization as part of pre populating | 121 // are already setup during initialization as part of pre populating |
122 // the class table. | 122 // the class table. |
123 writer->Write<int32_t>(ptr()->instance_size_in_words_); | 123 writer->Write<int32_t>(ptr()->instance_size_in_words_); |
124 writer->Write<int32_t>(ptr()->next_field_offset_in_words_); | 124 writer->Write<int32_t>(ptr()->next_field_offset_in_words_); |
125 } | 125 } |
126 writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_); | 126 writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_); |
127 writer->Write<uint16_t>(ptr()->num_type_arguments_); | 127 writer->Write<uint16_t>(ptr()->num_type_arguments_); |
128 writer->Write<uint16_t>(ptr()->num_own_type_arguments_); | 128 writer->Write<uint16_t>(ptr()->num_own_type_arguments_); |
129 writer->Write<uint16_t>(ptr()->num_native_fields_); | 129 writer->Write<uint16_t>(ptr()->num_native_fields_); |
130 writer->Write<int32_t>(ptr()->token_pos_); | 130 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
131 writer->Write<uint16_t>(ptr()->state_bits_); | 131 writer->Write<uint16_t>(ptr()->state_bits_); |
132 | 132 |
133 // Write out all the object pointer fields. | 133 // Write out all the object pointer fields. |
134 SnapshotWriterVisitor visitor(writer, kAsReference); | 134 SnapshotWriterVisitor visitor(writer, kAsReference); |
135 visitor.VisitPointers(from(), to()); | 135 visitor.VisitPointers(from(), to()); |
136 } else { | 136 } else { |
137 if (writer->can_send_any_object() || | 137 if (writer->can_send_any_object() || |
138 writer->AllowObjectsInDartLibrary(ptr()->library_)) { | 138 writer->AllowObjectsInDartLibrary(ptr()->library_)) { |
139 writer->WriteClassId(this); | 139 writer->WriteClassId(this); |
140 } else { | 140 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
153 Snapshot::Kind kind, | 153 Snapshot::Kind kind, |
154 bool as_reference) { | 154 bool as_reference) { |
155 ASSERT(reader != NULL); | 155 ASSERT(reader != NULL); |
156 | 156 |
157 // Allocate unresolved class object. | 157 // Allocate unresolved class object. |
158 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( | 158 UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle( |
159 reader->zone(), NEW_OBJECT(UnresolvedClass)); | 159 reader->zone(), NEW_OBJECT(UnresolvedClass)); |
160 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); | 160 reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized); |
161 | 161 |
162 // Set all non object fields. | 162 // Set all non object fields. |
163 unresolved_class.set_token_pos(reader->Read<int32_t>()); | 163 unresolved_class.set_token_pos( |
| 164 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
164 | 165 |
165 // Set all the object fields. | 166 // Set all the object fields. |
166 READ_OBJECT_FIELDS(unresolved_class, | 167 READ_OBJECT_FIELDS(unresolved_class, |
167 unresolved_class.raw()->from(), | 168 unresolved_class.raw()->from(), |
168 unresolved_class.raw()->to(), | 169 unresolved_class.raw()->to(), |
169 kAsReference); | 170 kAsReference); |
170 | 171 |
171 return unresolved_class.raw(); | 172 return unresolved_class.raw(); |
172 } | 173 } |
173 | 174 |
174 | 175 |
175 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, | 176 void RawUnresolvedClass::WriteTo(SnapshotWriter* writer, |
176 intptr_t object_id, | 177 intptr_t object_id, |
177 Snapshot::Kind kind, | 178 Snapshot::Kind kind, |
178 bool as_reference) { | 179 bool as_reference) { |
179 ASSERT(writer != NULL); | 180 ASSERT(writer != NULL); |
180 | 181 |
181 // Write out the serialization header value for this object. | 182 // Write out the serialization header value for this object. |
182 writer->WriteInlinedObjectHeader(object_id); | 183 writer->WriteInlinedObjectHeader(object_id); |
183 | 184 |
184 // Write out the class and tags information. | 185 // Write out the class and tags information. |
185 writer->WriteVMIsolateObject(kUnresolvedClassCid); | 186 writer->WriteVMIsolateObject(kUnresolvedClassCid); |
186 writer->WriteTags(writer->GetObjectTags(this)); | 187 writer->WriteTags(writer->GetObjectTags(this)); |
187 | 188 |
188 // Write out all the non object pointer fields. | 189 // Write out all the non object pointer fields. |
189 writer->Write<int32_t>(ptr()->token_pos_); | 190 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
190 | 191 |
191 // Write out all the object pointer fields. | 192 // Write out all the object pointer fields. |
192 SnapshotWriterVisitor visitor(writer, kAsReference); | 193 SnapshotWriterVisitor visitor(writer, kAsReference); |
193 visitor.VisitPointers(from(), to()); | 194 visitor.VisitPointers(from(), to()); |
194 } | 195 } |
195 | 196 |
196 | 197 |
197 RawAbstractType* AbstractType::ReadFrom(SnapshotReader* reader, | 198 RawAbstractType* AbstractType::ReadFrom(SnapshotReader* reader, |
198 intptr_t object_id, | 199 intptr_t object_id, |
199 intptr_t tags, | 200 intptr_t tags, |
(...skipping 23 matching lines...) Expand all Loading... |
223 bool typeclass_is_in_fullsnapshot = reader->Read<bool>(); | 224 bool typeclass_is_in_fullsnapshot = reader->Read<bool>(); |
224 | 225 |
225 // Allocate type object. | 226 // Allocate type object. |
226 Type& type = Type::ZoneHandle(reader->zone(), NEW_OBJECT(Type)); | 227 Type& type = Type::ZoneHandle(reader->zone(), NEW_OBJECT(Type)); |
227 bool is_canonical = RawObject::IsCanonical(tags); | 228 bool is_canonical = RawObject::IsCanonical(tags); |
228 bool defer_canonicalization = is_canonical && | 229 bool defer_canonicalization = is_canonical && |
229 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot); | 230 (kind != Snapshot::kFull && typeclass_is_in_fullsnapshot); |
230 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); | 231 reader->AddBackRef(object_id, &type, kIsDeserialized, defer_canonicalization); |
231 | 232 |
232 // Set all non object fields. | 233 // Set all non object fields. |
233 type.set_token_pos(reader->Read<int32_t>()); | 234 type.set_token_pos(TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
234 type.set_type_state(reader->Read<int8_t>()); | 235 type.set_type_state(reader->Read<int8_t>()); |
235 | 236 |
236 // Set all the object fields. | 237 // Set all the object fields. |
237 READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), kAsReference); | 238 READ_OBJECT_FIELDS(type, type.raw()->from(), type.raw()->to(), kAsReference); |
238 | 239 |
239 // Set the canonical bit. | 240 // Set the canonical bit. |
240 if (!defer_canonicalization && is_canonical) { | 241 if (!defer_canonicalization && is_canonical) { |
241 type.SetCanonical(); | 242 type.SetCanonical(); |
242 } | 243 } |
243 | 244 |
(...skipping 21 matching lines...) Expand all Loading... |
265 | 266 |
266 // Write out typeclass_is_in_fullsnapshot first as this will | 267 // Write out typeclass_is_in_fullsnapshot first as this will |
267 // help the reader decide on how to canonicalize the type object. | 268 // help the reader decide on how to canonicalize the type object. |
268 intptr_t tags = writer->GetObjectTags(ptr()->type_class_); | 269 intptr_t tags = writer->GetObjectTags(ptr()->type_class_); |
269 bool typeclass_is_in_fullsnapshot = | 270 bool typeclass_is_in_fullsnapshot = |
270 (ClassIdTag::decode(tags) == kClassCid) && | 271 (ClassIdTag::decode(tags) == kClassCid) && |
271 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->type_class_)); | 272 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->type_class_)); |
272 writer->Write<bool>(typeclass_is_in_fullsnapshot); | 273 writer->Write<bool>(typeclass_is_in_fullsnapshot); |
273 | 274 |
274 // Write out all the non object pointer fields. | 275 // Write out all the non object pointer fields. |
275 writer->Write<int32_t>(ptr()->token_pos_); | 276 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
276 writer->Write<int8_t>(ptr()->type_state_); | 277 writer->Write<int8_t>(ptr()->type_state_); |
277 | 278 |
278 // Write out all the object pointer fields. | 279 // Write out all the object pointer fields. |
279 ASSERT(ptr()->type_class_ != Object::null()); | 280 ASSERT(ptr()->type_class_ != Object::null()); |
280 SnapshotWriterVisitor visitor(writer, kAsReference); | 281 SnapshotWriterVisitor visitor(writer, kAsReference); |
281 visitor.VisitPointers(from(), to()); | 282 visitor.VisitPointers(from(), to()); |
282 } | 283 } |
283 | 284 |
284 | 285 |
285 RawFunctionType* FunctionType::ReadFrom(SnapshotReader* reader, | 286 RawFunctionType* FunctionType::ReadFrom(SnapshotReader* reader, |
(...skipping 11 matching lines...) Expand all Loading... |
297 FunctionType::ZoneHandle(reader->zone(), NEW_OBJECT(FunctionType)); | 298 FunctionType::ZoneHandle(reader->zone(), NEW_OBJECT(FunctionType)); |
298 bool is_canonical = RawObject::IsCanonical(tags); | 299 bool is_canonical = RawObject::IsCanonical(tags); |
299 bool defer_canonicalization = is_canonical && | 300 bool defer_canonicalization = is_canonical && |
300 (kind != Snapshot::kFull && scopeclass_is_in_fullsnapshot); | 301 (kind != Snapshot::kFull && scopeclass_is_in_fullsnapshot); |
301 reader->AddBackRef(object_id, | 302 reader->AddBackRef(object_id, |
302 &function_type, | 303 &function_type, |
303 kIsDeserialized, | 304 kIsDeserialized, |
304 defer_canonicalization); | 305 defer_canonicalization); |
305 | 306 |
306 // Set all non object fields. | 307 // Set all non object fields. |
307 function_type.set_token_pos(reader->Read<int32_t>()); | 308 function_type.set_token_pos( |
| 309 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
308 function_type.set_type_state(reader->Read<int8_t>()); | 310 function_type.set_type_state(reader->Read<int8_t>()); |
309 | 311 |
310 // Set all the object fields. | 312 // Set all the object fields. |
311 READ_OBJECT_FIELDS(function_type, | 313 READ_OBJECT_FIELDS(function_type, |
312 function_type.raw()->from(), function_type.raw()->to(), | 314 function_type.raw()->from(), function_type.raw()->to(), |
313 kAsReference); | 315 kAsReference); |
314 | 316 |
315 // Set the canonical bit. | 317 // Set the canonical bit. |
316 if (!defer_canonicalization && is_canonical) { | 318 if (!defer_canonicalization && is_canonical) { |
317 function_type.SetCanonical(); | 319 function_type.SetCanonical(); |
(...skipping 23 matching lines...) Expand all Loading... |
341 | 343 |
342 // Write out scopeclass_is_in_fullsnapshot first as this will | 344 // Write out scopeclass_is_in_fullsnapshot first as this will |
343 // help the reader decide on how to canonicalize the type object. | 345 // help the reader decide on how to canonicalize the type object. |
344 intptr_t tags = writer->GetObjectTags(ptr()->scope_class_); | 346 intptr_t tags = writer->GetObjectTags(ptr()->scope_class_); |
345 bool scopeclass_is_in_fullsnapshot = | 347 bool scopeclass_is_in_fullsnapshot = |
346 (ClassIdTag::decode(tags) == kClassCid) && | 348 (ClassIdTag::decode(tags) == kClassCid) && |
347 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->scope_class_)); | 349 Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->scope_class_)); |
348 writer->Write<bool>(scopeclass_is_in_fullsnapshot); | 350 writer->Write<bool>(scopeclass_is_in_fullsnapshot); |
349 | 351 |
350 // Write out all the non object pointer fields. | 352 // Write out all the non object pointer fields. |
351 writer->Write<int32_t>(ptr()->token_pos_); | 353 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
352 writer->Write<int8_t>(ptr()->type_state_); | 354 writer->Write<int8_t>(ptr()->type_state_); |
353 | 355 |
354 // Write out all the object pointer fields. | 356 // Write out all the object pointer fields. |
355 ASSERT(ptr()->scope_class_ != Object::null()); | 357 ASSERT(ptr()->scope_class_ != Object::null()); |
356 SnapshotWriterVisitor visitor(writer, kAsReference); | 358 SnapshotWriterVisitor visitor(writer, kAsReference); |
357 visitor.VisitPointers(from(), to()); | 359 visitor.VisitPointers(from(), to()); |
358 } | 360 } |
359 | 361 |
360 | 362 |
361 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader, | 363 RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 Snapshot::Kind kind, | 406 Snapshot::Kind kind, |
405 bool as_reference) { | 407 bool as_reference) { |
406 ASSERT(reader != NULL); | 408 ASSERT(reader != NULL); |
407 | 409 |
408 // Allocate type parameter object. | 410 // Allocate type parameter object. |
409 TypeParameter& type_parameter = TypeParameter::ZoneHandle( | 411 TypeParameter& type_parameter = TypeParameter::ZoneHandle( |
410 reader->zone(), NEW_OBJECT(TypeParameter)); | 412 reader->zone(), NEW_OBJECT(TypeParameter)); |
411 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); | 413 reader->AddBackRef(object_id, &type_parameter, kIsDeserialized); |
412 | 414 |
413 // Set all non object fields. | 415 // Set all non object fields. |
414 type_parameter.set_token_pos(reader->Read<int32_t>()); | 416 type_parameter.set_token_pos( |
| 417 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
415 type_parameter.set_index(reader->Read<int16_t>()); | 418 type_parameter.set_index(reader->Read<int16_t>()); |
416 type_parameter.set_type_state(reader->Read<int8_t>()); | 419 type_parameter.set_type_state(reader->Read<int8_t>()); |
417 | 420 |
418 // Set all the object fields. | 421 // Set all the object fields. |
419 READ_OBJECT_FIELDS(type_parameter, | 422 READ_OBJECT_FIELDS(type_parameter, |
420 type_parameter.raw()->from(), type_parameter.raw()->to(), | 423 type_parameter.raw()->from(), type_parameter.raw()->to(), |
421 kAsReference); | 424 kAsReference); |
422 | 425 |
423 return type_parameter.raw(); | 426 return type_parameter.raw(); |
424 } | 427 } |
425 | 428 |
426 | 429 |
427 void RawTypeParameter::WriteTo(SnapshotWriter* writer, | 430 void RawTypeParameter::WriteTo(SnapshotWriter* writer, |
428 intptr_t object_id, | 431 intptr_t object_id, |
429 Snapshot::Kind kind, | 432 Snapshot::Kind kind, |
430 bool as_reference) { | 433 bool as_reference) { |
431 ASSERT(writer != NULL); | 434 ASSERT(writer != NULL); |
432 | 435 |
433 // Only finalized type parameters should be written to a snapshot. | 436 // Only finalized type parameters should be written to a snapshot. |
434 ASSERT(ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated); | 437 ASSERT(ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated); |
435 | 438 |
436 // Write out the serialization header value for this object. | 439 // Write out the serialization header value for this object. |
437 writer->WriteInlinedObjectHeader(object_id); | 440 writer->WriteInlinedObjectHeader(object_id); |
438 | 441 |
439 // Write out the class and tags information. | 442 // Write out the class and tags information. |
440 writer->WriteIndexedObject(kTypeParameterCid); | 443 writer->WriteIndexedObject(kTypeParameterCid); |
441 writer->WriteTags(writer->GetObjectTags(this)); | 444 writer->WriteTags(writer->GetObjectTags(this)); |
442 | 445 |
443 // Write out all the non object pointer fields. | 446 // Write out all the non object pointer fields. |
444 writer->Write<int32_t>(ptr()->token_pos_); | 447 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
445 writer->Write<int16_t>(ptr()->index_); | 448 writer->Write<int16_t>(ptr()->index_); |
446 writer->Write<int8_t>(ptr()->type_state_); | 449 writer->Write<int8_t>(ptr()->type_state_); |
447 | 450 |
448 // Write out all the object pointer fields. | 451 // Write out all the object pointer fields. |
449 SnapshotWriterVisitor visitor(writer, kAsReference); | 452 SnapshotWriterVisitor visitor(writer, kAsReference); |
450 visitor.VisitPointers(from(), to()); | 453 visitor.VisitPointers(from(), to()); |
451 } | 454 } |
452 | 455 |
453 | 456 |
454 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader, | 457 RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader, |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 reader->zone(), NEW_OBJECT(Function)); | 793 reader->zone(), NEW_OBJECT(Function)); |
791 reader->AddBackRef(object_id, &func, kIsDeserialized); | 794 reader->AddBackRef(object_id, &func, kIsDeserialized); |
792 | 795 |
793 // Set all the non object fields. Read the token positions now but | 796 // Set all the non object fields. Read the token positions now but |
794 // don't set them until after setting the kind. | 797 // don't set them until after setting the kind. |
795 const int32_t token_pos = reader->Read<int32_t>(); | 798 const int32_t token_pos = reader->Read<int32_t>(); |
796 const int32_t end_token_pos = reader->Read<uint32_t>(); | 799 const int32_t end_token_pos = reader->Read<uint32_t>(); |
797 func.set_num_fixed_parameters(reader->Read<int16_t>()); | 800 func.set_num_fixed_parameters(reader->Read<int16_t>()); |
798 func.set_num_optional_parameters(reader->Read<int16_t>()); | 801 func.set_num_optional_parameters(reader->Read<int16_t>()); |
799 func.set_kind_tag(reader->Read<uint32_t>()); | 802 func.set_kind_tag(reader->Read<uint32_t>()); |
800 func.set_token_pos(token_pos); | 803 func.set_token_pos(TokenPosition::SnapshotDecode(token_pos)); |
801 func.set_end_token_pos(end_token_pos); | 804 func.set_end_token_pos(TokenPosition::SnapshotDecode(end_token_pos)); |
802 if (reader->snapshot_code()) { | 805 if (reader->snapshot_code()) { |
803 func.set_usage_counter(0); | 806 func.set_usage_counter(0); |
804 func.set_deoptimization_counter(0); | 807 func.set_deoptimization_counter(0); |
805 func.set_optimized_instruction_count(0); | 808 func.set_optimized_instruction_count(0); |
806 func.set_optimized_call_site_count(0); | 809 func.set_optimized_call_site_count(0); |
807 } else { | 810 } else { |
808 func.set_usage_counter(reader->Read<int32_t>()); | 811 func.set_usage_counter(reader->Read<int32_t>()); |
809 func.set_deoptimization_counter(reader->Read<int16_t>()); | 812 func.set_deoptimization_counter(reader->Read<int16_t>()); |
810 func.set_optimized_instruction_count(reader->Read<uint16_t>()); | 813 func.set_optimized_instruction_count(reader->Read<uint16_t>()); |
811 func.set_optimized_call_site_count(reader->Read<uint16_t>()); | 814 func.set_optimized_call_site_count(reader->Read<uint16_t>()); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 | 870 |
868 // Write out the boolean is_in_fullsnapshot first as this will | 871 // Write out the boolean is_in_fullsnapshot first as this will |
869 // help the reader decide how the rest of the information needs | 872 // help the reader decide how the rest of the information needs |
870 // to be interpreted. | 873 // to be interpreted. |
871 writer->Write<bool>(is_in_fullsnapshot); | 874 writer->Write<bool>(is_in_fullsnapshot); |
872 | 875 |
873 if (kind == Snapshot::kFull || !is_in_fullsnapshot) { | 876 if (kind == Snapshot::kFull || !is_in_fullsnapshot) { |
874 bool is_optimized = Code::IsOptimized(ptr()->code_); | 877 bool is_optimized = Code::IsOptimized(ptr()->code_); |
875 | 878 |
876 // Write out all the non object fields. | 879 // Write out all the non object fields. |
877 writer->Write<int32_t>(ptr()->token_pos_); | 880 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
878 writer->Write<int32_t>(ptr()->end_token_pos_); | 881 writer->Write<int32_t>(ptr()->end_token_pos_.SnapshotEncode()); |
879 writer->Write<int16_t>(ptr()->num_fixed_parameters_); | 882 writer->Write<int16_t>(ptr()->num_fixed_parameters_); |
880 writer->Write<int16_t>(ptr()->num_optional_parameters_); | 883 writer->Write<int16_t>(ptr()->num_optional_parameters_); |
881 writer->Write<uint32_t>(ptr()->kind_tag_); | 884 writer->Write<uint32_t>(ptr()->kind_tag_); |
882 if (writer->snapshot_code()) { | 885 if (writer->snapshot_code()) { |
883 // Omit fields used to support de/reoptimization. | 886 // Omit fields used to support de/reoptimization. |
884 } else { | 887 } else { |
885 if (is_optimized) { | 888 if (is_optimized) { |
886 writer->Write<int32_t>(FLAG_optimization_counter_threshold); | 889 writer->Write<int32_t>(FLAG_optimization_counter_threshold); |
887 } else { | 890 } else { |
888 writer->Write<int32_t>(0); | 891 writer->Write<int32_t>(0); |
(...skipping 30 matching lines...) Expand all Loading... |
919 bool as_reference) { | 922 bool as_reference) { |
920 ASSERT(reader != NULL); | 923 ASSERT(reader != NULL); |
921 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); | 924 ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull)); |
922 | 925 |
923 // Allocate field object. | 926 // Allocate field object. |
924 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field)); | 927 Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field)); |
925 reader->AddBackRef(object_id, &field, kIsDeserialized); | 928 reader->AddBackRef(object_id, &field, kIsDeserialized); |
926 | 929 |
927 // Set all non object fields. | 930 // Set all non object fields. |
928 if (reader->snapshot_code()) { | 931 if (reader->snapshot_code()) { |
929 field.set_token_pos(0); | 932 field.set_token_pos(TokenPosition::kNoSource); |
930 ASSERT(!FLAG_use_field_guards); | 933 ASSERT(!FLAG_use_field_guards); |
931 field.set_guarded_cid(kDynamicCid); | 934 field.set_guarded_cid(kDynamicCid); |
932 field.set_is_nullable(true); | 935 field.set_is_nullable(true); |
933 } else { | 936 } else { |
934 field.set_token_pos(reader->Read<int32_t>()); | 937 field.set_token_pos( |
| 938 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
935 field.set_guarded_cid(reader->Read<int32_t>()); | 939 field.set_guarded_cid(reader->Read<int32_t>()); |
936 field.set_is_nullable(reader->Read<int32_t>()); | 940 field.set_is_nullable(reader->Read<int32_t>()); |
937 } | 941 } |
938 field.set_kind_bits(reader->Read<uint8_t>()); | 942 field.set_kind_bits(reader->Read<uint8_t>()); |
939 | 943 |
940 // Set all the object fields. | 944 // Set all the object fields. |
941 RawObject** toobj = reader->snapshot_code() | 945 RawObject** toobj = reader->snapshot_code() |
942 ? field.raw()->to_precompiled_snapshot() | 946 ? field.raw()->to_precompiled_snapshot() |
943 : field.raw()->to(); | 947 : field.raw()->to(); |
944 READ_OBJECT_FIELDS(field, | 948 READ_OBJECT_FIELDS(field, |
(...skipping 21 matching lines...) Expand all Loading... |
966 | 970 |
967 // Write out the serialization header value for this object. | 971 // Write out the serialization header value for this object. |
968 writer->WriteInlinedObjectHeader(object_id); | 972 writer->WriteInlinedObjectHeader(object_id); |
969 | 973 |
970 // Write out the class and tags information. | 974 // Write out the class and tags information. |
971 writer->WriteVMIsolateObject(kFieldCid); | 975 writer->WriteVMIsolateObject(kFieldCid); |
972 writer->WriteTags(writer->GetObjectTags(this)); | 976 writer->WriteTags(writer->GetObjectTags(this)); |
973 | 977 |
974 // Write out all the non object fields. | 978 // Write out all the non object fields. |
975 if (!writer->snapshot_code()) { | 979 if (!writer->snapshot_code()) { |
976 writer->Write<int32_t>(ptr()->token_pos_); | 980 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
977 writer->Write<int32_t>(ptr()->guarded_cid_); | 981 writer->Write<int32_t>(ptr()->guarded_cid_); |
978 writer->Write<int32_t>(ptr()->is_nullable_); | 982 writer->Write<int32_t>(ptr()->is_nullable_); |
979 } | 983 } |
980 writer->Write<uint8_t>(ptr()->kind_bits_); | 984 writer->Write<uint8_t>(ptr()->kind_bits_); |
981 | 985 |
982 // Write out the name. | 986 // Write out the name. |
983 writer->WriteObjectImpl(ptr()->name_, kAsReference); | 987 writer->WriteObjectImpl(ptr()->name_, kAsReference); |
984 // Write out the owner. | 988 // Write out the owner. |
985 writer->WriteObjectImpl(ptr()->owner_, kAsReference); | 989 writer->WriteObjectImpl(ptr()->owner_, kAsReference); |
986 // Write out the type. | 990 // Write out the type. |
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 context_scope = reader->NewContextScope(1); | 1957 context_scope = reader->NewContextScope(1); |
1954 context_scope.set_is_implicit(true); | 1958 context_scope.set_is_implicit(true); |
1955 } else { | 1959 } else { |
1956 context_scope = ContextScope::New(1, true); | 1960 context_scope = ContextScope::New(1, true); |
1957 } | 1961 } |
1958 reader->AddBackRef(object_id, &context_scope, kIsDeserialized); | 1962 reader->AddBackRef(object_id, &context_scope, kIsDeserialized); |
1959 | 1963 |
1960 *reader->TypeHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); | 1964 *reader->TypeHandle() ^= reader->ReadObjectImpl(kAsInlinedObject); |
1961 | 1965 |
1962 // Create a descriptor for 'this' variable. | 1966 // Create a descriptor for 'this' variable. |
1963 context_scope.SetTokenIndexAt(0, 0); | 1967 context_scope.SetTokenIndexAt(0, TokenPosition::kMinSource); |
1964 context_scope.SetNameAt(0, Symbols::This()); | 1968 context_scope.SetNameAt(0, Symbols::This()); |
1965 context_scope.SetIsFinalAt(0, true); | 1969 context_scope.SetIsFinalAt(0, true); |
1966 context_scope.SetIsConstAt(0, false); | 1970 context_scope.SetIsConstAt(0, false); |
1967 context_scope.SetTypeAt(0, *reader->TypeHandle()); | 1971 context_scope.SetTypeAt(0, *reader->TypeHandle()); |
1968 context_scope.SetContextIndexAt(0, 0); | 1972 context_scope.SetContextIndexAt(0, 0); |
1969 context_scope.SetContextLevelAt(0, 0); | 1973 context_scope.SetContextLevelAt(0, 0); |
1970 return context_scope.raw(); | 1974 return context_scope.raw(); |
1971 } | 1975 } |
1972 UNREACHABLE(); | 1976 UNREACHABLE(); |
1973 return NULL; | 1977 return NULL; |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2202 Snapshot::Kind kind, | 2206 Snapshot::Kind kind, |
2203 bool as_reference) { | 2207 bool as_reference) { |
2204 ASSERT(reader != NULL); | 2208 ASSERT(reader != NULL); |
2205 | 2209 |
2206 // Allocate LanguageError object. | 2210 // Allocate LanguageError object. |
2207 LanguageError& language_error = | 2211 LanguageError& language_error = |
2208 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError)); | 2212 LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError)); |
2209 reader->AddBackRef(object_id, &language_error, kIsDeserialized); | 2213 reader->AddBackRef(object_id, &language_error, kIsDeserialized); |
2210 | 2214 |
2211 // Set all non object fields. | 2215 // Set all non object fields. |
2212 language_error.set_token_pos(reader->Read<int32_t>()); | 2216 language_error.set_token_pos( |
| 2217 TokenPosition::SnapshotDecode(reader->Read<int32_t>())); |
2213 language_error.set_report_after_token(reader->Read<bool>()); | 2218 language_error.set_report_after_token(reader->Read<bool>()); |
2214 language_error.set_kind(reader->Read<uint8_t>()); | 2219 language_error.set_kind(reader->Read<uint8_t>()); |
2215 | 2220 |
2216 // Set all the object fields. | 2221 // Set all the object fields. |
2217 READ_OBJECT_FIELDS(language_error, | 2222 READ_OBJECT_FIELDS(language_error, |
2218 language_error.raw()->from(), language_error.raw()->to(), | 2223 language_error.raw()->from(), language_error.raw()->to(), |
2219 kAsReference); | 2224 kAsReference); |
2220 | 2225 |
2221 return language_error.raw(); | 2226 return language_error.raw(); |
2222 } | 2227 } |
2223 | 2228 |
2224 | 2229 |
2225 void RawLanguageError::WriteTo(SnapshotWriter* writer, | 2230 void RawLanguageError::WriteTo(SnapshotWriter* writer, |
2226 intptr_t object_id, | 2231 intptr_t object_id, |
2227 Snapshot::Kind kind, | 2232 Snapshot::Kind kind, |
2228 bool as_reference) { | 2233 bool as_reference) { |
2229 ASSERT(writer != NULL); | 2234 ASSERT(writer != NULL); |
2230 | 2235 |
2231 // Write out the serialization header value for this object. | 2236 // Write out the serialization header value for this object. |
2232 writer->WriteInlinedObjectHeader(object_id); | 2237 writer->WriteInlinedObjectHeader(object_id); |
2233 | 2238 |
2234 // Write out the class and tags information. | 2239 // Write out the class and tags information. |
2235 writer->WriteVMIsolateObject(kLanguageErrorCid); | 2240 writer->WriteVMIsolateObject(kLanguageErrorCid); |
2236 writer->WriteTags(writer->GetObjectTags(this)); | 2241 writer->WriteTags(writer->GetObjectTags(this)); |
2237 | 2242 |
2238 // Write out all the non object fields. | 2243 // Write out all the non object fields. |
2239 writer->Write<int32_t>(ptr()->token_pos_); | 2244 writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode()); |
2240 writer->Write<bool>(ptr()->report_after_token_); | 2245 writer->Write<bool>(ptr()->report_after_token_); |
2241 writer->Write<uint8_t>(ptr()->kind_); | 2246 writer->Write<uint8_t>(ptr()->kind_); |
2242 | 2247 |
2243 // Write out all the object pointer fields. | 2248 // Write out all the object pointer fields. |
2244 SnapshotWriterVisitor visitor(writer, kAsReference); | 2249 SnapshotWriterVisitor visitor(writer, kAsReference); |
2245 visitor.VisitPointers(from(), to()); | 2250 visitor.VisitPointers(from(), to()); |
2246 } | 2251 } |
2247 | 2252 |
2248 | 2253 |
2249 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, | 2254 RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, |
(...skipping 1437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3687 // We do not allow objects with native fields in an isolate message. | 3692 // We do not allow objects with native fields in an isolate message. |
3688 writer->SetWriteException(Exceptions::kArgument, | 3693 writer->SetWriteException(Exceptions::kArgument, |
3689 "Illegal argument in isolate message" | 3694 "Illegal argument in isolate message" |
3690 " : (object is a UserTag)"); | 3695 " : (object is a UserTag)"); |
3691 } else { | 3696 } else { |
3692 UNREACHABLE(); | 3697 UNREACHABLE(); |
3693 } | 3698 } |
3694 } | 3699 } |
3695 | 3700 |
3696 } // namespace dart | 3701 } // namespace dart |
OLD | NEW |