Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/bootstrap.h" | 5 #include "vm/bootstrap.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 | 8 |
| 9 #include "vm/bootstrap_natives.h" | 9 #include "vm/bootstrap_natives.h" |
| 10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
| 11 #include "vm/compiler.h" | 11 #include "vm/compiler.h" |
| 12 #include "vm/dart_api_impl.h" | 12 #include "vm/dart_api_impl.h" |
| 13 #include "vm/kernel.h" | |
| 14 #include "vm/kernel_reader.h" | |
| 13 #include "vm/object.h" | 15 #include "vm/object.h" |
| 14 #include "vm/object_store.h" | 16 #include "vm/object_store.h" |
| 15 #include "vm/symbols.h" | 17 #include "vm/symbols.h" |
| 16 | 18 |
| 17 namespace dart { | 19 namespace dart { |
| 18 | 20 |
| 19 #define INIT_LIBRARY(index, name, source, patch) \ | 21 struct BootstrapLibProps { |
| 20 { index, \ | 22 ObjectStore::BootstrapLibraryId index; |
| 21 "dart:"#name, source, \ | 23 const char* uri; |
| 22 "dart:"#name"-patch", patch } \ | 24 const char** source_paths; |
| 23 | 25 const char* patch_uri; |
| 24 typedef struct { | 26 const char** patch_paths; |
| 25 ObjectStore::BootstrapLibraryId index_; | 27 }; |
| 26 const char* uri_; | |
| 27 const char** source_paths_; | |
| 28 const char* patch_uri_; | |
| 29 const char** patch_paths_; | |
| 30 } bootstrap_lib_props; | |
| 31 | 28 |
| 32 | 29 |
| 33 enum { | 30 enum { |
| 34 kPathsUriOffset = 0, | 31 kPathsUriOffset = 0, |
| 35 kPathsFileOffset = 1, | 32 kPathsFileOffset = 1, |
| 36 kPathsSourceOffset = 2, | 33 kPathsSourceOffset = 2, |
| 37 kPathsEntryLength = 3 | 34 kPathsEntryLength = 3 |
| 38 }; | 35 }; |
| 39 | 36 |
| 40 | 37 |
| 41 static bootstrap_lib_props bootstrap_libraries[] = { | 38 const char** Bootstrap::profiler_patch_paths_ = NULL; |
| 42 INIT_LIBRARY(ObjectStore::kCore, | 39 const char** Bootstrap::typed_data_patch_paths_ = NULL; |
| 43 core, | 40 |
| 44 Bootstrap::core_source_paths_, | 41 |
| 45 Bootstrap::core_patch_paths_), | 42 #define MAKE_PROPERTIES(CamelName, hacker_name) \ |
|
Florian Schneider
2016/11/08 20:41:39
I do like reducing boilerplate code, but I don't l
Vyacheslav Egorov (Google)
2016/11/09 14:43:16
Moved to a separate CL: https://codereview.chromiu
| |
| 46 INIT_LIBRARY(ObjectStore::kAsync, | 43 { ObjectStore::k##CamelName, \ |
| 47 async, | 44 "dart:" #hacker_name, \ |
|
Florian Schneider
2016/11/08 20:41:39
What's a hacker_name? Why not just use "name"?
Vyacheslav Egorov (Google)
2016/11/09 14:43:16
I guess hacker_name is name_with_underscores. Rena
Kevin Millikin (Google)
2016/11/09 15:17:32
Because the other parameter is also a name.
| |
| 48 Bootstrap::async_source_paths_, | 45 Bootstrap::hacker_name##_source_paths_, \ |
| 49 Bootstrap::async_patch_paths_), | 46 "dart:" #hacker_name "-patch", \ |
| 50 INIT_LIBRARY(ObjectStore::kConvert, | 47 Bootstrap::hacker_name##_patch_paths_ \ |
| 51 convert, | 48 }, |
| 52 Bootstrap::convert_source_paths_, | 49 |
| 53 Bootstrap::convert_patch_paths_), | 50 static BootstrapLibProps bootstrap_libraries[] = { |
|
Florian Schneider
2016/11/08 20:41:39
static const?
Vyacheslav Egorov (Google)
2016/11/09 14:43:16
Done.
| |
| 54 INIT_LIBRARY(ObjectStore::kCollection, | 51 FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES) |
| 55 collection, | |
| 56 Bootstrap::collection_source_paths_, | |
| 57 Bootstrap::collection_patch_paths_), | |
| 58 INIT_LIBRARY(ObjectStore::kDeveloper, | |
| 59 developer, | |
| 60 Bootstrap::developer_source_paths_, | |
| 61 Bootstrap::developer_patch_paths_), | |
| 62 INIT_LIBRARY(ObjectStore::kInternal, | |
| 63 _internal, | |
| 64 Bootstrap::_internal_source_paths_, | |
| 65 Bootstrap::_internal_patch_paths_), | |
| 66 INIT_LIBRARY(ObjectStore::kIsolate, | |
| 67 isolate, | |
| 68 Bootstrap::isolate_source_paths_, | |
| 69 Bootstrap::isolate_patch_paths_), | |
| 70 INIT_LIBRARY(ObjectStore::kMath, | |
| 71 math, | |
| 72 Bootstrap::math_source_paths_, | |
| 73 Bootstrap::math_patch_paths_), | |
| 74 INIT_LIBRARY(ObjectStore::kMirrors, | |
| 75 mirrors, | |
| 76 Bootstrap::mirrors_source_paths_, | |
| 77 Bootstrap::mirrors_patch_paths_), | |
| 78 INIT_LIBRARY(ObjectStore::kProfiler, | |
| 79 profiler, | |
| 80 Bootstrap::profiler_source_paths_, | |
| 81 NULL), | |
| 82 INIT_LIBRARY(ObjectStore::kTypedData, | |
| 83 typed_data, | |
| 84 Bootstrap::typed_data_source_paths_, | |
| 85 NULL), | |
| 86 INIT_LIBRARY(ObjectStore::kVMService, | |
| 87 _vmservice, | |
| 88 Bootstrap::_vmservice_source_paths_, | |
| 89 Bootstrap::_vmservice_patch_paths_), | |
| 90 { ObjectStore::kNone, NULL, NULL, NULL, NULL } | |
| 91 }; | 52 }; |
| 92 | 53 |
| 54 #undef MAKE_PROPERTIES | |
| 93 | 55 |
| 94 static RawString* GetLibrarySource(const Library& lib, | 56 |
| 95 const String& uri, | 57 static const intptr_t kBootstrapLibraryCount = ARRAY_SIZE(bootstrap_libraries); |
| 96 bool patch) { | 58 |
| 97 // First check if this is a valid bootstrap library and find it's index | 59 |
| 98 // in the 'bootstrap_libraries' table above. | 60 static RawString* GetLibrarySourceByIndex(intptr_t index, |
| 99 intptr_t index; | 61 const String& uri, |
| 100 const String& lib_uri = String::Handle(lib.url()); | 62 bool patch) { |
| 101 for (index = 0; | 63 ASSERT(index >= 0 && index < kBootstrapLibraryCount); |
| 102 bootstrap_libraries[index].index_ != ObjectStore::kNone; | |
| 103 ++index) { | |
| 104 if (lib_uri.Equals(bootstrap_libraries[index].uri_)) { | |
| 105 break; | |
| 106 } | |
| 107 } | |
| 108 if (bootstrap_libraries[index].index_ == ObjectStore::kNone) { | |
| 109 return String::null(); // Library is not a bootstrap library. | |
| 110 } | |
| 111 | 64 |
| 112 // Try to read the source using the path specified for the uri. | 65 // Try to read the source using the path specified for the uri. |
| 113 const char** source_paths = patch ? | 66 const char** source_paths = patch ? bootstrap_libraries[index].patch_paths |
| 114 bootstrap_libraries[index].patch_paths_ : | 67 : bootstrap_libraries[index].source_paths; |
| 115 bootstrap_libraries[index].source_paths_; | |
| 116 if (source_paths == NULL) { | 68 if (source_paths == NULL) { |
| 117 return String::null(); // No path mapping information exists for library. | 69 return String::null(); // No path mapping information exists for library. |
| 118 } | 70 } |
| 119 const char* source_path = NULL; | 71 const char* source_path = NULL; |
| 120 const char* source_data = NULL; | 72 const char* source_data = NULL; |
| 121 for (intptr_t i = 0; source_paths[i] != NULL; i += kPathsEntryLength) { | 73 for (intptr_t i = 0; source_paths[i] != NULL; i += kPathsEntryLength) { |
| 122 if (uri.Equals(source_paths[i + kPathsUriOffset])) { | 74 if (uri.Equals(source_paths[i + kPathsUriOffset])) { |
| 123 source_path = source_paths[i + kPathsFileOffset]; | 75 source_path = source_paths[i + kPathsFileOffset]; |
| 124 source_data = source_paths[i + kPathsSourceOffset]; | 76 source_data = source_paths[i + kPathsSourceOffset]; |
| 125 break; | 77 break; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 150 } else { | 102 } else { |
| 151 return String::null(); | 103 return String::null(); |
| 152 } | 104 } |
| 153 } | 105 } |
| 154 ASSERT(utf8_array != NULL); | 106 ASSERT(utf8_array != NULL); |
| 155 ASSERT(file_length >= 0); | 107 ASSERT(file_length >= 0); |
| 156 return String::FromUTF8(utf8_array, file_length); | 108 return String::FromUTF8(utf8_array, file_length); |
| 157 } | 109 } |
| 158 | 110 |
| 159 | 111 |
| 112 static RawString* GetLibrarySource(const Library& lib, | |
| 113 const String& uri, | |
| 114 bool patch) { | |
| 115 // First check if this is a valid bootstrap library and find its index in | |
| 116 // the 'bootstrap_libraries' table above. | |
| 117 intptr_t index; | |
| 118 const String& lib_uri = String::Handle(lib.url()); | |
| 119 for (index = 0; index < kBootstrapLibraryCount; ++index) { | |
| 120 if (lib_uri.Equals(bootstrap_libraries[index].uri)) { | |
| 121 break; | |
| 122 } | |
| 123 } | |
| 124 if (index == kBootstrapLibraryCount) { | |
| 125 return String::null(); // The library is not a bootstrap library. | |
| 126 } | |
| 127 | |
| 128 return GetLibrarySourceByIndex(index, uri, patch); | |
| 129 } | |
| 130 | |
| 131 | |
| 160 static RawError* Compile(const Library& library, const Script& script) { | 132 static RawError* Compile(const Library& library, const Script& script) { |
| 161 bool update_lib_status = (script.kind() == RawScript::kScriptTag || | 133 bool update_lib_status = (script.kind() == RawScript::kScriptTag || |
| 162 script.kind() == RawScript::kLibraryTag); | 134 script.kind() == RawScript::kLibraryTag); |
| 163 if (update_lib_status) { | 135 if (update_lib_status) { |
| 164 library.SetLoadInProgress(); | 136 library.SetLoadInProgress(); |
| 165 } | 137 } |
| 166 const Error& error = Error::Handle(Compiler::Compile(library, script)); | 138 const Error& error = Error::Handle(Compiler::Compile(library, script)); |
| 167 if (update_lib_status) { | 139 if (update_lib_status) { |
| 168 if (error.IsNull()) { | 140 if (error.IsNull()) { |
| 169 library.SetLoaded(); | 141 library.SetLoaded(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 return Api::NewError("Invalid import of '%s' in a bootstrap library", | 205 return Api::NewError("Invalid import of '%s' in a bootstrap library", |
| 234 uri_str.ToCString()); | 206 uri_str.ToCString()); |
| 235 } | 207 } |
| 236 ASSERT(tag == Dart_kSourceTag); | 208 ASSERT(tag == Dart_kSourceTag); |
| 237 const Library& lib = Api::UnwrapLibraryHandle(zone, library); | 209 const Library& lib = Api::UnwrapLibraryHandle(zone, library); |
| 238 ASSERT(!lib.IsNull()); | 210 ASSERT(!lib.IsNull()); |
| 239 return LoadPartSource(thread, lib, uri_str); | 211 return LoadPartSource(thread, lib, uri_str); |
| 240 } | 212 } |
| 241 | 213 |
| 242 | 214 |
| 243 static RawError* LoadPatchFiles(Zone* zone, | 215 static RawError* LoadPatchFiles(Thread* thread, |
| 244 const Library& lib, | 216 const Library& lib, |
| 245 const String& patch_uri, | 217 intptr_t index) { |
| 246 const char** patch_files) { | 218 const char** patch_files = bootstrap_libraries[index].patch_paths; |
| 219 if (patch_files == NULL) return Error::null(); | |
| 220 | |
| 221 Zone* zone = thread->zone(); | |
| 222 String& patch_uri = String::Handle( | |
| 223 zone, Symbols::New(thread, bootstrap_libraries[index].patch_uri)); | |
| 247 String& patch_file_uri = String::Handle(zone); | 224 String& patch_file_uri = String::Handle(zone); |
| 248 String& source = String::Handle(zone); | 225 String& source = String::Handle(zone); |
| 249 Script& script = Script::Handle(zone); | 226 Script& script = Script::Handle(zone); |
| 250 Error& error = Error::Handle(zone); | 227 Error& error = Error::Handle(zone); |
| 251 const Array& strings = Array::Handle(zone, Array::New(3)); | 228 const Array& strings = Array::Handle(zone, Array::New(3)); |
| 252 strings.SetAt(0, patch_uri); | 229 strings.SetAt(0, patch_uri); |
| 253 strings.SetAt(1, Symbols::Slash()); | 230 strings.SetAt(1, Symbols::Slash()); |
| 254 for (intptr_t j = 0; patch_files[j] != NULL; j += kPathsEntryLength) { | 231 for (intptr_t j = 0; patch_files[j] != NULL; j += kPathsEntryLength) { |
| 255 patch_file_uri = String::New(patch_files[j + kPathsUriOffset]); | 232 patch_file_uri = String::New(patch_files[j + kPathsUriOffset]); |
| 256 source = GetLibrarySource(lib, patch_file_uri, true); | 233 source = GetLibrarySourceByIndex(index, patch_file_uri, true); |
| 257 if (source.IsNull()) { | 234 if (source.IsNull()) { |
| 258 const String& message = String::Handle( | 235 const String& message = String::Handle( |
| 259 String::NewFormatted("Unable to find dart patch source for %s", | 236 String::NewFormatted("Unable to find dart patch source for %s", |
| 260 patch_file_uri.ToCString())); | 237 patch_file_uri.ToCString())); |
| 261 return ApiError::New(message); | 238 return ApiError::New(message); |
| 262 } | 239 } |
| 263 // Prepend the patch library URI to form a unique script URI for the patch. | 240 // Prepend the patch library URI to form a unique script URI for the patch. |
| 264 strings.SetAt(2, patch_file_uri); | 241 strings.SetAt(2, patch_file_uri); |
| 265 patch_file_uri = String::ConcatAll(strings); | 242 patch_file_uri = String::ConcatAll(strings); |
| 266 script = Script::New(patch_file_uri, source, RawScript::kPatchTag); | 243 script = Script::New(patch_file_uri, source, RawScript::kPatchTag); |
| 267 error = lib.Patch(script); | 244 error = lib.Patch(script); |
| 268 if (!error.IsNull()) { | 245 if (!error.IsNull()) { |
| 269 return error.raw(); | 246 return error.raw(); |
| 270 } | 247 } |
| 271 } | 248 } |
| 272 return Error::null(); | 249 return Error::null(); |
| 273 } | 250 } |
| 274 | 251 |
| 275 | 252 |
| 276 RawError* Bootstrap::LoadandCompileScripts() { | 253 static void Finish(Thread* thread, bool from_kernel) { |
| 277 Thread* thread = Thread::Current(); | 254 Bootstrap::SetupNativeResolver(); |
| 255 if (!ClassFinalizer::ProcessPendingClasses(from_kernel)) { | |
| 256 FATAL("Error in class finalization during bootstrapping."); | |
| 257 } | |
| 258 | |
| 259 // Eagerly compile the _Closure class as it is the class of all closure | |
| 260 // instances. This allows us to just finalize function types without going | |
| 261 // through the hoops of trying to compile their scope class. | |
| 262 ObjectStore* object_store = thread->isolate()->object_store(); | |
| 263 Class& cls = Class::Handle(thread->zone(), object_store->closure_class()); | |
| 264 Compiler::CompileClass(cls); | |
| 265 // Eagerly compile Bool class, bool constants are used from within compiler. | |
| 266 cls = object_store->bool_class(); | |
| 267 Compiler::CompileClass(cls); | |
| 268 } | |
| 269 | |
| 270 | |
| 271 static RawError* BootstrapFromSource(Thread* thread) { | |
| 278 Isolate* isolate = thread->isolate(); | 272 Isolate* isolate = thread->isolate(); |
| 279 Zone* zone = thread->zone(); | 273 Zone* zone = thread->zone(); |
| 280 String& uri = String::Handle(zone); | 274 String& uri = String::Handle(zone); |
| 281 String& patch_uri = String::Handle(zone); | |
| 282 String& source = String::Handle(zone); | 275 String& source = String::Handle(zone); |
| 283 Script& script = Script::Handle(zone); | 276 Script& script = Script::Handle(zone); |
| 284 Library& lib = Library::Handle(zone); | 277 Library& lib = Library::Handle(zone); |
| 285 Error& error = Error::Handle(zone); | 278 Error& error = Error::Handle(zone); |
| 286 Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler(); | |
| 287 | 279 |
| 288 // Set the library tag handler for the isolate to the bootstrap | 280 // Set the library tag handler for the isolate to the bootstrap |
| 289 // library tag handler so that we can load all the bootstrap libraries. | 281 // library tag handler so that we can load all the bootstrap libraries. |
| 282 Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler(); | |
| 290 isolate->set_library_tag_handler(BootstrapLibraryTagHandler); | 283 isolate->set_library_tag_handler(BootstrapLibraryTagHandler); |
| 291 | 284 |
| 292 HANDLESCOPE(thread); | |
| 293 | |
| 294 // Create library objects for all the bootstrap libraries. | |
| 295 for (intptr_t i = 0; | |
| 296 bootstrap_libraries[i].index_ != ObjectStore::kNone; | |
| 297 ++i) { | |
| 298 #ifdef PRODUCT | |
| 299 if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) { | |
| 300 continue; | |
| 301 } | |
| 302 #endif // !PRODUCT | |
| 303 uri = Symbols::New(thread, bootstrap_libraries[i].uri_); | |
| 304 lib = Library::LookupLibrary(thread, uri); | |
| 305 if (lib.IsNull()) { | |
| 306 lib = Library::NewLibraryHelper(uri, false); | |
| 307 lib.SetLoadRequested(); | |
| 308 lib.Register(thread); | |
| 309 } | |
| 310 isolate->object_store()->set_bootstrap_library( | |
| 311 bootstrap_libraries[i].index_, lib); | |
| 312 } | |
| 313 | |
| 314 // Load, compile and patch bootstrap libraries. | 285 // Load, compile and patch bootstrap libraries. |
| 315 for (intptr_t i = 0; | 286 for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) { |
| 316 bootstrap_libraries[i].index_ != ObjectStore::kNone; | 287 ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index; |
| 317 ++i) { | 288 uri = Symbols::New(thread, bootstrap_libraries[i].uri); |
| 318 #ifdef PRODUCT | 289 lib = isolate->object_store()->bootstrap_library(id); |
| 319 if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) { | |
| 320 continue; | |
| 321 } | |
| 322 #endif // PRODUCT | |
| 323 uri = Symbols::New(thread, bootstrap_libraries[i].uri_); | |
| 324 lib = Library::LookupLibrary(thread, uri); | |
| 325 ASSERT(!lib.IsNull()); | 290 ASSERT(!lib.IsNull()); |
| 326 source = GetLibrarySource(lib, uri, false); | 291 ASSERT(lib.raw() == Library::LookupLibrary(thread, uri)); |
| 292 source = GetLibrarySourceByIndex(i, uri, false); | |
| 327 if (source.IsNull()) { | 293 if (source.IsNull()) { |
| 328 const String& message = String::Handle( | 294 const String& message = String::Handle( |
| 329 String::NewFormatted("Unable to find dart source for %s", | 295 String::NewFormatted("Unable to find dart source for %s", |
| 330 uri.ToCString())); | 296 uri.ToCString())); |
| 331 error ^= ApiError::New(message); | 297 error ^= ApiError::New(message); |
| 332 break; | 298 break; |
| 333 } | 299 } |
| 334 script = Script::New(uri, source, RawScript::kLibraryTag); | 300 script = Script::New(uri, source, RawScript::kLibraryTag); |
| 335 error = Compile(lib, script); | 301 error = Compile(lib, script); |
| 336 if (!error.IsNull()) { | 302 if (!error.IsNull()) { |
| 337 break; | 303 break; |
| 338 } | 304 } |
| 339 // If a patch exists, load and patch the script. | 305 // If a patch exists, load and patch the script. |
| 340 if (bootstrap_libraries[i].patch_paths_ != NULL) { | 306 error = LoadPatchFiles(thread, lib, i); |
| 341 patch_uri = Symbols::New(thread, bootstrap_libraries[i].patch_uri_); | 307 if (!error.IsNull()) { |
| 342 error = LoadPatchFiles(zone, | 308 break; |
| 343 lib, | |
| 344 patch_uri, | |
| 345 bootstrap_libraries[i].patch_paths_); | |
| 346 if (!error.IsNull()) { | |
| 347 break; | |
| 348 } | |
| 349 } | 309 } |
| 350 } | 310 } |
| 311 | |
| 351 if (error.IsNull()) { | 312 if (error.IsNull()) { |
| 352 SetupNativeResolver(); | 313 Finish(thread, /*from_kernel=*/false); |
| 353 ClassFinalizer::ProcessPendingClasses(); | |
| 354 | |
| 355 // Eagerly compile the _Closure class as it is the class of all closure | |
| 356 // instances. This allows us to just finalize function types | |
| 357 // without going through the hoops of trying to compile their scope class. | |
| 358 Class& cls = | |
| 359 Class::Handle(zone, isolate->object_store()->closure_class()); | |
| 360 Compiler::CompileClass(cls); | |
| 361 // Eagerly compile Bool class, bool constants are used from within compiler. | |
| 362 cls = isolate->object_store()->bool_class(); | |
| 363 Compiler::CompileClass(cls); | |
| 364 } | 314 } |
| 365 | |
| 366 // Restore the library tag handler for the isolate. | 315 // Restore the library tag handler for the isolate. |
| 367 isolate->set_library_tag_handler(saved_tag_handler); | 316 isolate->set_library_tag_handler(saved_tag_handler); |
| 368 | 317 |
| 369 return error.raw(); | 318 return error.raw(); |
| 370 } | 319 } |
| 371 | 320 |
| 321 | |
| 322 static RawError* BootstrapFromKernel(Thread* thread, | |
| 323 const uint8_t* buffer, | |
| 324 intptr_t buffer_size) { | |
| 325 Zone* zone = thread->zone(); | |
| 326 kernel::Program* program = | |
| 327 ReadPrecompiledKernelFromBuffer(buffer, buffer_size); | |
| 328 if (program == NULL) { | |
| 329 const String& message = | |
| 330 String::Handle(zone, String::New("Failed to read Kernel file")); | |
| 331 return ApiError::New(message); | |
| 332 } | |
| 333 | |
| 334 Isolate* isolate = thread->isolate(); | |
| 335 // Mark the already-pending classes. This mark bit will be used to avoid | |
| 336 // adding classes to the list more than once. | |
| 337 GrowableObjectArray& pending_classes = GrowableObjectArray::Handle( | |
| 338 zone, isolate->object_store()->pending_classes()); | |
| 339 dart::Class& pending = dart::Class::Handle(zone); | |
| 340 for (intptr_t i = 0; i < pending_classes.Length(); ++i) { | |
| 341 pending ^= pending_classes.At(i); | |
| 342 pending.set_is_marked_for_parsing(); | |
| 343 } | |
| 344 | |
| 345 Library& library = Library::Handle(zone); | |
| 346 String& dart_name = String::Handle(zone); | |
| 347 String& kernel_name = String::Handle(zone); | |
| 348 kernel::KernelReader reader(NULL, -1, true); | |
| 349 for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) { | |
| 350 ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index; | |
| 351 library = isolate->object_store()->bootstrap_library(id); | |
| 352 dart_name = library.url(); | |
| 353 for (intptr_t j = 0; j < program->libraries().length(); ++j) { | |
| 354 kernel::Library* kernel_library = program->libraries()[j]; | |
| 355 kernel::String* uri = kernel_library->import_uri(); | |
| 356 kernel_name = Symbols::FromUTF8(thread, uri->buffer(), uri->size()); | |
| 357 if (kernel_name.Equals(dart_name)) { | |
| 358 reader.ReadLibrary(kernel_library); | |
| 359 library.SetLoaded(); | |
| 360 break; | |
| 361 } | |
| 362 } | |
| 363 } | |
| 364 | |
| 365 Finish(thread, /*from_kernel=*/true); | |
| 366 return Error::null(); | |
| 367 } | |
| 368 | |
| 369 | |
| 370 RawError* Bootstrap::DoBootstrapping(const uint8_t* kernel_buffer, | |
| 371 intptr_t kernel_buffer_length) { | |
| 372 Thread* thread = Thread::Current(); | |
| 373 Isolate* isolate = thread->isolate(); | |
| 374 Zone* zone = thread->zone(); | |
| 375 String& uri = String::Handle(zone); | |
| 376 Library& lib = Library::Handle(zone); | |
| 377 | |
| 378 HANDLESCOPE(thread); | |
| 379 | |
| 380 // Ensure there are library objects for all the bootstrap libraries. | |
| 381 for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) { | |
| 382 ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index; | |
| 383 uri = Symbols::New(thread, bootstrap_libraries[i].uri); | |
| 384 lib = isolate->object_store()->bootstrap_library(id); | |
| 385 ASSERT(lib.raw() == Library::LookupLibrary(thread, uri)); | |
| 386 if (lib.IsNull()) { | |
| 387 lib = Library::NewLibraryHelper(uri, false); | |
| 388 lib.SetLoadRequested(); | |
| 389 lib.Register(thread); | |
| 390 isolate->object_store()->set_bootstrap_library(id, lib); | |
| 391 } | |
| 392 } | |
| 393 | |
| 394 return (kernel_buffer == NULL) | |
| 395 ? BootstrapFromSource(thread) | |
| 396 : BootstrapFromKernel(thread, kernel_buffer, kernel_buffer_length); | |
| 397 } | |
| 398 | |
| 372 } // namespace dart | 399 } // namespace dart |
| OLD | NEW |