Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(400)

Side by Side Diff: runtime/vm/object.cc

Issue 2485993002: VM: Support bootstrapping core libraries from Kernel binaries instead of source. (Closed)
Patch Set: Done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698