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 |