Chromium Code Reviews| 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 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/become.h" | 10 #include "vm/become.h" |
| (...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1125 const Library& lib) { | 1125 const Library& lib) { |
| 1126 ASSERT(public_class_name.Length() > 0); | 1126 ASSERT(public_class_name.Length() > 0); |
| 1127 ASSERT(public_class_name.CharAt(0) == '_'); | 1127 ASSERT(public_class_name.CharAt(0) == '_'); |
| 1128 String& str = String::Handle(); | 1128 String& str = String::Handle(); |
| 1129 str = lib.PrivateName(public_class_name); | 1129 str = lib.PrivateName(public_class_name); |
| 1130 cls.set_name(str); | 1130 cls.set_name(str); |
| 1131 lib.AddClass(cls); | 1131 lib.AddClass(cls); |
| 1132 } | 1132 } |
| 1133 | 1133 |
| 1134 | 1134 |
| 1135 RawError* Object::Init(Isolate* isolate) { | 1135 // Initialize a new isolate from source or from a snapshot. |
| 1136 // | |
| 1137 // There are three possibilities: | |
| 1138 // 1. Running a Dart Kernel IL. This function will bootstrap from the KERNEL | |
|
hausner
2016/11/09 00:42:49
IL -> IR ?
Vyacheslav Egorov (Google)
2016/11/09 14:43:16
Done.
| |
| 1139 // file. | |
| 1140 // 2. There is no snapshot. This function will bootstrap from source. | |
| 1141 // 3. There is a snapshot. The caller should initialize from the snapshot. | |
| 1142 // | |
| 1143 // A non-NULL kernel argument indicates (1). A NULL kernel indicates (2) or | |
| 1144 // (3), depending on whether the VM is compiled with DART_NO_SNAPSHOT defined or | |
| 1145 // not. | |
| 1146 RawError* Object::Init(Isolate* isolate, | |
| 1147 const uint8_t* kernel_buffer, | |
| 1148 intptr_t kernel_buffer_length) { | |
| 1136 Thread* thread = Thread::Current(); | 1149 Thread* thread = Thread::Current(); |
| 1137 Zone* zone = thread->zone(); | 1150 Zone* zone = thread->zone(); |
| 1138 ASSERT(isolate == thread->isolate()); | 1151 ASSERT(isolate == thread->isolate()); |
| 1152 const bool is_kernel = (kernel_buffer != NULL); | |
| 1139 NOT_IN_PRODUCT( | 1153 NOT_IN_PRODUCT( |
| 1140 TimelineDurationScope tds(thread, | 1154 TimelineDurationScope tds(thread, |
| 1141 Timeline::GetIsolateStream(), | 1155 Timeline::GetIsolateStream(), |
| 1142 "Object::Init"); | 1156 "Object::Init"); |
| 1143 ) | 1157 ) |
| 1144 | 1158 |
| 1145 #if defined(DART_NO_SNAPSHOT) | 1159 #ifdef DART_NO_SNAPSHOT |
| 1146 // Object::Init version when we are running in a version of dart that does | 1160 bool bootstrapping = true; |
| 1147 // not have a full snapshot linked in. | 1161 #else |
| 1148 ObjectStore* object_store = isolate->object_store(); | 1162 bool bootstrapping = is_kernel; |
| 1149 | 1163 #endif |
| 1150 Class& cls = Class::Handle(zone); | 1164 |
| 1151 Type& type = Type::Handle(zone); | 1165 if (bootstrapping) { |
| 1152 Array& array = Array::Handle(zone); | 1166 // Object::Init version when we are bootstrapping from source or from a |
| 1153 Library& lib = Library::Handle(zone); | 1167 // Kernel binary. |
| 1154 | 1168 ObjectStore* object_store = isolate->object_store(); |
| 1155 // All RawArray fields will be initialized to an empty array, therefore | 1169 |
| 1156 // initialize array class first. | 1170 Class& cls = Class::Handle(zone); |
| 1157 cls = Class::New<Array>(); | 1171 Type& type = Type::Handle(zone); |
| 1158 object_store->set_array_class(cls); | 1172 Array& array = Array::Handle(zone); |
| 1159 | 1173 Library& lib = Library::Handle(zone); |
| 1160 // VM classes that are parameterized (Array, ImmutableArray, | 1174 |
| 1161 // GrowableObjectArray, and LinkedHashMap) are also pre-finalized, | 1175 // All RawArray fields will be initialized to an empty array, therefore |
| 1162 // so CalculateFieldOffsets() is not called, so we need to set the | 1176 // initialize array class first. |
| 1163 // offset of their type_arguments_ field, which is explicitly | 1177 cls = Class::New<Array>(); |
| 1164 // declared in their respective Raw* classes. | 1178 object_store->set_array_class(cls); |
| 1165 cls.set_type_arguments_field_offset(Array::type_arguments_offset()); | 1179 |
| 1166 cls.set_num_type_arguments(1); | 1180 // VM classes that are parameterized (Array, ImmutableArray, |
| 1167 | 1181 // GrowableObjectArray, and LinkedHashMap) are also pre-finalized, so |
| 1168 // Set up the growable object array class (Has to be done after the array | 1182 // CalculateFieldOffsets() is not called, so we need to set the offset of |
| 1169 // class is setup as one of its field is an array object). | 1183 // their type_arguments_ field, which is explicitly declared in their |
| 1170 cls = Class::New<GrowableObjectArray>(); | 1184 // respective Raw* classes. |
| 1171 object_store->set_growable_object_array_class(cls); | 1185 cls.set_type_arguments_field_offset(Array::type_arguments_offset()); |
| 1172 cls.set_type_arguments_field_offset( | 1186 cls.set_num_type_arguments(1); |
| 1173 GrowableObjectArray::type_arguments_offset()); | 1187 |
| 1174 cls.set_num_type_arguments(1); | 1188 // Set up the growable object array class (Has to be done after the array |
| 1175 | 1189 // class is setup as one of its field is an array object). |
| 1176 // Initialize hash set for canonical_type_. | 1190 cls = Class::New<GrowableObjectArray>(); |
| 1177 const intptr_t kInitialCanonicalTypeSize = 16; | 1191 object_store->set_growable_object_array_class(cls); |
| 1178 array = HashTables::New<CanonicalTypeSet>( | 1192 cls.set_type_arguments_field_offset( |
| 1179 kInitialCanonicalTypeSize, Heap::kOld); | 1193 GrowableObjectArray::type_arguments_offset()); |
| 1180 object_store->set_canonical_types(array); | 1194 cls.set_num_type_arguments(1); |
| 1181 | 1195 |
| 1182 // Initialize hash set for canonical_type_arguments_. | 1196 // Initialize hash set for canonical_type_. |
| 1183 const intptr_t kInitialCanonicalTypeArgumentsSize = 4; | 1197 const intptr_t kInitialCanonicalTypeSize = 16; |
| 1184 array = HashTables::New<CanonicalTypeArgumentsSet>( | 1198 array = HashTables::New<CanonicalTypeSet>( |
| 1185 kInitialCanonicalTypeArgumentsSize, Heap::kOld); | 1199 kInitialCanonicalTypeSize, Heap::kOld); |
| 1186 object_store->set_canonical_type_arguments(array); | 1200 object_store->set_canonical_types(array); |
| 1187 | 1201 |
| 1188 // Setup type class early in the process. | 1202 // Initialize hash set for canonical_type_arguments_. |
| 1189 const Class& type_cls = Class::Handle(zone, Class::New<Type>()); | 1203 const intptr_t kInitialCanonicalTypeArgumentsSize = 4; |
| 1190 const Class& type_ref_cls = Class::Handle(zone, Class::New<TypeRef>()); | 1204 array = HashTables::New<CanonicalTypeArgumentsSet>( |
| 1191 const Class& type_parameter_cls = Class::Handle(zone, | 1205 kInitialCanonicalTypeArgumentsSize, Heap::kOld); |
| 1192 Class::New<TypeParameter>()); | 1206 object_store->set_canonical_type_arguments(array); |
| 1193 const Class& bounded_type_cls = Class::Handle(zone, | 1207 |
| 1194 Class::New<BoundedType>()); | 1208 // Setup type class early in the process. |
| 1195 const Class& mixin_app_type_cls = Class::Handle(zone, | 1209 const Class& type_cls = Class::Handle(zone, Class::New<Type>()); |
| 1196 Class::New<MixinAppType>()); | 1210 const Class& type_ref_cls = Class::Handle(zone, Class::New<TypeRef>()); |
| 1197 const Class& library_prefix_cls = Class::Handle(zone, | 1211 const Class& type_parameter_cls = |
| 1198 Class::New<LibraryPrefix>()); | 1212 Class::Handle(zone, Class::New<TypeParameter>()); |
| 1199 | 1213 const Class& bounded_type_cls = |
| 1200 // Pre-allocate the OneByteString class needed by the symbol table. | 1214 Class::Handle(zone, Class::New<BoundedType>()); |
| 1201 cls = Class::NewStringClass(kOneByteStringCid); | 1215 const Class& mixin_app_type_cls = |
| 1202 object_store->set_one_byte_string_class(cls); | 1216 Class::Handle(zone, Class::New<MixinAppType>()); |
| 1203 | 1217 const Class& library_prefix_cls = |
| 1204 // Pre-allocate the TwoByteString class needed by the symbol table. | 1218 Class::Handle(zone, Class::New<LibraryPrefix>()); |
| 1205 cls = Class::NewStringClass(kTwoByteStringCid); | 1219 |
| 1206 object_store->set_two_byte_string_class(cls); | 1220 // Pre-allocate the OneByteString class needed by the symbol table. |
| 1207 | 1221 cls = Class::NewStringClass(kOneByteStringCid); |
| 1208 // Setup the symbol table for the symbols created in the isolate. | 1222 object_store->set_one_byte_string_class(cls); |
| 1209 Symbols::SetupSymbolTable(isolate); | 1223 |
| 1210 | 1224 // Pre-allocate the TwoByteString class needed by the symbol table. |
| 1211 // Set up the libraries array before initializing the core library. | 1225 cls = Class::NewStringClass(kTwoByteStringCid); |
| 1212 const GrowableObjectArray& libraries = GrowableObjectArray::Handle( | 1226 object_store->set_two_byte_string_class(cls); |
| 1213 zone, GrowableObjectArray::New(Heap::kOld)); | 1227 |
| 1214 object_store->set_libraries(libraries); | 1228 // Setup the symbol table for the symbols created in the isolate. |
| 1215 | 1229 Symbols::SetupSymbolTable(isolate); |
| 1216 // Pre-register the core library. | 1230 |
| 1217 Library::InitCoreLibrary(isolate); | 1231 // Set up the libraries array before initializing the core library. |
| 1218 | 1232 const GrowableObjectArray& libraries = |
| 1219 // Basic infrastructure has been setup, initialize the class dictionary. | 1233 GrowableObjectArray::Handle(zone, GrowableObjectArray::New(Heap::kOld)); |
| 1220 const Library& core_lib = Library::Handle(zone, Library::CoreLibrary()); | 1234 object_store->set_libraries(libraries); |
| 1221 ASSERT(!core_lib.IsNull()); | 1235 |
| 1222 | 1236 // Pre-register the core library. |
| 1223 const GrowableObjectArray& pending_classes = | 1237 Library::InitCoreLibrary(isolate); |
| 1224 GrowableObjectArray::Handle(zone, GrowableObjectArray::New()); | 1238 |
| 1225 object_store->set_pending_classes(pending_classes); | 1239 // Basic infrastructure has been setup, initialize the class dictionary. |
| 1226 | 1240 const Library& core_lib = Library::Handle(zone, Library::CoreLibrary()); |
| 1227 Context& context = Context::Handle(zone, Context::New(0, Heap::kOld)); | 1241 ASSERT(!core_lib.IsNull()); |
| 1228 object_store->set_empty_context(context); | 1242 |
| 1229 | 1243 const GrowableObjectArray& pending_classes = |
| 1230 // Now that the symbol table is initialized and that the core dictionary as | 1244 GrowableObjectArray::Handle(zone, GrowableObjectArray::New()); |
| 1231 // well as the core implementation dictionary have been setup, preallocate | 1245 object_store->set_pending_classes(pending_classes); |
| 1232 // remaining classes and register them by name in the dictionaries. | 1246 |
| 1233 String& name = String::Handle(zone); | 1247 Context& context = Context::Handle(zone, Context::New(0, Heap::kOld)); |
| 1234 cls = object_store->array_class(); // Was allocated above. | 1248 object_store->set_empty_context(context); |
| 1235 RegisterPrivateClass(cls, Symbols::_List(), core_lib); | 1249 |
| 1236 pending_classes.Add(cls); | 1250 // Now that the symbol table is initialized and that the core dictionary as |
| 1237 // We cannot use NewNonParameterizedType(cls), because Array is parameterized. | 1251 // well as the core implementation dictionary have been setup, preallocate |
| 1238 // Warning: class _List has not been patched yet. Its declared number of type | 1252 // remaining classes and register them by name in the dictionaries. |
| 1239 // parameters is still 0. It will become 1 after patching. The array type | 1253 String& name = String::Handle(zone); |
| 1240 // allocated below represents the raw type _List and not _List<E> as we | 1254 cls = object_store->array_class(); // Was allocated above. |
| 1241 // could expect. Use with caution. | 1255 RegisterPrivateClass(cls, Symbols::_List(), core_lib); |
| 1242 type ^= Type::New(Object::Handle(zone, cls.raw()), | 1256 pending_classes.Add(cls); |
| 1243 TypeArguments::Handle(zone), | 1257 // We cannot use NewNonParameterizedType(cls), because Array is |
| 1244 TokenPosition::kNoSource); | 1258 // parameterized. Warning: class _List has not been patched yet. Its |
| 1245 type.SetIsFinalized(); | 1259 // declared number of type parameters is still 0. It will become 1 after |
| 1246 type ^= type.Canonicalize(); | 1260 // patching. The array type allocated below represents the raw type _List |
| 1247 object_store->set_array_type(type); | 1261 // and not _List<E> as we could expect. Use with caution. |
| 1248 | 1262 type ^= Type::New(Object::Handle(zone, cls.raw()), |
| 1249 cls = object_store->growable_object_array_class(); // Was allocated above. | 1263 TypeArguments::Handle(zone), |
| 1250 RegisterPrivateClass(cls, Symbols::_GrowableList(), core_lib); | 1264 TokenPosition::kNoSource); |
| 1251 pending_classes.Add(cls); | 1265 type.SetIsFinalized(); |
| 1252 | 1266 type ^= type.Canonicalize(); |
| 1253 cls = Class::New<Array>(kImmutableArrayCid); | 1267 object_store->set_array_type(type); |
| 1254 object_store->set_immutable_array_class(cls); | 1268 |
| 1255 cls.set_type_arguments_field_offset(Array::type_arguments_offset()); | 1269 cls = object_store->growable_object_array_class(); // Was allocated above. |
| 1256 cls.set_num_type_arguments(1); | 1270 RegisterPrivateClass(cls, Symbols::_GrowableList(), core_lib); |
| 1257 ASSERT(object_store->immutable_array_class() != object_store->array_class()); | 1271 pending_classes.Add(cls); |
| 1258 cls.set_is_prefinalized(); | 1272 |
| 1259 RegisterPrivateClass(cls, Symbols::_ImmutableList(), core_lib); | 1273 cls = Class::New<Array>(kImmutableArrayCid); |
| 1260 pending_classes.Add(cls); | 1274 object_store->set_immutable_array_class(cls); |
| 1261 | 1275 cls.set_type_arguments_field_offset(Array::type_arguments_offset()); |
| 1262 cls = object_store->one_byte_string_class(); // Was allocated above. | 1276 cls.set_num_type_arguments(1); |
| 1263 RegisterPrivateClass(cls, Symbols::OneByteString(), core_lib); | 1277 ASSERT(object_store->immutable_array_class() != |
| 1264 pending_classes.Add(cls); | 1278 object_store->array_class()); |
| 1265 | 1279 cls.set_is_prefinalized(); |
| 1266 cls = object_store->two_byte_string_class(); // Was allocated above. | 1280 RegisterPrivateClass(cls, Symbols::_ImmutableList(), core_lib); |
| 1267 RegisterPrivateClass(cls, Symbols::TwoByteString(), core_lib); | 1281 pending_classes.Add(cls); |
| 1268 pending_classes.Add(cls); | 1282 |
| 1269 | 1283 cls = object_store->one_byte_string_class(); // Was allocated above. |
| 1270 cls = Class::NewStringClass(kExternalOneByteStringCid); | 1284 RegisterPrivateClass(cls, Symbols::OneByteString(), core_lib); |
| 1271 object_store->set_external_one_byte_string_class(cls); | 1285 pending_classes.Add(cls); |
| 1272 RegisterPrivateClass(cls, Symbols::ExternalOneByteString(), core_lib); | 1286 |
| 1273 pending_classes.Add(cls); | 1287 cls = object_store->two_byte_string_class(); // Was allocated above. |
| 1274 | 1288 RegisterPrivateClass(cls, Symbols::TwoByteString(), core_lib); |
| 1275 cls = Class::NewStringClass(kExternalTwoByteStringCid); | 1289 pending_classes.Add(cls); |
| 1276 object_store->set_external_two_byte_string_class(cls); | 1290 |
| 1277 RegisterPrivateClass(cls, Symbols::ExternalTwoByteString(), core_lib); | 1291 cls = Class::NewStringClass(kExternalOneByteStringCid); |
| 1278 pending_classes.Add(cls); | 1292 object_store->set_external_one_byte_string_class(cls); |
| 1279 | 1293 RegisterPrivateClass(cls, Symbols::ExternalOneByteString(), core_lib); |
| 1280 // Pre-register the isolate library so the native class implementations | 1294 pending_classes.Add(cls); |
| 1281 // can be hooked up before compiling it. | 1295 |
| 1282 Library& isolate_lib = | 1296 cls = Class::NewStringClass(kExternalTwoByteStringCid); |
| 1283 Library::Handle(zone, Library::LookupLibrary(thread, | 1297 object_store->set_external_two_byte_string_class(cls); |
| 1284 Symbols::DartIsolate())); | 1298 RegisterPrivateClass(cls, Symbols::ExternalTwoByteString(), core_lib); |
| 1285 if (isolate_lib.IsNull()) { | 1299 pending_classes.Add(cls); |
| 1286 isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true); | 1300 |
| 1287 isolate_lib.SetLoadRequested(); | 1301 // Pre-register the isolate library so the native class implementations can |
| 1288 isolate_lib.Register(thread); | 1302 // be hooked up before compiling it. |
| 1303 Library& isolate_lib = Library::Handle( | |
| 1304 zone, Library::LookupLibrary(thread, Symbols::DartIsolate())); | |
| 1305 if (isolate_lib.IsNull()) { | |
| 1306 isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true); | |
| 1307 isolate_lib.SetLoadRequested(); | |
| 1308 isolate_lib.Register(thread); | |
| 1309 } | |
| 1289 object_store->set_bootstrap_library(ObjectStore::kIsolate, isolate_lib); | 1310 object_store->set_bootstrap_library(ObjectStore::kIsolate, isolate_lib); |
| 1290 } | 1311 ASSERT(!isolate_lib.IsNull()); |
| 1291 ASSERT(!isolate_lib.IsNull()); | 1312 ASSERT(isolate_lib.raw() == Library::IsolateLibrary()); |
| 1292 ASSERT(isolate_lib.raw() == Library::IsolateLibrary()); | 1313 |
| 1293 | 1314 cls = Class::New<Capability>(); |
| 1294 cls = Class::New<Capability>(); | 1315 RegisterPrivateClass(cls, Symbols::_CapabilityImpl(), isolate_lib); |
| 1295 RegisterPrivateClass(cls, Symbols::_CapabilityImpl(), isolate_lib); | 1316 pending_classes.Add(cls); |
| 1296 pending_classes.Add(cls); | 1317 |
| 1297 | 1318 cls = Class::New<ReceivePort>(); |
| 1298 cls = Class::New<ReceivePort>(); | 1319 RegisterPrivateClass(cls, Symbols::_RawReceivePortImpl(), isolate_lib); |
| 1299 RegisterPrivateClass(cls, Symbols::_RawReceivePortImpl(), isolate_lib); | 1320 pending_classes.Add(cls); |
| 1300 pending_classes.Add(cls); | 1321 |
| 1301 | 1322 cls = Class::New<SendPort>(); |
| 1302 cls = Class::New<SendPort>(); | 1323 RegisterPrivateClass(cls, Symbols::_SendPortImpl(), isolate_lib); |
| 1303 RegisterPrivateClass(cls, Symbols::_SendPortImpl(), isolate_lib); | 1324 pending_classes.Add(cls); |
| 1304 pending_classes.Add(cls); | 1325 |
| 1305 | 1326 const Class& stacktrace_cls = Class::Handle(zone, Class::New<Stacktrace>()); |
| 1306 const Class& stacktrace_cls = Class::Handle(zone, | 1327 RegisterPrivateClass(stacktrace_cls, Symbols::_StackTrace(), core_lib); |
| 1307 Class::New<Stacktrace>()); | 1328 pending_classes.Add(stacktrace_cls); |
| 1308 RegisterPrivateClass(stacktrace_cls, Symbols::_StackTrace(), core_lib); | 1329 // Super type set below, after Object is allocated. |
| 1309 pending_classes.Add(stacktrace_cls); | 1330 |
| 1310 // Super type set below, after Object is allocated. | 1331 cls = Class::New<RegExp>(); |
| 1311 | 1332 RegisterPrivateClass(cls, Symbols::_RegExp(), core_lib); |
| 1312 cls = Class::New<RegExp>(); | 1333 pending_classes.Add(cls); |
| 1313 RegisterPrivateClass(cls, Symbols::_RegExp(), core_lib); | 1334 |
| 1314 pending_classes.Add(cls); | 1335 // Initialize the base interfaces used by the core VM classes. |
| 1315 | 1336 |
| 1316 // Initialize the base interfaces used by the core VM classes. | 1337 // Allocate and initialize the pre-allocated classes in the core library. |
| 1317 | 1338 // The script and token index of these pre-allocated classes is set up in |
| 1318 // Allocate and initialize the pre-allocated classes in the core library. | 1339 // the parser when the corelib script is compiled (see |
| 1319 // The script and token index of these pre-allocated classes is set up in | 1340 // Parser::ParseClassDefinition). |
| 1320 // the parser when the corelib script is compiled (see | 1341 cls = Class::New<Instance>(kInstanceCid); |
| 1321 // Parser::ParseClassDefinition). | 1342 object_store->set_object_class(cls); |
| 1322 cls = Class::New<Instance>(kInstanceCid); | 1343 cls.set_name(Symbols::Object()); |
| 1323 object_store->set_object_class(cls); | 1344 cls.set_num_type_arguments(0); |
| 1324 cls.set_name(Symbols::Object()); | 1345 cls.set_num_own_type_arguments(0); |
| 1325 cls.set_num_type_arguments(0); | 1346 cls.set_is_prefinalized(); |
| 1326 cls.set_num_own_type_arguments(0); | 1347 core_lib.AddClass(cls); |
| 1327 cls.set_is_prefinalized(); | 1348 pending_classes.Add(cls); |
| 1328 core_lib.AddClass(cls); | 1349 type = Type::NewNonParameterizedType(cls); |
| 1329 pending_classes.Add(cls); | 1350 object_store->set_object_type(type); |
| 1330 type = Type::NewNonParameterizedType(cls); | 1351 |
| 1331 object_store->set_object_type(type); | 1352 cls = Class::New<Bool>(); |
| 1332 | 1353 object_store->set_bool_class(cls); |
| 1333 cls = Class::New<Bool>(); | 1354 RegisterClass(cls, Symbols::Bool(), core_lib); |
| 1334 object_store->set_bool_class(cls); | 1355 pending_classes.Add(cls); |
| 1335 RegisterClass(cls, Symbols::Bool(), core_lib); | 1356 |
| 1336 pending_classes.Add(cls); | 1357 cls = Class::New<Instance>(kNullCid); |
| 1337 | 1358 object_store->set_null_class(cls); |
| 1338 cls = Class::New<Instance>(kNullCid); | 1359 cls.set_num_type_arguments(0); |
| 1339 object_store->set_null_class(cls); | 1360 cls.set_num_own_type_arguments(0); |
| 1340 cls.set_num_type_arguments(0); | 1361 cls.set_is_prefinalized(); |
| 1341 cls.set_num_own_type_arguments(0); | 1362 RegisterClass(cls, Symbols::Null(), core_lib); |
| 1342 cls.set_is_prefinalized(); | 1363 pending_classes.Add(cls); |
| 1343 RegisterClass(cls, Symbols::Null(), core_lib); | 1364 |
| 1344 pending_classes.Add(cls); | 1365 ASSERT(!library_prefix_cls.IsNull()); |
| 1345 | 1366 RegisterPrivateClass(library_prefix_cls, Symbols::_LibraryPrefix(), |
| 1346 ASSERT(!library_prefix_cls.IsNull()); | 1367 core_lib); |
| 1347 RegisterPrivateClass(library_prefix_cls, Symbols::_LibraryPrefix(), core_lib); | 1368 pending_classes.Add(library_prefix_cls); |
| 1348 pending_classes.Add(library_prefix_cls); | 1369 |
| 1349 | 1370 RegisterPrivateClass(type_cls, Symbols::Type(), core_lib); |
| 1350 RegisterPrivateClass(type_cls, Symbols::Type(), core_lib); | 1371 pending_classes.Add(type_cls); |
| 1351 pending_classes.Add(type_cls); | 1372 |
| 1352 | 1373 RegisterPrivateClass(type_ref_cls, Symbols::TypeRef(), core_lib); |
| 1353 RegisterPrivateClass(type_ref_cls, Symbols::TypeRef(), core_lib); | 1374 pending_classes.Add(type_ref_cls); |
| 1354 pending_classes.Add(type_ref_cls); | 1375 |
| 1355 | 1376 RegisterPrivateClass(type_parameter_cls, Symbols::TypeParameter(), |
| 1356 RegisterPrivateClass(type_parameter_cls, Symbols::TypeParameter(), core_lib); | 1377 core_lib); |
| 1357 pending_classes.Add(type_parameter_cls); | 1378 pending_classes.Add(type_parameter_cls); |
| 1358 | 1379 |
| 1359 RegisterPrivateClass(bounded_type_cls, Symbols::BoundedType(), core_lib); | 1380 RegisterPrivateClass(bounded_type_cls, Symbols::BoundedType(), core_lib); |
| 1360 pending_classes.Add(bounded_type_cls); | 1381 pending_classes.Add(bounded_type_cls); |
| 1361 | 1382 |
| 1362 RegisterPrivateClass(mixin_app_type_cls, Symbols::MixinAppType(), core_lib); | 1383 RegisterPrivateClass(mixin_app_type_cls, Symbols::MixinAppType(), core_lib); |
| 1363 pending_classes.Add(mixin_app_type_cls); | 1384 pending_classes.Add(mixin_app_type_cls); |
| 1364 | 1385 |
| 1365 cls = Class::New<Integer>(); | 1386 cls = Class::New<Integer>(); |
| 1366 object_store->set_integer_implementation_class(cls); | 1387 object_store->set_integer_implementation_class(cls); |
| 1367 RegisterPrivateClass(cls, Symbols::IntegerImplementation(), core_lib); | 1388 RegisterPrivateClass(cls, Symbols::IntegerImplementation(), core_lib); |
| 1368 pending_classes.Add(cls); | 1389 pending_classes.Add(cls); |
| 1369 | 1390 |
| 1370 cls = Class::New<Smi>(); | 1391 cls = Class::New<Smi>(); |
| 1371 object_store->set_smi_class(cls); | 1392 object_store->set_smi_class(cls); |
| 1372 RegisterPrivateClass(cls, Symbols::_Smi(), core_lib); | 1393 RegisterPrivateClass(cls, Symbols::_Smi(), core_lib); |
| 1373 pending_classes.Add(cls); | 1394 pending_classes.Add(cls); |
| 1374 | 1395 |
| 1375 cls = Class::New<Mint>(); | 1396 cls = Class::New<Mint>(); |
| 1376 object_store->set_mint_class(cls); | 1397 object_store->set_mint_class(cls); |
| 1377 RegisterPrivateClass(cls, Symbols::_Mint(), core_lib); | 1398 RegisterPrivateClass(cls, Symbols::_Mint(), core_lib); |
| 1378 pending_classes.Add(cls); | 1399 pending_classes.Add(cls); |
| 1379 | 1400 |
| 1380 cls = Class::New<Bigint>(); | 1401 cls = Class::New<Bigint>(); |
| 1381 object_store->set_bigint_class(cls); | 1402 object_store->set_bigint_class(cls); |
| 1382 RegisterPrivateClass(cls, Symbols::_Bigint(), core_lib); | 1403 RegisterPrivateClass(cls, Symbols::_Bigint(), core_lib); |
| 1383 pending_classes.Add(cls); | 1404 pending_classes.Add(cls); |
| 1384 | 1405 |
| 1385 cls = Class::New<Double>(); | 1406 cls = Class::New<Double>(); |
| 1386 object_store->set_double_class(cls); | 1407 object_store->set_double_class(cls); |
| 1387 RegisterPrivateClass(cls, Symbols::_Double(), core_lib); | 1408 RegisterPrivateClass(cls, Symbols::_Double(), core_lib); |
| 1388 pending_classes.Add(cls); | 1409 pending_classes.Add(cls); |
| 1389 | 1410 |
| 1390 // Class that represents the Dart class _Closure and C++ class Closure. | 1411 // Class that represents the Dart class _Closure and C++ class Closure. |
| 1391 cls = Class::New<Closure>(); | 1412 cls = Class::New<Closure>(); |
| 1392 cls.set_type_arguments_field_offset(Closure::type_arguments_offset()); | 1413 cls.set_type_arguments_field_offset(Closure::type_arguments_offset()); |
| 1393 cls.set_num_type_arguments(0); // Although a closure has type_arguments_. | 1414 cls.set_num_type_arguments(0); // Although a closure has type_arguments_. |
| 1394 cls.set_num_own_type_arguments(0); | 1415 cls.set_num_own_type_arguments(0); |
| 1395 RegisterPrivateClass(cls, Symbols::_Closure(), core_lib); | 1416 RegisterPrivateClass(cls, Symbols::_Closure(), core_lib); |
| 1396 pending_classes.Add(cls); | 1417 pending_classes.Add(cls); |
| 1397 object_store->set_closure_class(cls); | 1418 object_store->set_closure_class(cls); |
| 1398 | 1419 |
| 1399 cls = Class::New<WeakProperty>(); | 1420 cls = Class::New<WeakProperty>(); |
| 1400 object_store->set_weak_property_class(cls); | 1421 object_store->set_weak_property_class(cls); |
| 1401 RegisterPrivateClass(cls, Symbols::_WeakProperty(), core_lib); | 1422 RegisterPrivateClass(cls, Symbols::_WeakProperty(), core_lib); |
| 1402 | 1423 |
| 1403 // Pre-register the mirrors library so we can place the vm class | 1424 // Pre-register the mirrors library so we can place the vm class |
| 1404 // MirrorReference there rather than the core library. | 1425 // MirrorReference there rather than the core library. |
| 1405 NOT_IN_PRODUCT( | 1426 NOT_IN_PRODUCT( |
| 1406 lib = Library::LookupLibrary(thread, Symbols::DartMirrors()); | 1427 lib = Library::LookupLibrary(thread, Symbols::DartMirrors()); |
| 1407 if (lib.IsNull()) { | 1428 if (lib.IsNull()) { |
| 1408 lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true); | 1429 lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true); |
| 1409 lib.SetLoadRequested(); | 1430 lib.SetLoadRequested(); |
| 1410 lib.Register(thread); | 1431 lib.Register(thread); |
| 1432 } | |
| 1411 object_store->set_bootstrap_library(ObjectStore::kMirrors, lib); | 1433 object_store->set_bootstrap_library(ObjectStore::kMirrors, lib); |
| 1412 } | 1434 ASSERT(!lib.IsNull()); |
| 1413 ASSERT(!lib.IsNull()); | 1435 ASSERT(lib.raw() == Library::MirrorsLibrary()); |
| 1414 ASSERT(lib.raw() == Library::MirrorsLibrary()); | 1436 |
| 1415 | 1437 cls = Class::New<MirrorReference>(); |
| 1416 cls = Class::New<MirrorReference>(); | 1438 RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib); |
| 1417 RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib); | |
| 1418 ) | 1439 ) |
| 1419 | 1440 |
| 1420 // Pre-register the collection library so we can place the vm class | 1441 // Pre-register the collection library so we can place the vm class |
| 1421 // LinkedHashMap there rather than the core library. | 1442 // LinkedHashMap there rather than the core library. |
| 1422 lib = Library::LookupLibrary(thread, Symbols::DartCollection()); | 1443 lib = Library::LookupLibrary(thread, Symbols::DartCollection()); |
| 1423 if (lib.IsNull()) { | 1444 if (lib.IsNull()) { |
| 1424 lib = Library::NewLibraryHelper(Symbols::DartCollection(), true); | 1445 lib = Library::NewLibraryHelper(Symbols::DartCollection(), true); |
| 1425 lib.SetLoadRequested(); | 1446 lib.SetLoadRequested(); |
| 1426 lib.Register(thread); | 1447 lib.Register(thread); |
| 1448 } | |
| 1427 object_store->set_bootstrap_library(ObjectStore::kCollection, lib); | 1449 object_store->set_bootstrap_library(ObjectStore::kCollection, lib); |
| 1428 } | 1450 ASSERT(!lib.IsNull()); |
| 1429 ASSERT(!lib.IsNull()); | 1451 ASSERT(lib.raw() == Library::CollectionLibrary()); |
| 1430 ASSERT(lib.raw() == Library::CollectionLibrary()); | 1452 cls = Class::New<LinkedHashMap>(); |
| 1431 cls = Class::New<LinkedHashMap>(); | 1453 object_store->set_linked_hash_map_class(cls); |
| 1432 object_store->set_linked_hash_map_class(cls); | 1454 cls.set_type_arguments_field_offset(LinkedHashMap::type_arguments_offset()); |
| 1433 cls.set_type_arguments_field_offset(LinkedHashMap::type_arguments_offset()); | 1455 cls.set_num_type_arguments(2); |
| 1434 cls.set_num_type_arguments(2); | 1456 cls.set_num_own_type_arguments(0); |
| 1435 cls.set_num_own_type_arguments(2); | 1457 RegisterPrivateClass(cls, Symbols::_LinkedHashMap(), lib); |
| 1436 RegisterPrivateClass(cls, Symbols::_LinkedHashMap(), lib); | 1458 pending_classes.Add(cls); |
| 1437 pending_classes.Add(cls); | 1459 |
| 1438 | 1460 // Pre-register the developer library so we can place the vm class |
| 1439 // Pre-register the developer library so we can place the vm class | 1461 // UserTag there rather than the core library. |
| 1440 // UserTag there rather than the core library. | 1462 lib = Library::LookupLibrary(thread, Symbols::DartDeveloper()); |
| 1441 lib = Library::LookupLibrary(thread, Symbols::DartDeveloper()); | 1463 if (lib.IsNull()) { |
| 1442 if (lib.IsNull()) { | 1464 lib = Library::NewLibraryHelper(Symbols::DartDeveloper(), true); |
| 1443 lib = Library::NewLibraryHelper(Symbols::DartDeveloper(), true); | 1465 lib.SetLoadRequested(); |
| 1444 lib.SetLoadRequested(); | 1466 lib.Register(thread); |
| 1445 lib.Register(thread); | 1467 } |
| 1446 object_store->set_bootstrap_library(ObjectStore::kDeveloper, lib); | 1468 object_store->set_bootstrap_library(ObjectStore::kDeveloper, lib); |
| 1447 } | 1469 ASSERT(!lib.IsNull()); |
| 1448 ASSERT(!lib.IsNull()); | 1470 ASSERT(lib.raw() == Library::DeveloperLibrary()); |
| 1449 ASSERT(lib.raw() == Library::DeveloperLibrary()); | 1471 cls = Class::New<UserTag>(); |
| 1450 | 1472 RegisterPrivateClass(cls, Symbols::_UserTag(), lib); |
| 1451 lib = Library::LookupLibrary(thread, Symbols::DartDeveloper()); | 1473 pending_classes.Add(cls); |
| 1452 ASSERT(!lib.IsNull()); | 1474 |
| 1453 cls = Class::New<UserTag>(); | 1475 // Setup some default native field classes which can be extended for |
| 1454 RegisterPrivateClass(cls, Symbols::_UserTag(), lib); | 1476 // specifying native fields in dart classes. |
| 1455 pending_classes.Add(cls); | 1477 Library::InitNativeWrappersLibrary(isolate, is_kernel); |
| 1456 | 1478 ASSERT(object_store->native_wrappers_library() != Library::null()); |
| 1457 // Setup some default native field classes which can be extended for | 1479 |
| 1458 // specifying native fields in dart classes. | 1480 // Pre-register the typed_data library so the native class implementations |
| 1459 Library::InitNativeWrappersLibrary(isolate); | 1481 // can be hooked up before compiling it. |
| 1460 ASSERT(object_store->native_wrappers_library() != Library::null()); | 1482 lib = Library::LookupLibrary(thread, Symbols::DartTypedData()); |
| 1461 | 1483 if (lib.IsNull()) { |
| 1462 // Pre-register the typed_data library so the native class implementations | 1484 lib = Library::NewLibraryHelper(Symbols::DartTypedData(), true); |
| 1463 // can be hooked up before compiling it. | 1485 lib.SetLoadRequested(); |
| 1464 lib = Library::LookupLibrary(thread, Symbols::DartTypedData()); | 1486 lib.Register(thread); |
| 1465 if (lib.IsNull()) { | 1487 } |
| 1466 lib = Library::NewLibraryHelper(Symbols::DartTypedData(), true); | |
| 1467 lib.SetLoadRequested(); | |
| 1468 lib.Register(thread); | |
| 1469 object_store->set_bootstrap_library(ObjectStore::kTypedData, lib); | 1488 object_store->set_bootstrap_library(ObjectStore::kTypedData, lib); |
| 1470 } | 1489 ASSERT(!lib.IsNull()); |
| 1471 ASSERT(!lib.IsNull()); | 1490 ASSERT(lib.raw() == Library::TypedDataLibrary()); |
| 1472 ASSERT(lib.raw() == Library::TypedDataLibrary()); | |
| 1473 #define REGISTER_TYPED_DATA_CLASS(clazz) \ | 1491 #define REGISTER_TYPED_DATA_CLASS(clazz) \ |
| 1474 cls = Class::NewTypedDataClass(kTypedData##clazz##ArrayCid); \ | 1492 cls = Class::NewTypedDataClass(kTypedData##clazz##ArrayCid); \ |
| 1475 RegisterClass(cls, Symbols::clazz##List(), lib); \ | 1493 RegisterClass(cls, Symbols::clazz##List(), lib); |
| 1476 | 1494 |
| 1477 DART_CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS); | 1495 DART_CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS); |
| 1478 #undef REGISTER_TYPED_DATA_CLASS | 1496 #undef REGISTER_TYPED_DATA_CLASS |
| 1479 #define REGISTER_TYPED_DATA_VIEW_CLASS(clazz) \ | 1497 #define REGISTER_TYPED_DATA_VIEW_CLASS(clazz) \ |
| 1480 cls = Class::NewTypedDataViewClass(kTypedData##clazz##ViewCid); \ | 1498 cls = Class::NewTypedDataViewClass(kTypedData##clazz##ViewCid); \ |
| 1481 RegisterPrivateClass(cls, Symbols::_##clazz##View(), lib); \ | 1499 RegisterPrivateClass(cls, Symbols::_##clazz##View(), lib); \ |
| 1482 pending_classes.Add(cls); \ | 1500 pending_classes.Add(cls); |
| 1483 | 1501 |
| 1484 CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_VIEW_CLASS); | 1502 CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_VIEW_CLASS); |
| 1485 cls = Class::NewTypedDataViewClass(kByteDataViewCid); | 1503 cls = Class::NewTypedDataViewClass(kByteDataViewCid); |
| 1486 RegisterPrivateClass(cls, Symbols::_ByteDataView(), lib); | 1504 RegisterPrivateClass(cls, Symbols::_ByteDataView(), lib); |
| 1487 pending_classes.Add(cls); | 1505 pending_classes.Add(cls); |
| 1488 #undef REGISTER_TYPED_DATA_VIEW_CLASS | 1506 #undef REGISTER_TYPED_DATA_VIEW_CLASS |
| 1489 #define REGISTER_EXT_TYPED_DATA_CLASS(clazz) \ | 1507 #define REGISTER_EXT_TYPED_DATA_CLASS(clazz) \ |
| 1490 cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid); \ | 1508 cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid); \ |
| 1491 RegisterPrivateClass(cls, Symbols::_External##clazz(), lib); \ | 1509 RegisterPrivateClass(cls, Symbols::_External##clazz(), lib); |
| 1492 | 1510 |
| 1493 cls = Class::New<Instance>(kByteBufferCid); | 1511 cls = Class::New<Instance>(kByteBufferCid); |
| 1494 cls.set_instance_size(0); | 1512 cls.set_instance_size(0); |
| 1495 cls.set_next_field_offset(-kWordSize); | 1513 cls.set_next_field_offset(-kWordSize); |
| 1496 RegisterClass(cls, Symbols::ByteBuffer(), lib); | 1514 RegisterClass(cls, Symbols::ByteBuffer(), lib); |
| 1497 pending_classes.Add(cls); | 1515 pending_classes.Add(cls); |
| 1498 | 1516 |
| 1499 CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS); | 1517 CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS); |
| 1500 #undef REGISTER_EXT_TYPED_DATA_CLASS | 1518 #undef REGISTER_EXT_TYPED_DATA_CLASS |
| 1501 // Register Float32x4 and Int32x4 in the object store. | 1519 // Register Float32x4 and Int32x4 in the object store. |
| 1502 cls = Class::New<Float32x4>(); | 1520 cls = Class::New<Float32x4>(); |
| 1503 RegisterClass(cls, Symbols::Float32x4(), lib); | 1521 RegisterClass(cls, Symbols::Float32x4(), lib); |
| 1504 cls.set_num_type_arguments(0); | 1522 cls.set_num_type_arguments(0); |
| 1505 cls.set_num_own_type_arguments(0); | 1523 cls.set_num_own_type_arguments(0); |
| 1506 cls.set_is_prefinalized(); | 1524 cls.set_is_prefinalized(); |
| 1507 pending_classes.Add(cls); | 1525 pending_classes.Add(cls); |
| 1508 object_store->set_float32x4_class(cls); | 1526 object_store->set_float32x4_class(cls); |
| 1509 type = Type::NewNonParameterizedType(cls); | 1527 type = Type::NewNonParameterizedType(cls); |
| 1510 object_store->set_float32x4_type(type); | 1528 object_store->set_float32x4_type(type); |
| 1511 | 1529 |
| 1512 cls = Class::New<Int32x4>(); | 1530 cls = Class::New<Int32x4>(); |
| 1513 RegisterClass(cls, Symbols::Int32x4(), lib); | 1531 RegisterClass(cls, Symbols::Int32x4(), lib); |
| 1514 cls.set_num_type_arguments(0); | 1532 cls.set_num_type_arguments(0); |
| 1515 cls.set_num_own_type_arguments(0); | 1533 cls.set_num_own_type_arguments(0); |
| 1516 cls.set_is_prefinalized(); | 1534 cls.set_is_prefinalized(); |
| 1517 pending_classes.Add(cls); | 1535 pending_classes.Add(cls); |
| 1518 object_store->set_int32x4_class(cls); | 1536 object_store->set_int32x4_class(cls); |
| 1519 type = Type::NewNonParameterizedType(cls); | 1537 type = Type::NewNonParameterizedType(cls); |
| 1520 object_store->set_int32x4_type(type); | 1538 object_store->set_int32x4_type(type); |
| 1521 | 1539 |
| 1522 cls = Class::New<Float64x2>(); | 1540 cls = Class::New<Float64x2>(); |
| 1523 RegisterClass(cls, Symbols::Float64x2(), lib); | 1541 RegisterClass(cls, Symbols::Float64x2(), lib); |
| 1524 cls.set_num_type_arguments(0); | 1542 cls.set_num_type_arguments(0); |
| 1525 cls.set_num_own_type_arguments(0); | 1543 cls.set_num_own_type_arguments(0); |
| 1526 cls.set_is_prefinalized(); | 1544 cls.set_is_prefinalized(); |
| 1527 pending_classes.Add(cls); | 1545 pending_classes.Add(cls); |
| 1528 object_store->set_float64x2_class(cls); | 1546 object_store->set_float64x2_class(cls); |
| 1529 type = Type::NewNonParameterizedType(cls); | 1547 type = Type::NewNonParameterizedType(cls); |
| 1530 object_store->set_float64x2_type(type); | 1548 object_store->set_float64x2_type(type); |
| 1531 | 1549 |
| 1532 // Set the super type of class Stacktrace to Object type so that the | 1550 // Set the super type of class Stacktrace to Object type so that the |
| 1533 // 'toString' method is implemented. | 1551 // 'toString' method is implemented. |
| 1534 type = object_store->object_type(); | 1552 type = object_store->object_type(); |
| 1535 stacktrace_cls.set_super_type(type); | 1553 stacktrace_cls.set_super_type(type); |
| 1536 | 1554 |
| 1537 // Abstract class that represents the Dart class Function. | 1555 // Abstract class that represents the Dart class Function. |
| 1538 cls = Class::New<Instance>(kIllegalCid); | 1556 cls = Class::New<Instance>(kIllegalCid); |
| 1539 cls.set_num_type_arguments(0); | 1557 cls.set_num_type_arguments(0); |
| 1540 cls.set_num_own_type_arguments(0); | 1558 cls.set_num_own_type_arguments(0); |
| 1541 cls.set_is_prefinalized(); | 1559 cls.set_is_prefinalized(); |
| 1542 RegisterClass(cls, Symbols::Function(), core_lib); | 1560 RegisterClass(cls, Symbols::Function(), core_lib); |
| 1543 pending_classes.Add(cls); | 1561 pending_classes.Add(cls); |
| 1544 type = Type::NewNonParameterizedType(cls); | 1562 type = Type::NewNonParameterizedType(cls); |
| 1545 object_store->set_function_type(type); | 1563 object_store->set_function_type(type); |
| 1546 | 1564 |
| 1547 cls = Class::New<Number>(); | 1565 cls = Class::New<Number>(); |
| 1548 RegisterClass(cls, Symbols::Number(), core_lib); | 1566 RegisterClass(cls, Symbols::Number(), core_lib); |
| 1549 pending_classes.Add(cls); | 1567 pending_classes.Add(cls); |
| 1550 type = Type::NewNonParameterizedType(cls); | 1568 type = Type::NewNonParameterizedType(cls); |
| 1551 object_store->set_number_type(type); | 1569 object_store->set_number_type(type); |
| 1552 | 1570 |
| 1553 cls = Class::New<Instance>(kIllegalCid); | 1571 cls = Class::New<Instance>(kIllegalCid); |
| 1554 RegisterClass(cls, Symbols::Int(), core_lib); | 1572 RegisterClass(cls, Symbols::Int(), core_lib); |
| 1555 cls.set_num_type_arguments(0); | 1573 cls.set_num_type_arguments(0); |
| 1556 cls.set_num_own_type_arguments(0); | 1574 cls.set_num_own_type_arguments(0); |
| 1557 cls.set_is_prefinalized(); | 1575 cls.set_is_prefinalized(); |
| 1558 pending_classes.Add(cls); | 1576 pending_classes.Add(cls); |
| 1559 type = Type::NewNonParameterizedType(cls); | 1577 type = Type::NewNonParameterizedType(cls); |
| 1560 object_store->set_int_type(type); | 1578 object_store->set_int_type(type); |
| 1561 | 1579 |
| 1562 cls = Class::New<Instance>(kIllegalCid); | 1580 cls = Class::New<Instance>(kIllegalCid); |
| 1563 RegisterClass(cls, Symbols::Double(), core_lib); | 1581 RegisterClass(cls, Symbols::Double(), core_lib); |
| 1564 cls.set_num_type_arguments(0); | 1582 cls.set_num_type_arguments(0); |
| 1565 cls.set_num_own_type_arguments(0); | 1583 cls.set_num_own_type_arguments(0); |
| 1566 cls.set_is_prefinalized(); | 1584 cls.set_is_prefinalized(); |
| 1567 pending_classes.Add(cls); | 1585 pending_classes.Add(cls); |
| 1568 type = Type::NewNonParameterizedType(cls); | 1586 type = Type::NewNonParameterizedType(cls); |
| 1569 object_store->set_double_type(type); | 1587 object_store->set_double_type(type); |
| 1570 | 1588 |
| 1571 name = Symbols::_String().raw(); | 1589 name = Symbols::_String().raw(); |
| 1572 cls = Class::New<Instance>(kIllegalCid); | 1590 cls = Class::New<Instance>(kIllegalCid); |
| 1573 RegisterClass(cls, name, core_lib); | 1591 RegisterClass(cls, name, core_lib); |
| 1574 cls.set_num_type_arguments(0); | 1592 cls.set_num_type_arguments(0); |
| 1575 cls.set_num_own_type_arguments(0); | 1593 cls.set_num_own_type_arguments(0); |
| 1576 cls.set_is_prefinalized(); | 1594 cls.set_is_prefinalized(); |
| 1577 pending_classes.Add(cls); | 1595 pending_classes.Add(cls); |
| 1578 type = Type::NewNonParameterizedType(cls); | 1596 type = Type::NewNonParameterizedType(cls); |
| 1579 object_store->set_string_type(type); | 1597 object_store->set_string_type(type); |
| 1580 | 1598 |
| 1581 cls = object_store->bool_class(); | 1599 cls = object_store->bool_class(); |
| 1582 type = Type::NewNonParameterizedType(cls); | 1600 type = Type::NewNonParameterizedType(cls); |
| 1583 object_store->set_bool_type(type); | 1601 object_store->set_bool_type(type); |
| 1584 | 1602 |
| 1585 cls = object_store->smi_class(); | 1603 cls = object_store->smi_class(); |
| 1586 type = Type::NewNonParameterizedType(cls); | 1604 type = Type::NewNonParameterizedType(cls); |
| 1587 object_store->set_smi_type(type); | 1605 object_store->set_smi_type(type); |
| 1588 | 1606 |
| 1589 cls = object_store->mint_class(); | 1607 cls = object_store->mint_class(); |
| 1590 type = Type::NewNonParameterizedType(cls); | 1608 type = Type::NewNonParameterizedType(cls); |
| 1591 object_store->set_mint_type(type); | 1609 object_store->set_mint_type(type); |
| 1592 | 1610 |
| 1593 // The classes 'void' and 'dynamic' are phoney classes to make type checking | 1611 // The classes 'void' and 'dynamic' are phony classes to make type checking |
| 1594 // more regular; they live in the VM isolate. The class 'void' is not | 1612 // more regular; they live in the VM isolate. The class 'void' is not |
| 1595 // registered in the class dictionary because its name is a reserved word. | 1613 // registered in the class dictionary because its name is a reserved word. |
| 1596 // The class 'dynamic' is registered in the class dictionary because its name | 1614 // The class 'dynamic' is registered in the class dictionary because its |
| 1597 // is a built-in identifier (this is wrong). | 1615 // name is a built-in identifier (this is wrong). The corresponding types |
| 1598 // The corresponding types are stored in the object store. | 1616 // are stored in the object store. |
| 1599 cls = object_store->null_class(); | 1617 cls = object_store->null_class(); |
| 1600 type = Type::NewNonParameterizedType(cls); | 1618 type = Type::NewNonParameterizedType(cls); |
| 1601 object_store->set_null_type(type); | 1619 object_store->set_null_type(type); |
| 1602 | 1620 |
| 1603 // Consider removing when/if Null becomes an ordinary class. | 1621 // Consider removing when/if Null becomes an ordinary class. |
| 1604 type = object_store->object_type(); | 1622 type = object_store->object_type(); |
| 1605 cls.set_super_type(type); | 1623 cls.set_super_type(type); |
| 1606 | 1624 |
| 1607 // Finish the initialization by compiling the bootstrap scripts containing the | 1625 // Finish the initialization by compiling the bootstrap scripts containing |
| 1608 // base interfaces and the implementation of the internal classes. | 1626 // the base interfaces and the implementation of the internal classes. |
| 1609 const Error& error = Error::Handle(Bootstrap::LoadandCompileScripts()); | 1627 const Error& error = Error::Handle( |
| 1610 if (!error.IsNull()) { | 1628 zone, Bootstrap::DoBootstrapping(kernel_buffer, kernel_buffer_length)); |
| 1611 return error.raw(); | 1629 if (!error.IsNull()) { |
| 1612 } | 1630 return error.raw(); |
| 1613 | 1631 } |
| 1614 ClassFinalizer::VerifyBootstrapClasses(); | 1632 |
| 1615 | 1633 ClassFinalizer::VerifyBootstrapClasses(); |
| 1616 // Set up the intrinsic state of all functions (core, math and typed data). | 1634 |
| 1617 Intrinsifier::InitializeState(); | 1635 // Set up the intrinsic state of all functions (core, math and typed data). |
| 1618 | 1636 Intrinsifier::InitializeState(); |
| 1619 // Set up recognized state of all functions (core, math and typed data). | 1637 |
| 1620 MethodRecognizer::InitializeState(); | 1638 // Set up recognized state of all functions (core, math and typed data). |
| 1621 | 1639 MethodRecognizer::InitializeState(); |
| 1622 // Adds static const fields (class ids) to the class 'ClassID'); | 1640 |
| 1623 lib = Library::LookupLibrary(thread, Symbols::DartInternal()); | 1641 isolate->object_store()->InitKnownObjects(); |
| 1624 ASSERT(!lib.IsNull()); | 1642 } else { |
| 1625 cls = lib.LookupClassAllowPrivate(Symbols::ClassID()); | 1643 // Object::Init version when we are running in a version of dart that has a |
| 1626 ASSERT(!cls.IsNull()); | 1644 // full snapshot linked in and an isolate is initialized using the full |
| 1627 Field& field = Field::Handle(zone); | 1645 // snapshot. |
| 1628 Smi& value = Smi::Handle(zone); | 1646 ObjectStore* object_store = isolate->object_store(); |
| 1629 String& field_name = String::Handle(zone); | 1647 |
| 1630 | 1648 Class& cls = Class::Handle(zone); |
| 1631 #define CLASS_LIST_WITH_NULL(V) \ | 1649 |
| 1632 V(Null) \ | 1650 // Set up empty classes in the object store, these will get initialized |
| 1633 CLASS_LIST_NO_OBJECT(V) | 1651 // correctly when we read from the snapshot. This is done to allow |
| 1634 | 1652 // bootstrapping of reading classes from the snapshot. Some classes are not |
| 1635 #define ADD_SET_FIELD(clazz) \ | 1653 // stored in the object store. Yet we still need to create their Class |
| 1636 field_name = Symbols::New(thread, "cid"#clazz); \ | 1654 // object so that they get put into the class_table (as a side effect of |
| 1637 field = Field::New(field_name, true, false, true, false, cls, \ | 1655 // Class::New()). |
| 1638 Type::Handle(Type::IntType()), TokenPosition::kMinSource); \ | 1656 cls = Class::New<Instance>(kInstanceCid); |
| 1639 value = Smi::New(k##clazz##Cid); \ | 1657 object_store->set_object_class(cls); |
| 1640 field.SetStaticValue(value, true); \ | 1658 |
| 1641 cls.AddField(field); \ | 1659 cls = Class::New<LibraryPrefix>(); |
| 1642 | 1660 cls = Class::New<Type>(); |
| 1643 CLASS_LIST_WITH_NULL(ADD_SET_FIELD) | 1661 cls = Class::New<TypeRef>(); |
| 1644 #undef ADD_SET_FIELD | 1662 cls = Class::New<TypeParameter>(); |
| 1645 | 1663 cls = Class::New<BoundedType>(); |
| 1646 isolate->object_store()->InitKnownObjects(); | 1664 cls = Class::New<MixinAppType>(); |
| 1647 | 1665 |
| 1648 return Error::null(); | 1666 cls = Class::New<Array>(); |
| 1649 #else // defined(DART_NO_SNAPSHOT). | 1667 object_store->set_array_class(cls); |
| 1650 // Object::Init version when we are running in a version of dart that has | 1668 |
| 1651 // a full snapshot linked in and an isolate is initialized using the full | 1669 cls = Class::New<Array>(kImmutableArrayCid); |
| 1652 // snapshot. | 1670 object_store->set_immutable_array_class(cls); |
| 1653 ObjectStore* object_store = isolate->object_store(); | 1671 |
| 1654 | 1672 cls = Class::New<GrowableObjectArray>(); |
| 1655 Class& cls = Class::Handle(); | 1673 object_store->set_growable_object_array_class(cls); |
| 1656 | 1674 |
| 1657 // Set up empty classes in the object store, these will get | 1675 cls = Class::New<LinkedHashMap>(); |
| 1658 // initialized correctly when we read from the snapshot. | 1676 object_store->set_linked_hash_map_class(cls); |
| 1659 // This is done to allow bootstrapping of reading classes from the snapshot. | 1677 |
| 1660 // Some classes are not stored in the object store. Yet we still need to | 1678 cls = Class::New<Float32x4>(); |
| 1661 // create their Class object so that they get put into the class_table | 1679 object_store->set_float32x4_class(cls); |
| 1662 // (as a side effect of Class::New()). | 1680 |
| 1663 | 1681 cls = Class::New<Int32x4>(); |
| 1664 cls = Class::New<Instance>(kInstanceCid); | 1682 object_store->set_int32x4_class(cls); |
| 1665 object_store->set_object_class(cls); | 1683 |
| 1666 | 1684 cls = Class::New<Float64x2>(); |
| 1667 cls = Class::New<LibraryPrefix>(); | 1685 object_store->set_float64x2_class(cls); |
| 1668 cls = Class::New<Type>(); | |
| 1669 cls = Class::New<TypeRef>(); | |
| 1670 cls = Class::New<TypeParameter>(); | |
| 1671 cls = Class::New<BoundedType>(); | |
| 1672 cls = Class::New<MixinAppType>(); | |
| 1673 | |
| 1674 cls = Class::New<Array>(); | |
| 1675 object_store->set_array_class(cls); | |
| 1676 | |
| 1677 cls = Class::New<Array>(kImmutableArrayCid); | |
| 1678 object_store->set_immutable_array_class(cls); | |
| 1679 | |
| 1680 cls = Class::New<GrowableObjectArray>(); | |
| 1681 object_store->set_growable_object_array_class(cls); | |
| 1682 | |
| 1683 cls = Class::New<LinkedHashMap>(); | |
| 1684 object_store->set_linked_hash_map_class(cls); | |
| 1685 | |
| 1686 cls = Class::New<Float32x4>(); | |
| 1687 object_store->set_float32x4_class(cls); | |
| 1688 | |
| 1689 cls = Class::New<Int32x4>(); | |
| 1690 object_store->set_int32x4_class(cls); | |
| 1691 | |
| 1692 cls = Class::New<Float64x2>(); | |
| 1693 object_store->set_float64x2_class(cls); | |
| 1694 | 1686 |
| 1695 #define REGISTER_TYPED_DATA_CLASS(clazz) \ | 1687 #define REGISTER_TYPED_DATA_CLASS(clazz) \ |
| 1696 cls = Class::NewTypedDataClass(kTypedData##clazz##Cid); | 1688 cls = Class::NewTypedDataClass(kTypedData##clazz##Cid); |
| 1697 CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS); | 1689 CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS); |
| 1698 #undef REGISTER_TYPED_DATA_CLASS | 1690 #undef REGISTER_TYPED_DATA_CLASS |
| 1699 #define REGISTER_TYPED_DATA_VIEW_CLASS(clazz) \ | 1691 #define REGISTER_TYPED_DATA_VIEW_CLASS(clazz) \ |
| 1700 cls = Class::NewTypedDataViewClass(kTypedData##clazz##ViewCid); | 1692 cls = Class::NewTypedDataViewClass(kTypedData##clazz##ViewCid); |
| 1701 CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_VIEW_CLASS); | 1693 CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_VIEW_CLASS); |
| 1702 #undef REGISTER_TYPED_DATA_VIEW_CLASS | 1694 #undef REGISTER_TYPED_DATA_VIEW_CLASS |
| 1703 cls = Class::NewTypedDataViewClass(kByteDataViewCid); | 1695 cls = Class::NewTypedDataViewClass(kByteDataViewCid); |
| 1704 #define REGISTER_EXT_TYPED_DATA_CLASS(clazz) \ | 1696 #define REGISTER_EXT_TYPED_DATA_CLASS(clazz) \ |
| 1705 cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid); | 1697 cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid); |
| 1706 CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS); | 1698 CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS); |
| 1707 #undef REGISTER_EXT_TYPED_DATA_CLASS | 1699 #undef REGISTER_EXT_TYPED_DATA_CLASS |
| 1708 | 1700 |
| 1709 cls = Class::New<Instance>(kByteBufferCid); | 1701 cls = Class::New<Instance>(kByteBufferCid); |
| 1710 | 1702 |
| 1711 cls = Class::New<Integer>(); | 1703 cls = Class::New<Integer>(); |
| 1712 object_store->set_integer_implementation_class(cls); | 1704 object_store->set_integer_implementation_class(cls); |
| 1713 | 1705 |
| 1714 cls = Class::New<Smi>(); | 1706 cls = Class::New<Smi>(); |
| 1715 object_store->set_smi_class(cls); | 1707 object_store->set_smi_class(cls); |
| 1716 | 1708 |
| 1717 cls = Class::New<Mint>(); | 1709 cls = Class::New<Mint>(); |
| 1718 object_store->set_mint_class(cls); | 1710 object_store->set_mint_class(cls); |
| 1719 | 1711 |
| 1720 cls = Class::New<Double>(); | 1712 cls = Class::New<Double>(); |
| 1721 object_store->set_double_class(cls); | 1713 object_store->set_double_class(cls); |
| 1722 | 1714 |
| 1723 cls = Class::New<Closure>(); | 1715 cls = Class::New<Closure>(); |
| 1724 object_store->set_closure_class(cls); | 1716 object_store->set_closure_class(cls); |
| 1725 | 1717 |
| 1726 cls = Class::New<Bigint>(); | 1718 cls = Class::New<Bigint>(); |
| 1727 object_store->set_bigint_class(cls); | 1719 object_store->set_bigint_class(cls); |
| 1728 | 1720 |
| 1729 cls = Class::NewStringClass(kOneByteStringCid); | 1721 cls = Class::NewStringClass(kOneByteStringCid); |
| 1730 object_store->set_one_byte_string_class(cls); | 1722 object_store->set_one_byte_string_class(cls); |
| 1731 | 1723 |
| 1732 cls = Class::NewStringClass(kTwoByteStringCid); | 1724 cls = Class::NewStringClass(kTwoByteStringCid); |
| 1733 object_store->set_two_byte_string_class(cls); | 1725 object_store->set_two_byte_string_class(cls); |
| 1734 | 1726 |
| 1735 cls = Class::NewStringClass(kExternalOneByteStringCid); | 1727 cls = Class::NewStringClass(kExternalOneByteStringCid); |
| 1736 object_store->set_external_one_byte_string_class(cls); | 1728 object_store->set_external_one_byte_string_class(cls); |
| 1737 | 1729 |
| 1738 cls = Class::NewStringClass(kExternalTwoByteStringCid); | 1730 cls = Class::NewStringClass(kExternalTwoByteStringCid); |
| 1739 object_store->set_external_two_byte_string_class(cls); | 1731 object_store->set_external_two_byte_string_class(cls); |
| 1740 | 1732 |
| 1741 cls = Class::New<Bool>(); | 1733 cls = Class::New<Bool>(); |
| 1742 object_store->set_bool_class(cls); | 1734 object_store->set_bool_class(cls); |
| 1743 | 1735 |
| 1744 cls = Class::New<Instance>(kNullCid); | 1736 cls = Class::New<Instance>(kNullCid); |
| 1745 object_store->set_null_class(cls); | 1737 object_store->set_null_class(cls); |
| 1746 | 1738 |
| 1747 cls = Class::New<Capability>(); | 1739 cls = Class::New<Capability>(); |
| 1748 cls = Class::New<ReceivePort>(); | 1740 cls = Class::New<ReceivePort>(); |
| 1749 cls = Class::New<SendPort>(); | 1741 cls = Class::New<SendPort>(); |
| 1750 cls = Class::New<Stacktrace>(); | 1742 cls = Class::New<Stacktrace>(); |
| 1751 cls = Class::New<RegExp>(); | 1743 cls = Class::New<RegExp>(); |
| 1752 cls = Class::New<Number>(); | 1744 cls = Class::New<Number>(); |
| 1753 | 1745 |
| 1754 cls = Class::New<WeakProperty>(); | 1746 cls = Class::New<WeakProperty>(); |
| 1755 object_store->set_weak_property_class(cls); | 1747 object_store->set_weak_property_class(cls); |
| 1756 | 1748 |
| 1757 cls = Class::New<MirrorReference>(); | 1749 cls = Class::New<MirrorReference>(); |
| 1758 cls = Class::New<UserTag>(); | 1750 cls = Class::New<UserTag>(); |
| 1759 | 1751 |
| 1760 const Context& context = Context::Handle(zone, | 1752 const Context& context = Context::Handle(zone, Context::New(0, Heap::kOld)); |
| 1761 Context::New(0, Heap::kOld)); | 1753 object_store->set_empty_context(context); |
| 1762 object_store->set_empty_context(context); | 1754 } |
| 1763 | |
| 1764 #endif // defined(DART_NO_SNAPSHOT). | |
| 1765 | |
| 1766 return Error::null(); | 1755 return Error::null(); |
| 1767 } | 1756 } |
| 1768 | 1757 |
| 1769 | 1758 |
| 1770 #if defined(DEBUG) | 1759 #if defined(DEBUG) |
| 1771 bool Object:: InVMHeap() const { | 1760 bool Object:: InVMHeap() const { |
| 1772 if (FLAG_verify_handles && raw()->IsVMHeapObject()) { | 1761 if (FLAG_verify_handles && raw()->IsVMHeapObject()) { |
| 1773 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); | 1762 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); |
| 1774 ASSERT(vm_isolate_heap->Contains(RawObject::ToAddr(raw()))); | 1763 ASSERT(vm_isolate_heap->Contains(RawObject::ToAddr(raw()))); |
| 1775 } | 1764 } |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1935 // Old original doesn't need to be remembered, so neither does the clone. | 1924 // Old original doesn't need to be remembered, so neither does the clone. |
| 1936 return raw_clone; | 1925 return raw_clone; |
| 1937 } | 1926 } |
| 1938 StoreBufferUpdateVisitor visitor(Thread::Current(), raw_clone); | 1927 StoreBufferUpdateVisitor visitor(Thread::Current(), raw_clone); |
| 1939 raw_clone->VisitPointers(&visitor); | 1928 raw_clone->VisitPointers(&visitor); |
| 1940 return raw_clone; | 1929 return raw_clone; |
| 1941 } | 1930 } |
| 1942 | 1931 |
| 1943 | 1932 |
| 1944 RawString* Class::Name() const { | 1933 RawString* Class::Name() const { |
| 1945 ASSERT(raw_ptr()->name_ != String::null()); | |
| 1946 return raw_ptr()->name_; | 1934 return raw_ptr()->name_; |
| 1947 } | 1935 } |
| 1948 | 1936 |
| 1949 | 1937 |
| 1950 RawString* Class::ScrubbedName() const { | 1938 RawString* Class::ScrubbedName() const { |
| 1951 return String::ScrubName(String::Handle(Name())); | 1939 return String::ScrubName(String::Handle(Name())); |
| 1952 } | 1940 } |
| 1953 | 1941 |
| 1954 | 1942 |
| 1955 RawString* Class::UserVisibleName() const { | 1943 RawString* Class::UserVisibleName() const { |
| (...skipping 2516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4472 while (it.MoveNext()) { | 4460 while (it.MoveNext()) { |
| 4473 constant ^= set.GetKey(it.Current()); | 4461 constant ^= set.GetKey(it.Current()); |
| 4474 ASSERT(!constant.IsNull()); | 4462 ASSERT(!constant.IsNull()); |
| 4475 ASSERT(constant.IsCanonical()); | 4463 ASSERT(constant.IsCanonical()); |
| 4476 InsertCanonicalConstant(zone, constant); | 4464 InsertCanonicalConstant(zone, constant); |
| 4477 } | 4465 } |
| 4478 set.Release(); | 4466 set.Release(); |
| 4479 } | 4467 } |
| 4480 | 4468 |
| 4481 | 4469 |
| 4482 RawUnresolvedClass* UnresolvedClass::New(const LibraryPrefix& library_prefix, | 4470 RawUnresolvedClass* UnresolvedClass::New(const Object& library_prefix, |
| 4483 const String& ident, | 4471 const String& ident, |
| 4484 TokenPosition token_pos) { | 4472 TokenPosition token_pos) { |
| 4485 const UnresolvedClass& type = UnresolvedClass::Handle(UnresolvedClass::New()); | 4473 const UnresolvedClass& type = UnresolvedClass::Handle(UnresolvedClass::New()); |
| 4486 type.set_library_prefix(library_prefix); | 4474 type.set_library_or_library_prefix(library_prefix); |
| 4487 type.set_ident(ident); | 4475 type.set_ident(ident); |
| 4488 type.set_token_pos(token_pos); | 4476 type.set_token_pos(token_pos); |
| 4489 return type.raw(); | 4477 return type.raw(); |
| 4490 } | 4478 } |
| 4491 | 4479 |
| 4492 | 4480 |
| 4493 RawUnresolvedClass* UnresolvedClass::New() { | 4481 RawUnresolvedClass* UnresolvedClass::New() { |
| 4494 ASSERT(Object::unresolved_class_class() != Class::null()); | 4482 ASSERT(Object::unresolved_class_class() != Class::null()); |
| 4495 RawObject* raw = Object::Allocate(UnresolvedClass::kClassId, | 4483 RawObject* raw = Object::Allocate(UnresolvedClass::kClassId, |
| 4496 UnresolvedClass::InstanceSize(), | 4484 UnresolvedClass::InstanceSize(), |
| 4497 Heap::kOld); | 4485 Heap::kOld); |
| 4498 return reinterpret_cast<RawUnresolvedClass*>(raw); | 4486 return reinterpret_cast<RawUnresolvedClass*>(raw); |
| 4499 } | 4487 } |
| 4500 | 4488 |
| 4501 | 4489 |
| 4502 void UnresolvedClass::set_token_pos(TokenPosition token_pos) const { | 4490 void UnresolvedClass::set_token_pos(TokenPosition token_pos) const { |
| 4503 ASSERT(!token_pos.IsClassifying()); | 4491 ASSERT(!token_pos.IsClassifying()); |
| 4504 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); | 4492 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); |
| 4505 } | 4493 } |
| 4506 | 4494 |
| 4507 | 4495 |
| 4508 void UnresolvedClass::set_ident(const String& ident) const { | 4496 void UnresolvedClass::set_ident(const String& ident) const { |
| 4509 StorePointer(&raw_ptr()->ident_, ident.raw()); | 4497 StorePointer(&raw_ptr()->ident_, ident.raw()); |
| 4510 } | 4498 } |
| 4511 | 4499 |
| 4512 | 4500 |
| 4513 void UnresolvedClass::set_library_prefix( | 4501 void UnresolvedClass::set_library_or_library_prefix( |
| 4514 const LibraryPrefix& library_prefix) const { | 4502 const Object& library_prefix) const { |
| 4515 StorePointer(&raw_ptr()->library_prefix_, library_prefix.raw()); | 4503 StorePointer(&raw_ptr()->library_or_library_prefix_, library_prefix.raw()); |
| 4516 } | 4504 } |
| 4517 | 4505 |
| 4518 | 4506 |
| 4519 RawString* UnresolvedClass::Name() const { | 4507 RawString* UnresolvedClass::Name() const { |
| 4520 if (library_prefix() != LibraryPrefix::null()) { | 4508 if (library_or_library_prefix() != Object::null()) { |
| 4521 Thread* thread = Thread::Current(); | 4509 Thread* thread = Thread::Current(); |
| 4522 Zone* zone = thread->zone(); | 4510 Zone* zone = thread->zone(); |
| 4523 const LibraryPrefix& lib_prefix = LibraryPrefix::Handle(zone, | 4511 const Object& lib_prefix = |
| 4524 library_prefix()); | 4512 Object::Handle(zone, library_or_library_prefix()); |
| 4525 const String& name = String::Handle(zone, lib_prefix.name()); // Qualifier. | 4513 String& name = String::Handle(zone); // Qualifier. |
| 4514 if (lib_prefix.IsLibraryPrefix()) { | |
| 4515 name = LibraryPrefix::Cast(lib_prefix).name(); | |
| 4516 } else { | |
| 4517 name = Library::Cast(lib_prefix).name(); | |
| 4518 } | |
| 4526 GrowableHandlePtrArray<const String> strs(zone, 3); | 4519 GrowableHandlePtrArray<const String> strs(zone, 3); |
| 4527 strs.Add(name); | 4520 strs.Add(name); |
| 4528 strs.Add(Symbols::Dot()); | 4521 strs.Add(Symbols::Dot()); |
| 4529 strs.Add(String::Handle(zone, ident())); | 4522 strs.Add(String::Handle(zone, ident())); |
| 4530 return Symbols::FromConcatAll(thread, strs); | 4523 return Symbols::FromConcatAll(thread, strs); |
| 4531 } else { | 4524 } else { |
| 4532 return ident(); | 4525 return ident(); |
| 4533 } | 4526 } |
| 4534 } | 4527 } |
| 4535 | 4528 |
| (...skipping 2698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7234 for (intptr_t i = 1; i < array.Length(); i++) { | 7227 for (intptr_t i = 1; i < array.Length(); i++) { |
| 7235 ic_data ^= array.At(i); | 7228 ic_data ^= array.At(i); |
| 7236 if (ic_data.deopt_id() == deopt_id) { | 7229 if (ic_data.deopt_id() == deopt_id) { |
| 7237 ic_data.AddDeoptReason(reason); | 7230 ic_data.AddDeoptReason(reason); |
| 7238 } | 7231 } |
| 7239 } | 7232 } |
| 7240 } | 7233 } |
| 7241 | 7234 |
| 7242 | 7235 |
| 7243 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const { | 7236 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const { |
| 7244 if (SourceFingerprint() != fp) { | 7237 if ((kernel_function() == NULL) && (SourceFingerprint() != fp)) { |
| 7245 const bool recalculatingFingerprints = false; | 7238 const bool recalculatingFingerprints = false; |
| 7246 if (recalculatingFingerprints) { | 7239 if (recalculatingFingerprints) { |
| 7247 // This output can be copied into a file, then used with sed | 7240 // This output can be copied into a file, then used with sed |
| 7248 // to replace the old values. | 7241 // to replace the old values. |
| 7249 // sed -i .bak -f /tmp/newkeys runtime/vm/method_recognizer.h | 7242 // sed -i .bak -f /tmp/newkeys runtime/vm/method_recognizer.h |
| 7250 THR_Print("s/0x%08x/0x%08x/\n", fp, SourceFingerprint()); | 7243 THR_Print("s/0x%08x/0x%08x/\n", fp, SourceFingerprint()); |
| 7251 } else { | 7244 } else { |
| 7252 THR_Print("FP mismatch while recognizing method %s:" | 7245 THR_Print("FP mismatch while recognizing method %s:" |
| 7253 " expecting 0x%08x found 0x%08x\n", | 7246 " expecting 0x%08x found 0x%08x\n", |
| 7254 ToFullyQualifiedCString(), | 7247 ToFullyQualifiedCString(), |
| (...skipping 3308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10563 RawObject* Library::Evaluate(const String& expr, | 10556 RawObject* Library::Evaluate(const String& expr, |
| 10564 const Array& param_names, | 10557 const Array& param_names, |
| 10565 const Array& param_values) const { | 10558 const Array& param_values) const { |
| 10566 // Evaluate the expression as a static function of the toplevel class. | 10559 // Evaluate the expression as a static function of the toplevel class. |
| 10567 Class& top_level_class = Class::Handle(toplevel_class()); | 10560 Class& top_level_class = Class::Handle(toplevel_class()); |
| 10568 ASSERT(top_level_class.is_finalized()); | 10561 ASSERT(top_level_class.is_finalized()); |
| 10569 return top_level_class.Evaluate(expr, param_names, param_values); | 10562 return top_level_class.Evaluate(expr, param_names, param_values); |
| 10570 } | 10563 } |
| 10571 | 10564 |
| 10572 | 10565 |
| 10573 void Library::InitNativeWrappersLibrary(Isolate* isolate) { | 10566 void Library::InitNativeWrappersLibrary(Isolate* isolate, bool is_kernel) { |
| 10574 static const int kNumNativeWrappersClasses = 4; | 10567 static const int kNumNativeWrappersClasses = 4; |
| 10575 COMPILE_ASSERT((kNumNativeWrappersClasses > 0) && | 10568 COMPILE_ASSERT((kNumNativeWrappersClasses > 0) && |
| 10576 (kNumNativeWrappersClasses < 10)); | 10569 (kNumNativeWrappersClasses < 10)); |
| 10577 Thread* thread = Thread::Current(); | 10570 Thread* thread = Thread::Current(); |
| 10578 Zone* zone = thread->zone(); | 10571 Zone* zone = thread->zone(); |
| 10579 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); | 10572 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); |
| 10580 const Library& native_flds_lib = Library::Handle(zone, | 10573 const Library& native_flds_lib = Library::Handle(zone, |
| 10581 Library::NewLibraryHelper(native_flds_lib_url, false)); | 10574 Library::NewLibraryHelper(native_flds_lib_url, false)); |
| 10582 const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName(); | 10575 const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName(); |
| 10583 native_flds_lib.SetName(native_flds_lib_name); | 10576 native_flds_lib.SetName(native_flds_lib_name); |
| 10584 native_flds_lib.SetLoadRequested(); | 10577 native_flds_lib.SetLoadRequested(); |
| 10585 native_flds_lib.Register(thread); | 10578 native_flds_lib.Register(thread); |
| 10586 native_flds_lib.SetLoadInProgress(); | 10579 native_flds_lib.SetLoadInProgress(); |
| 10587 isolate->object_store()->set_native_wrappers_library(native_flds_lib); | 10580 isolate->object_store()->set_native_wrappers_library(native_flds_lib); |
| 10588 static const char* const kNativeWrappersClass = "NativeFieldWrapperClass"; | 10581 static const char* const kNativeWrappersClass = "NativeFieldWrapperClass"; |
| 10589 static const int kNameLength = 25; | 10582 static const int kNameLength = 25; |
| 10590 ASSERT(kNameLength == (strlen(kNativeWrappersClass) + 1 + 1)); | 10583 ASSERT(kNameLength == (strlen(kNativeWrappersClass) + 1 + 1)); |
| 10591 char name_buffer[kNameLength]; | 10584 char name_buffer[kNameLength]; |
| 10592 String& cls_name = String::Handle(zone); | 10585 String& cls_name = String::Handle(zone); |
| 10593 for (int fld_cnt = 1; fld_cnt <= kNumNativeWrappersClasses; fld_cnt++) { | 10586 for (int fld_cnt = 1; fld_cnt <= kNumNativeWrappersClasses; fld_cnt++) { |
| 10594 OS::SNPrint(name_buffer, | 10587 OS::SNPrint(name_buffer, |
| 10595 kNameLength, | 10588 kNameLength, |
| 10596 "%s%d", | 10589 "%s%d", |
| 10597 kNativeWrappersClass, | 10590 kNativeWrappersClass, |
| 10598 fld_cnt); | 10591 fld_cnt); |
| 10599 cls_name = Symbols::New(thread, name_buffer); | 10592 cls_name = Symbols::New(thread, name_buffer); |
| 10600 Class::NewNativeWrapper(native_flds_lib, cls_name, fld_cnt); | 10593 Class::NewNativeWrapper(native_flds_lib, cls_name, fld_cnt); |
| 10601 } | 10594 } |
| 10602 native_flds_lib.SetLoaded(); | 10595 // NOTE: If we bootstrap from a Kernel IR file we want to generate the |
| 10596 // synthetic constructors for the native wrapper classes. We leave this up to | |
| 10597 // the [KernelReader] who will take care of it later. | |
| 10598 if (!is_kernel) { | |
| 10599 native_flds_lib.SetLoaded(); | |
| 10600 } | |
| 10603 } | 10601 } |
| 10604 | 10602 |
| 10605 | 10603 |
| 10606 // LibraryLookupSet maps URIs to libraries. | 10604 // LibraryLookupSet maps URIs to libraries. |
| 10607 class LibraryLookupTraits { | 10605 class LibraryLookupTraits { |
| 10608 public: | 10606 public: |
| 10609 static const char* Name() { return "LibraryLookupTraits"; } | 10607 static const char* Name() { return "LibraryLookupTraits"; } |
| 10610 static bool ReportStats() { return false; } | 10608 static bool ReportStats() { return false; } |
| 10611 | 10609 |
| 10612 static bool IsMatch(const Object& a, const Object& b) { | 10610 static bool IsMatch(const Object& a, const Object& b) { |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10833 return Isolate::Current()->object_store()->collection_library(); | 10831 return Isolate::Current()->object_store()->collection_library(); |
| 10834 } | 10832 } |
| 10835 | 10833 |
| 10836 | 10834 |
| 10837 RawLibrary* Library::DeveloperLibrary() { | 10835 RawLibrary* Library::DeveloperLibrary() { |
| 10838 return Isolate::Current()->object_store()->developer_library(); | 10836 return Isolate::Current()->object_store()->developer_library(); |
| 10839 } | 10837 } |
| 10840 | 10838 |
| 10841 | 10839 |
| 10842 RawLibrary* Library::InternalLibrary() { | 10840 RawLibrary* Library::InternalLibrary() { |
| 10843 return Isolate::Current()->object_store()->internal_library(); | 10841 return Isolate::Current()->object_store()->_internal_library(); |
| 10844 } | 10842 } |
| 10845 | 10843 |
| 10846 | 10844 |
| 10847 RawLibrary* Library::IsolateLibrary() { | 10845 RawLibrary* Library::IsolateLibrary() { |
| 10848 return Isolate::Current()->object_store()->isolate_library(); | 10846 return Isolate::Current()->object_store()->isolate_library(); |
| 10849 } | 10847 } |
| 10850 | 10848 |
| 10851 | 10849 |
| 10852 RawLibrary* Library::MathLibrary() { | 10850 RawLibrary* Library::MathLibrary() { |
| 10853 return Isolate::Current()->object_store()->math_library(); | 10851 return Isolate::Current()->object_store()->math_library(); |
| 10854 } | 10852 } |
| 10855 | 10853 |
| 10856 | 10854 |
| 10855 #if !defined(PRODUCT) | |
| 10857 RawLibrary* Library::MirrorsLibrary() { | 10856 RawLibrary* Library::MirrorsLibrary() { |
| 10858 return Isolate::Current()->object_store()->mirrors_library(); | 10857 return Isolate::Current()->object_store()->mirrors_library(); |
| 10859 } | 10858 } |
| 10859 #endif | |
| 10860 | 10860 |
| 10861 | 10861 |
| 10862 RawLibrary* Library::NativeWrappersLibrary() { | 10862 RawLibrary* Library::NativeWrappersLibrary() { |
| 10863 return Isolate::Current()->object_store()->native_wrappers_library(); | 10863 return Isolate::Current()->object_store()->native_wrappers_library(); |
| 10864 } | 10864 } |
| 10865 | 10865 |
| 10866 | 10866 |
| 10867 RawLibrary* Library::ProfilerLibrary() { | 10867 RawLibrary* Library::ProfilerLibrary() { |
| 10868 return Isolate::Current()->object_store()->profiler_library(); | 10868 return Isolate::Current()->object_store()->profiler_library(); |
| 10869 } | 10869 } |
| 10870 | 10870 |
| 10871 | 10871 |
| 10872 RawLibrary* Library::TypedDataLibrary() { | 10872 RawLibrary* Library::TypedDataLibrary() { |
| 10873 return Isolate::Current()->object_store()->typed_data_library(); | 10873 return Isolate::Current()->object_store()->typed_data_library(); |
| 10874 } | 10874 } |
| 10875 | 10875 |
| 10876 | 10876 |
| 10877 RawLibrary* Library::VMServiceLibrary() { | 10877 RawLibrary* Library::VMServiceLibrary() { |
| 10878 return Isolate::Current()->object_store()->vmservice_library(); | 10878 return Isolate::Current()->object_store()->_vmservice_library(); |
| 10879 } | 10879 } |
| 10880 | 10880 |
| 10881 | 10881 |
| 10882 const char* Library::ToCString() const { | 10882 const char* Library::ToCString() const { |
| 10883 const String& name = String::Handle(url()); | 10883 const String& name = String::Handle(url()); |
| 10884 return OS::SCreate(Thread::Current()->zone(), | 10884 return OS::SCreate(Thread::Current()->zone(), |
| 10885 "Library:'%s'", name.ToCString()); | 10885 "Library:'%s'", name.ToCString()); |
| 10886 } | 10886 } |
| 10887 | 10887 |
| 10888 | 10888 |
| (...skipping 6878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17767 | 17767 |
| 17768 | 17768 |
| 17769 RawTypeRef* TypeRef::New(const AbstractType& type) { | 17769 RawTypeRef* TypeRef::New(const AbstractType& type) { |
| 17770 const TypeRef& result = TypeRef::Handle(TypeRef::New()); | 17770 const TypeRef& result = TypeRef::Handle(TypeRef::New()); |
| 17771 result.set_type(type); | 17771 result.set_type(type); |
| 17772 return result.raw(); | 17772 return result.raw(); |
| 17773 } | 17773 } |
| 17774 | 17774 |
| 17775 | 17775 |
| 17776 const char* TypeRef::ToCString() const { | 17776 const char* TypeRef::ToCString() const { |
| 17777 AbstractType& ref_type = AbstractType::Handle(type()); | |
| 17778 if (ref_type.IsNull()) { | |
| 17779 return "TypeRef: null"; | |
| 17780 } | |
| 17777 const char* type_cstr = String::Handle(Class::Handle( | 17781 const char* type_cstr = String::Handle(Class::Handle( |
| 17778 type_class()).Name()).ToCString(); | 17782 type_class()).Name()).ToCString(); |
| 17779 AbstractType& ref_type = AbstractType::Handle(type()); | |
| 17780 if (ref_type.IsFinalized()) { | 17783 if (ref_type.IsFinalized()) { |
| 17781 const intptr_t hash = ref_type.Hash(); | 17784 const intptr_t hash = ref_type.Hash(); |
| 17782 return OS::SCreate(Thread::Current()->zone(), | 17785 return OS::SCreate(Thread::Current()->zone(), |
| 17783 "TypeRef: %s<...> (@%p H%" Px ")", type_cstr, ref_type.raw(), hash); | 17786 "TypeRef: %s<...> (@%p H%" Px ")", type_cstr, ref_type.raw(), hash); |
| 17784 } else { | 17787 } else { |
| 17785 return OS::SCreate(Thread::Current()->zone(), | 17788 return OS::SCreate(Thread::Current()->zone(), |
| 17786 "TypeRef: %s<...>", type_cstr); | 17789 "TypeRef: %s<...>", type_cstr); |
| 17787 } | 17790 } |
| 17788 } | 17791 } |
| 17789 | 17792 |
| (...skipping 5245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 23035 return UserTag::null(); | 23038 return UserTag::null(); |
| 23036 } | 23039 } |
| 23037 | 23040 |
| 23038 | 23041 |
| 23039 const char* UserTag::ToCString() const { | 23042 const char* UserTag::ToCString() const { |
| 23040 const String& tag_label = String::Handle(label()); | 23043 const String& tag_label = String::Handle(label()); |
| 23041 return tag_label.ToCString(); | 23044 return tag_label.ToCString(); |
| 23042 } | 23045 } |
| 23043 | 23046 |
| 23044 } // namespace dart | 23047 } // namespace dart |
| OLD | NEW |