| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/object.h" | 5 #include "vm/object.h" |
| 6 #include "vm/object_store.h" | 6 #include "vm/object_store.h" |
| 7 #include "vm/snapshot.h" | 7 #include "vm/snapshot.h" |
| 8 #include "vm/stub_code.h" | 8 #include "vm/stub_code.h" |
| 9 #include "vm/symbols.h" | 9 #include "vm/symbols.h" |
| 10 #include "vm/visitor.h" | 10 #include "vm/visitor.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 RawClass* Class::ReadFrom(SnapshotReader* reader, | 25 RawClass* Class::ReadFrom(SnapshotReader* reader, |
| 26 intptr_t object_id, | 26 intptr_t object_id, |
| 27 intptr_t tags, | 27 intptr_t tags, |
| 28 Snapshot::Kind kind) { | 28 Snapshot::Kind kind) { |
| 29 ASSERT(reader != NULL); | 29 ASSERT(reader != NULL); |
| 30 | 30 |
| 31 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); | 31 Class& cls = Class::ZoneHandle(reader->zone(), Class::null()); |
| 32 if ((kind == Snapshot::kFull) || | 32 if ((kind == Snapshot::kFull) || |
| 33 (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) { | 33 (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) { |
| 34 // Read in the base information. | 34 // Read in the base information. |
| 35 int32_t class_id = reader->Read<int32_t>(); | 35 cid_t class_id = reader->Read<cid_t>(); |
| 36 | 36 |
| 37 // Allocate class object of specified kind. | 37 // Allocate class object of specified kind. |
| 38 if (kind == Snapshot::kFull) { | 38 if (kind == Snapshot::kFull) { |
| 39 cls = reader->NewClass(class_id); | 39 cls = reader->NewClass(class_id); |
| 40 } else { | 40 } else { |
| 41 if (class_id < kNumPredefinedCids) { | 41 if (class_id < kNumPredefinedCids) { |
| 42 ASSERT((class_id >= kInstanceCid) && (class_id <= kMirrorReferenceCid)); | 42 ASSERT((class_id >= kInstanceCid) && (class_id <= kMirrorReferenceCid)); |
| 43 cls = reader->isolate()->class_table()->At(class_id); | 43 cls = reader->isolate()->class_table()->At(class_id); |
| 44 } else { | 44 } else { |
| 45 cls = New<Instance>(kIllegalCid); | 45 cls = New<Instance>(kIllegalCid); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 | 89 |
| 90 if ((kind == Snapshot::kFull) || | 90 if ((kind == Snapshot::kFull) || |
| 91 (kind == Snapshot::kScript && | 91 (kind == Snapshot::kScript && |
| 92 !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)))) { | 92 !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)))) { |
| 93 // Write out the class and tags information. | 93 // Write out the class and tags information. |
| 94 writer->WriteVMIsolateObject(kClassCid); | 94 writer->WriteVMIsolateObject(kClassCid); |
| 95 writer->WriteTags(writer->GetObjectTags(this)); | 95 writer->WriteTags(writer->GetObjectTags(this)); |
| 96 | 96 |
| 97 // Write out all the non object pointer fields. | 97 // Write out all the non object pointer fields. |
| 98 // NOTE: cpp_vtable_ is not written. | 98 // NOTE: cpp_vtable_ is not written. |
| 99 int32_t class_id = ptr()->id_; | 99 cid_t class_id = ptr()->id_; |
| 100 writer->Write<int32_t>(class_id); | 100 writer->Write<cid_t>(class_id); |
| 101 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { | 101 if (!RawObject::IsInternalVMdefinedClassId(class_id)) { |
| 102 // We don't write the instance size of VM defined classes as they | 102 // We don't write the instance size of VM defined classes as they |
| 103 // are already setup during initialization as part of pre populating | 103 // are already setup during initialization as part of pre populating |
| 104 // the class table. | 104 // the class table. |
| 105 writer->Write<int32_t>(ptr()->instance_size_in_words_); | 105 writer->Write<int32_t>(ptr()->instance_size_in_words_); |
| 106 writer->Write<int32_t>(ptr()->next_field_offset_in_words_); | 106 writer->Write<int32_t>(ptr()->next_field_offset_in_words_); |
| 107 } | 107 } |
| 108 writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_); | 108 writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_); |
| 109 writer->Write<int16_t>(ptr()->num_type_arguments_); | 109 writer->Write<int16_t>(ptr()->num_type_arguments_); |
| 110 writer->Write<int16_t>(ptr()->num_own_type_arguments_); | 110 writer->Write<int16_t>(ptr()->num_own_type_arguments_); |
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 // Set the object tags. | 701 // Set the object tags. |
| 702 func.set_tags(tags); | 702 func.set_tags(tags); |
| 703 | 703 |
| 704 // Set all the non object fields. | 704 // Set all the non object fields. |
| 705 func.set_token_pos(reader->Read<int32_t>()); | 705 func.set_token_pos(reader->Read<int32_t>()); |
| 706 func.set_end_token_pos(reader->Read<int32_t>()); | 706 func.set_end_token_pos(reader->Read<int32_t>()); |
| 707 func.set_usage_counter(reader->Read<int32_t>()); | 707 func.set_usage_counter(reader->Read<int32_t>()); |
| 708 func.set_num_fixed_parameters(reader->Read<int16_t>()); | 708 func.set_num_fixed_parameters(reader->Read<int16_t>()); |
| 709 func.set_num_optional_parameters(reader->Read<int16_t>()); | 709 func.set_num_optional_parameters(reader->Read<int16_t>()); |
| 710 func.set_deoptimization_counter(reader->Read<int16_t>()); | 710 func.set_deoptimization_counter(reader->Read<int16_t>()); |
| 711 func.set_regexp_cid(reader->Read<int16_t>()); | 711 func.set_regexp_cid(reader->Read<cid_t>()); |
| 712 func.set_kind_tag(reader->Read<uint32_t>()); | 712 func.set_kind_tag(reader->Read<uint32_t>()); |
| 713 func.set_optimized_instruction_count(reader->Read<uint16_t>()); | 713 func.set_optimized_instruction_count(reader->Read<uint16_t>()); |
| 714 func.set_optimized_call_site_count(reader->Read<uint16_t>()); | 714 func.set_optimized_call_site_count(reader->Read<uint16_t>()); |
| 715 | 715 |
| 716 // Set all the object fields. | 716 // Set all the object fields. |
| 717 // TODO(5411462): Need to assert No GC can happen here, even though | 717 // TODO(5411462): Need to assert No GC can happen here, even though |
| 718 // allocations may happen. | 718 // allocations may happen. |
| 719 intptr_t num_flds = (func.raw()->to_snapshot() - func.raw()->from()); | 719 intptr_t num_flds = (func.raw()->to_snapshot() - func.raw()->from()); |
| 720 for (intptr_t i = 0; i <= num_flds; i++) { | 720 for (intptr_t i = 0; i <= num_flds; i++) { |
| 721 (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); | 721 (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 745 writer->WriteVMIsolateObject(kFunctionCid); | 745 writer->WriteVMIsolateObject(kFunctionCid); |
| 746 writer->WriteTags(writer->GetObjectTags(this)); | 746 writer->WriteTags(writer->GetObjectTags(this)); |
| 747 | 747 |
| 748 // Write out all the non object fields. | 748 // Write out all the non object fields. |
| 749 writer->Write<int32_t>(ptr()->token_pos_); | 749 writer->Write<int32_t>(ptr()->token_pos_); |
| 750 writer->Write<int32_t>(ptr()->end_token_pos_); | 750 writer->Write<int32_t>(ptr()->end_token_pos_); |
| 751 writer->Write<int32_t>(ptr()->usage_counter_); | 751 writer->Write<int32_t>(ptr()->usage_counter_); |
| 752 writer->Write<int16_t>(ptr()->num_fixed_parameters_); | 752 writer->Write<int16_t>(ptr()->num_fixed_parameters_); |
| 753 writer->Write<int16_t>(ptr()->num_optional_parameters_); | 753 writer->Write<int16_t>(ptr()->num_optional_parameters_); |
| 754 writer->Write<int16_t>(ptr()->deoptimization_counter_); | 754 writer->Write<int16_t>(ptr()->deoptimization_counter_); |
| 755 writer->Write<int16_t>(ptr()->regexp_cid_); | 755 writer->Write<cid_t>(ptr()->regexp_cid_); |
| 756 writer->Write<uint32_t>(ptr()->kind_tag_); | 756 writer->Write<uint32_t>(ptr()->kind_tag_); |
| 757 writer->Write<uint16_t>(ptr()->optimized_instruction_count_); | 757 writer->Write<uint16_t>(ptr()->optimized_instruction_count_); |
| 758 writer->Write<uint16_t>(ptr()->optimized_call_site_count_); | 758 writer->Write<uint16_t>(ptr()->optimized_call_site_count_); |
| 759 | 759 |
| 760 // Write out all the object pointer fields. | 760 // Write out all the object pointer fields. |
| 761 SnapshotWriterVisitor visitor(writer); | 761 SnapshotWriterVisitor visitor(writer); |
| 762 visitor.VisitPointers(from(), to_snapshot()); | 762 visitor.VisitPointers(from(), to_snapshot()); |
| 763 } | 763 } |
| 764 | 764 |
| 765 | 765 |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 library = Library::LookupLibrary(*reader->StringHandle()); | 1034 library = Library::LookupLibrary(*reader->StringHandle()); |
| 1035 } else { | 1035 } else { |
| 1036 // Allocate library object. | 1036 // Allocate library object. |
| 1037 library = NEW_OBJECT(Library); | 1037 library = NEW_OBJECT(Library); |
| 1038 | 1038 |
| 1039 // Set the object tags. | 1039 // Set the object tags. |
| 1040 library.set_tags(tags); | 1040 library.set_tags(tags); |
| 1041 | 1041 |
| 1042 // Set all non object fields. | 1042 // Set all non object fields. |
| 1043 library.StoreNonPointer(&library.raw_ptr()->index_, | 1043 library.StoreNonPointer(&library.raw_ptr()->index_, |
| 1044 reader->Read<int32_t>()); | 1044 reader->Read<cid_t>()); |
| 1045 library.StoreNonPointer(&library.raw_ptr()->num_imports_, | 1045 library.StoreNonPointer(&library.raw_ptr()->num_imports_, |
| 1046 reader->Read<int32_t>()); | 1046 reader->Read<cid_t>()); |
| 1047 library.StoreNonPointer(&library.raw_ptr()->num_anonymous_, | 1047 library.StoreNonPointer(&library.raw_ptr()->num_anonymous_, |
| 1048 reader->Read<int32_t>()); | 1048 reader->Read<cid_t>()); |
| 1049 library.StoreNonPointer(&library.raw_ptr()->corelib_imported_, | 1049 library.StoreNonPointer(&library.raw_ptr()->corelib_imported_, |
| 1050 reader->Read<bool>()); | 1050 reader->Read<bool>()); |
| 1051 library.StoreNonPointer(&library.raw_ptr()->is_dart_scheme_, | 1051 library.StoreNonPointer(&library.raw_ptr()->is_dart_scheme_, |
| 1052 reader->Read<bool>()); | 1052 reader->Read<bool>()); |
| 1053 library.StoreNonPointer(&library.raw_ptr()->debuggable_, | 1053 library.StoreNonPointer(&library.raw_ptr()->debuggable_, |
| 1054 reader->Read<bool>()); | 1054 reader->Read<bool>()); |
| 1055 library.StoreNonPointer(&library.raw_ptr()->load_state_, | 1055 library.StoreNonPointer(&library.raw_ptr()->load_state_, |
| 1056 reader->Read<int8_t>()); | 1056 reader->Read<int8_t>()); |
| 1057 // The native resolver is not serialized. | 1057 // The native resolver is not serialized. |
| 1058 Dart_NativeEntryResolver resolver = | 1058 Dart_NativeEntryResolver resolver = |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 writer->WriteVMIsolateObject(kLibraryCid); | 1097 writer->WriteVMIsolateObject(kLibraryCid); |
| 1098 writer->WriteTags(writer->GetObjectTags(this)); | 1098 writer->WriteTags(writer->GetObjectTags(this)); |
| 1099 | 1099 |
| 1100 if ((kind == Snapshot::kScript) && | 1100 if ((kind == Snapshot::kScript) && |
| 1101 RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) { | 1101 RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) { |
| 1102 ASSERT(kind != Snapshot::kFull); | 1102 ASSERT(kind != Snapshot::kFull); |
| 1103 // Write out library URL so that it can be looked up when reading. | 1103 // Write out library URL so that it can be looked up when reading. |
| 1104 writer->WriteObjectImpl(ptr()->url_); | 1104 writer->WriteObjectImpl(ptr()->url_); |
| 1105 } else { | 1105 } else { |
| 1106 // Write out all non object fields. | 1106 // Write out all non object fields. |
| 1107 writer->Write<int32_t>(ptr()->index_); | 1107 writer->Write<cid_t>(ptr()->index_); |
| 1108 writer->Write<int32_t>(ptr()->num_imports_); | 1108 writer->Write<cid_t>(ptr()->num_imports_); |
| 1109 writer->Write<int32_t>(ptr()->num_anonymous_); | 1109 writer->Write<cid_t>(ptr()->num_anonymous_); |
| 1110 writer->Write<bool>(ptr()->corelib_imported_); | 1110 writer->Write<bool>(ptr()->corelib_imported_); |
| 1111 writer->Write<bool>(ptr()->is_dart_scheme_); | 1111 writer->Write<bool>(ptr()->is_dart_scheme_); |
| 1112 writer->Write<bool>(ptr()->debuggable_); | 1112 writer->Write<bool>(ptr()->debuggable_); |
| 1113 writer->Write<int8_t>(ptr()->load_state_); | 1113 writer->Write<int8_t>(ptr()->load_state_); |
| 1114 // We do not serialize the native resolver over, this needs to be explicitly | 1114 // We do not serialize the native resolver over, this needs to be explicitly |
| 1115 // set after deserialization. | 1115 // set after deserialization. |
| 1116 writer->Write<Dart_NativeEntryResolver>(NULL); | 1116 writer->Write<Dart_NativeEntryResolver>(NULL); |
| 1117 // We do not serialize the native entry symbol, this needs to be explicitly | 1117 // We do not serialize the native entry symbol, this needs to be explicitly |
| 1118 // set after deserialization. | 1118 // set after deserialization. |
| 1119 writer->Write<Dart_NativeEntrySymbol>(NULL); | 1119 writer->Write<Dart_NativeEntrySymbol>(NULL); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1140 // Allocate library prefix object. | 1140 // Allocate library prefix object. |
| 1141 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle( | 1141 LibraryPrefix& prefix = LibraryPrefix::ZoneHandle( |
| 1142 reader->zone(), NEW_OBJECT(LibraryPrefix)); | 1142 reader->zone(), NEW_OBJECT(LibraryPrefix)); |
| 1143 reader->AddBackRef(object_id, &prefix, kIsDeserialized); | 1143 reader->AddBackRef(object_id, &prefix, kIsDeserialized); |
| 1144 | 1144 |
| 1145 // Set the object tags. | 1145 // Set the object tags. |
| 1146 prefix.set_tags(tags); | 1146 prefix.set_tags(tags); |
| 1147 | 1147 |
| 1148 // Set all non object fields. | 1148 // Set all non object fields. |
| 1149 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, | 1149 prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_, |
| 1150 reader->Read<int32_t>()); | 1150 reader->Read<cid_t>()); |
| 1151 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, | 1151 prefix.StoreNonPointer(&prefix.raw_ptr()->is_deferred_load_, |
| 1152 reader->Read<bool>()); | 1152 reader->Read<bool>()); |
| 1153 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); | 1153 prefix.StoreNonPointer(&prefix.raw_ptr()->is_loaded_, reader->Read<bool>()); |
| 1154 | 1154 |
| 1155 // Set all the object fields. | 1155 // Set all the object fields. |
| 1156 // TODO(5411462): Need to assert No GC can happen here, even though | 1156 // TODO(5411462): Need to assert No GC can happen here, even though |
| 1157 // allocations may happen. | 1157 // allocations may happen. |
| 1158 intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from()); | 1158 intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from()); |
| 1159 for (intptr_t i = 0; i <= num_flds; i++) { | 1159 for (intptr_t i = 0; i <= num_flds; i++) { |
| 1160 (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); | 1160 (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1175 (kind == Snapshot::kFull)); | 1175 (kind == Snapshot::kFull)); |
| 1176 | 1176 |
| 1177 // Write out the serialization header value for this object. | 1177 // Write out the serialization header value for this object. |
| 1178 writer->WriteInlinedObjectHeader(object_id); | 1178 writer->WriteInlinedObjectHeader(object_id); |
| 1179 | 1179 |
| 1180 // Write out the class and tags information. | 1180 // Write out the class and tags information. |
| 1181 writer->WriteIndexedObject(kLibraryPrefixCid); | 1181 writer->WriteIndexedObject(kLibraryPrefixCid); |
| 1182 writer->WriteTags(writer->GetObjectTags(this)); | 1182 writer->WriteTags(writer->GetObjectTags(this)); |
| 1183 | 1183 |
| 1184 // Write out all non object fields. | 1184 // Write out all non object fields. |
| 1185 writer->Write<int32_t>(ptr()->num_imports_); | 1185 writer->Write<cid_t>(ptr()->num_imports_); |
| 1186 writer->Write<bool>(ptr()->is_deferred_load_); | 1186 writer->Write<bool>(ptr()->is_deferred_load_); |
| 1187 writer->Write<bool>(ptr()->is_loaded_); | 1187 writer->Write<bool>(ptr()->is_loaded_); |
| 1188 | 1188 |
| 1189 // Write out all the object pointer fields. | 1189 // Write out all the object pointer fields. |
| 1190 SnapshotWriterVisitor visitor(writer); | 1190 SnapshotWriterVisitor visitor(writer); |
| 1191 visitor.VisitPointers(from(), to()); | 1191 visitor.VisitPointers(from(), to()); |
| 1192 } | 1192 } |
| 1193 | 1193 |
| 1194 | 1194 |
| 1195 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader, | 1195 RawNamespace* Namespace::ReadFrom(SnapshotReader* reader, |
| (...skipping 1682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2878 // We do not allow objects with native fields in an isolate message. | 2878 // We do not allow objects with native fields in an isolate message. |
| 2879 writer->SetWriteException(Exceptions::kArgument, | 2879 writer->SetWriteException(Exceptions::kArgument, |
| 2880 "Illegal argument in isolate message" | 2880 "Illegal argument in isolate message" |
| 2881 " : (object is a UserTag)"); | 2881 " : (object is a UserTag)"); |
| 2882 } else { | 2882 } else { |
| 2883 UNREACHABLE(); | 2883 UNREACHABLE(); |
| 2884 } | 2884 } |
| 2885 } | 2885 } |
| 2886 | 2886 |
| 2887 } // namespace dart | 2887 } // namespace dart |
| OLD | NEW |