| 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/object.h" | 13 #include "vm/object.h" |
| 14 #include "vm/object_store.h" | 14 #include "vm/object_store.h" |
| 15 #include "vm/symbols.h" | 15 #include "vm/symbols.h" |
| 16 | 16 |
| 17 namespace dart { | 17 namespace dart { |
| 18 | 18 |
| 19 #define INIT_LIBRARY(index, name, source, patch) \ | 19 #define INIT_LIBRARY(index, name, source, patch) \ |
| 20 { index, \ | 20 { index, "dart:" #name, source, "dart:" #name "-patch", patch } |
| 21 "dart:"#name, source, \ | |
| 22 "dart:"#name"-patch", patch } \ | |
| 23 | 21 |
| 24 typedef struct { | 22 typedef struct { |
| 25 ObjectStore::BootstrapLibraryId index_; | 23 ObjectStore::BootstrapLibraryId index_; |
| 26 const char* uri_; | 24 const char* uri_; |
| 27 const char** source_paths_; | 25 const char** source_paths_; |
| 28 const char* patch_uri_; | 26 const char* patch_uri_; |
| 29 const char** patch_paths_; | 27 const char** patch_paths_; |
| 30 } bootstrap_lib_props; | 28 } bootstrap_lib_props; |
| 31 | 29 |
| 32 | 30 |
| 33 enum { | 31 enum { |
| 34 kPathsUriOffset = 0, | 32 kPathsUriOffset = 0, |
| 35 kPathsFileOffset = 1, | 33 kPathsFileOffset = 1, |
| 36 kPathsSourceOffset = 2, | 34 kPathsSourceOffset = 2, |
| 37 kPathsEntryLength = 3 | 35 kPathsEntryLength = 3 |
| 38 }; | 36 }; |
| 39 | 37 |
| 40 | 38 |
| 41 static bootstrap_lib_props bootstrap_libraries[] = { | 39 static bootstrap_lib_props bootstrap_libraries[] = { |
| 42 INIT_LIBRARY(ObjectStore::kCore, | 40 INIT_LIBRARY(ObjectStore::kCore, |
| 43 core, | 41 core, |
| 44 Bootstrap::core_source_paths_, | 42 Bootstrap::core_source_paths_, |
| 45 Bootstrap::core_patch_paths_), | 43 Bootstrap::core_patch_paths_), |
| 46 INIT_LIBRARY(ObjectStore::kAsync, | 44 INIT_LIBRARY(ObjectStore::kAsync, |
| 47 async, | 45 async, |
| 48 Bootstrap::async_source_paths_, | 46 Bootstrap::async_source_paths_, |
| 49 Bootstrap::async_patch_paths_), | 47 Bootstrap::async_patch_paths_), |
| 50 INIT_LIBRARY(ObjectStore::kConvert, | 48 INIT_LIBRARY(ObjectStore::kConvert, |
| 51 convert, | 49 convert, |
| 52 Bootstrap::convert_source_paths_, | 50 Bootstrap::convert_source_paths_, |
| 53 Bootstrap::convert_patch_paths_), | 51 Bootstrap::convert_patch_paths_), |
| 54 INIT_LIBRARY(ObjectStore::kCollection, | 52 INIT_LIBRARY(ObjectStore::kCollection, |
| 55 collection, | 53 collection, |
| 56 Bootstrap::collection_source_paths_, | 54 Bootstrap::collection_source_paths_, |
| 57 Bootstrap::collection_patch_paths_), | 55 Bootstrap::collection_patch_paths_), |
| 58 INIT_LIBRARY(ObjectStore::kDeveloper, | 56 INIT_LIBRARY(ObjectStore::kDeveloper, |
| 59 developer, | 57 developer, |
| 60 Bootstrap::developer_source_paths_, | 58 Bootstrap::developer_source_paths_, |
| 61 Bootstrap::developer_patch_paths_), | 59 Bootstrap::developer_patch_paths_), |
| 62 INIT_LIBRARY(ObjectStore::kInternal, | 60 INIT_LIBRARY(ObjectStore::kInternal, |
| 63 _internal, | 61 _internal, |
| 64 Bootstrap::_internal_source_paths_, | 62 Bootstrap::_internal_source_paths_, |
| 65 Bootstrap::_internal_patch_paths_), | 63 Bootstrap::_internal_patch_paths_), |
| 66 INIT_LIBRARY(ObjectStore::kIsolate, | 64 INIT_LIBRARY(ObjectStore::kIsolate, |
| 67 isolate, | 65 isolate, |
| 68 Bootstrap::isolate_source_paths_, | 66 Bootstrap::isolate_source_paths_, |
| 69 Bootstrap::isolate_patch_paths_), | 67 Bootstrap::isolate_patch_paths_), |
| 70 INIT_LIBRARY(ObjectStore::kMath, | 68 INIT_LIBRARY(ObjectStore::kMath, |
| 71 math, | 69 math, |
| 72 Bootstrap::math_source_paths_, | 70 Bootstrap::math_source_paths_, |
| 73 Bootstrap::math_patch_paths_), | 71 Bootstrap::math_patch_paths_), |
| 74 INIT_LIBRARY(ObjectStore::kMirrors, | 72 INIT_LIBRARY(ObjectStore::kMirrors, |
| 75 mirrors, | 73 mirrors, |
| 76 Bootstrap::mirrors_source_paths_, | 74 Bootstrap::mirrors_source_paths_, |
| 77 Bootstrap::mirrors_patch_paths_), | 75 Bootstrap::mirrors_patch_paths_), |
| 78 INIT_LIBRARY(ObjectStore::kProfiler, | 76 INIT_LIBRARY(ObjectStore::kProfiler, |
| 79 profiler, | 77 profiler, |
| 80 Bootstrap::profiler_source_paths_, | 78 Bootstrap::profiler_source_paths_, |
| 81 NULL), | 79 NULL), |
| 82 INIT_LIBRARY(ObjectStore::kTypedData, | 80 INIT_LIBRARY(ObjectStore::kTypedData, |
| 83 typed_data, | 81 typed_data, |
| 84 Bootstrap::typed_data_source_paths_, | 82 Bootstrap::typed_data_source_paths_, |
| 85 NULL), | 83 NULL), |
| 86 INIT_LIBRARY(ObjectStore::kVMService, | 84 INIT_LIBRARY(ObjectStore::kVMService, |
| 87 _vmservice, | 85 _vmservice, |
| 88 Bootstrap::_vmservice_source_paths_, | 86 Bootstrap::_vmservice_source_paths_, |
| 89 Bootstrap::_vmservice_patch_paths_), | 87 Bootstrap::_vmservice_patch_paths_), |
| 90 { ObjectStore::kNone, NULL, NULL, NULL, NULL } | 88 {ObjectStore::kNone, NULL, NULL, NULL, NULL}}; |
| 91 }; | |
| 92 | 89 |
| 93 | 90 |
| 94 static RawString* GetLibrarySource(const Library& lib, | 91 static RawString* GetLibrarySource(const Library& lib, |
| 95 const String& uri, | 92 const String& uri, |
| 96 bool patch) { | 93 bool patch) { |
| 97 // First check if this is a valid bootstrap library and find it's index | 94 // First check if this is a valid bootstrap library and find it's index |
| 98 // in the 'bootstrap_libraries' table above. | 95 // in the 'bootstrap_libraries' table above. |
| 99 intptr_t index; | 96 intptr_t index; |
| 100 const String& lib_uri = String::Handle(lib.url()); | 97 const String& lib_uri = String::Handle(lib.url()); |
| 101 for (index = 0; | 98 for (index = 0; bootstrap_libraries[index].index_ != ObjectStore::kNone; |
| 102 bootstrap_libraries[index].index_ != ObjectStore::kNone; | |
| 103 ++index) { | 99 ++index) { |
| 104 if (lib_uri.Equals(bootstrap_libraries[index].uri_)) { | 100 if (lib_uri.Equals(bootstrap_libraries[index].uri_)) { |
| 105 break; | 101 break; |
| 106 } | 102 } |
| 107 } | 103 } |
| 108 if (bootstrap_libraries[index].index_ == ObjectStore::kNone) { | 104 if (bootstrap_libraries[index].index_ == ObjectStore::kNone) { |
| 109 return String::null(); // Library is not a bootstrap library. | 105 return String::null(); // Library is not a bootstrap library. |
| 110 } | 106 } |
| 111 | 107 |
| 112 // Try to read the source using the path specified for the uri. | 108 // Try to read the source using the path specified for the uri. |
| 113 const char** source_paths = patch ? | 109 const char** source_paths = patch ? bootstrap_libraries[index].patch_paths_ |
| 114 bootstrap_libraries[index].patch_paths_ : | 110 : bootstrap_libraries[index].source_paths_; |
| 115 bootstrap_libraries[index].source_paths_; | |
| 116 if (source_paths == NULL) { | 111 if (source_paths == NULL) { |
| 117 return String::null(); // No path mapping information exists for library. | 112 return String::null(); // No path mapping information exists for library. |
| 118 } | 113 } |
| 119 const char* source_path = NULL; | 114 const char* source_path = NULL; |
| 120 const char* source_data = NULL; | 115 const char* source_data = NULL; |
| 121 for (intptr_t i = 0; source_paths[i] != NULL; i += kPathsEntryLength) { | 116 for (intptr_t i = 0; source_paths[i] != NULL; i += kPathsEntryLength) { |
| 122 if (uri.Equals(source_paths[i + kPathsUriOffset])) { | 117 if (uri.Equals(source_paths[i + kPathsUriOffset])) { |
| 123 source_path = source_paths[i + kPathsFileOffset]; | 118 source_path = source_paths[i + kPathsFileOffset]; |
| 124 source_data = source_paths[i + kPathsSourceOffset]; | 119 source_data = source_paths[i + kPathsSourceOffset]; |
| 125 break; | 120 break; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 } | 169 } |
| 175 } | 170 } |
| 176 return error.raw(); | 171 return error.raw(); |
| 177 } | 172 } |
| 178 | 173 |
| 179 | 174 |
| 180 static Dart_Handle LoadPartSource(Thread* thread, | 175 static Dart_Handle LoadPartSource(Thread* thread, |
| 181 const Library& lib, | 176 const Library& lib, |
| 182 const String& uri) { | 177 const String& uri) { |
| 183 Zone* zone = thread->zone(); | 178 Zone* zone = thread->zone(); |
| 184 const String& part_source = String::Handle( | 179 const String& part_source = |
| 185 zone, GetLibrarySource(lib, uri, false)); | 180 String::Handle(zone, GetLibrarySource(lib, uri, false)); |
| 186 const String& lib_uri = String::Handle(zone, lib.url()); | 181 const String& lib_uri = String::Handle(zone, lib.url()); |
| 187 if (part_source.IsNull()) { | 182 if (part_source.IsNull()) { |
| 188 return Api::NewError("Unable to read part file '%s' of library '%s'", | 183 return Api::NewError("Unable to read part file '%s' of library '%s'", |
| 189 uri.ToCString(), lib_uri.ToCString()); | 184 uri.ToCString(), lib_uri.ToCString()); |
| 190 } | 185 } |
| 191 | 186 |
| 192 // Prepend the library URI to form a unique script URI for the part. | 187 // Prepend the library URI to form a unique script URI for the part. |
| 193 const Array& strings = Array::Handle(zone, Array::New(3)); | 188 const Array& strings = Array::Handle(zone, Array::New(3)); |
| 194 strings.SetAt(0, lib_uri); | 189 strings.SetAt(0, lib_uri); |
| 195 strings.SetAt(1, Symbols::Slash()); | 190 strings.SetAt(1, Symbols::Slash()); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 Error& error = Error::Handle(zone); | 280 Error& error = Error::Handle(zone); |
| 286 Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler(); | 281 Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler(); |
| 287 | 282 |
| 288 // Set the library tag handler for the isolate to the bootstrap | 283 // Set the library tag handler for the isolate to the bootstrap |
| 289 // library tag handler so that we can load all the bootstrap libraries. | 284 // library tag handler so that we can load all the bootstrap libraries. |
| 290 isolate->set_library_tag_handler(BootstrapLibraryTagHandler); | 285 isolate->set_library_tag_handler(BootstrapLibraryTagHandler); |
| 291 | 286 |
| 292 HANDLESCOPE(thread); | 287 HANDLESCOPE(thread); |
| 293 | 288 |
| 294 // Create library objects for all the bootstrap libraries. | 289 // Create library objects for all the bootstrap libraries. |
| 295 for (intptr_t i = 0; | 290 for (intptr_t i = 0; bootstrap_libraries[i].index_ != ObjectStore::kNone; |
| 296 bootstrap_libraries[i].index_ != ObjectStore::kNone; | |
| 297 ++i) { | 291 ++i) { |
| 298 #ifdef PRODUCT | 292 #ifdef PRODUCT |
| 299 if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) { | 293 if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) { |
| 300 continue; | 294 continue; |
| 301 } | 295 } |
| 302 #endif // !PRODUCT | 296 #endif // !PRODUCT |
| 303 uri = Symbols::New(thread, bootstrap_libraries[i].uri_); | 297 uri = Symbols::New(thread, bootstrap_libraries[i].uri_); |
| 304 lib = Library::LookupLibrary(thread, uri); | 298 lib = Library::LookupLibrary(thread, uri); |
| 305 if (lib.IsNull()) { | 299 if (lib.IsNull()) { |
| 306 lib = Library::NewLibraryHelper(uri, false); | 300 lib = Library::NewLibraryHelper(uri, false); |
| 307 lib.SetLoadRequested(); | 301 lib.SetLoadRequested(); |
| 308 lib.Register(thread); | 302 lib.Register(thread); |
| 309 } | 303 } |
| 310 isolate->object_store()->set_bootstrap_library( | 304 isolate->object_store()->set_bootstrap_library( |
| 311 bootstrap_libraries[i].index_, lib); | 305 bootstrap_libraries[i].index_, lib); |
| 312 } | 306 } |
| 313 | 307 |
| 314 // Load, compile and patch bootstrap libraries. | 308 // Load, compile and patch bootstrap libraries. |
| 315 for (intptr_t i = 0; | 309 for (intptr_t i = 0; bootstrap_libraries[i].index_ != ObjectStore::kNone; |
| 316 bootstrap_libraries[i].index_ != ObjectStore::kNone; | |
| 317 ++i) { | 310 ++i) { |
| 318 #ifdef PRODUCT | 311 #ifdef PRODUCT |
| 319 if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) { | 312 if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) { |
| 320 continue; | 313 continue; |
| 321 } | 314 } |
| 322 #endif // PRODUCT | 315 #endif // PRODUCT |
| 323 uri = Symbols::New(thread, bootstrap_libraries[i].uri_); | 316 uri = Symbols::New(thread, bootstrap_libraries[i].uri_); |
| 324 lib = Library::LookupLibrary(thread, uri); | 317 lib = Library::LookupLibrary(thread, uri); |
| 325 ASSERT(!lib.IsNull()); | 318 ASSERT(!lib.IsNull()); |
| 326 source = GetLibrarySource(lib, uri, false); | 319 source = GetLibrarySource(lib, uri, false); |
| 327 if (source.IsNull()) { | 320 if (source.IsNull()) { |
| 328 const String& message = String::Handle( | 321 const String& message = String::Handle(String::NewFormatted( |
| 329 String::NewFormatted("Unable to find dart source for %s", | 322 "Unable to find dart source for %s", uri.ToCString())); |
| 330 uri.ToCString())); | |
| 331 error ^= ApiError::New(message); | 323 error ^= ApiError::New(message); |
| 332 break; | 324 break; |
| 333 } | 325 } |
| 334 script = Script::New(uri, source, RawScript::kLibraryTag); | 326 script = Script::New(uri, source, RawScript::kLibraryTag); |
| 335 error = Compile(lib, script); | 327 error = Compile(lib, script); |
| 336 if (!error.IsNull()) { | 328 if (!error.IsNull()) { |
| 337 break; | 329 break; |
| 338 } | 330 } |
| 339 // If a patch exists, load and patch the script. | 331 // If a patch exists, load and patch the script. |
| 340 if (bootstrap_libraries[i].patch_paths_ != NULL) { | 332 if (bootstrap_libraries[i].patch_paths_ != NULL) { |
| 341 patch_uri = Symbols::New(thread, bootstrap_libraries[i].patch_uri_); | 333 patch_uri = Symbols::New(thread, bootstrap_libraries[i].patch_uri_); |
| 342 error = LoadPatchFiles(zone, | 334 error = LoadPatchFiles(zone, lib, patch_uri, |
| 343 lib, | |
| 344 patch_uri, | |
| 345 bootstrap_libraries[i].patch_paths_); | 335 bootstrap_libraries[i].patch_paths_); |
| 346 if (!error.IsNull()) { | 336 if (!error.IsNull()) { |
| 347 break; | 337 break; |
| 348 } | 338 } |
| 349 } | 339 } |
| 350 } | 340 } |
| 351 if (error.IsNull()) { | 341 if (error.IsNull()) { |
| 352 SetupNativeResolver(); | 342 SetupNativeResolver(); |
| 353 ClassFinalizer::ProcessPendingClasses(); | 343 ClassFinalizer::ProcessPendingClasses(); |
| 354 | 344 |
| 355 // Eagerly compile the _Closure class as it is the class of all closure | 345 // Eagerly compile the _Closure class as it is the class of all closure |
| 356 // instances. This allows us to just finalize function types | 346 // instances. This allows us to just finalize function types |
| 357 // without going through the hoops of trying to compile their scope class. | 347 // without going through the hoops of trying to compile their scope class. |
| 358 Class& cls = | 348 Class& cls = Class::Handle(zone, isolate->object_store()->closure_class()); |
| 359 Class::Handle(zone, isolate->object_store()->closure_class()); | |
| 360 Compiler::CompileClass(cls); | 349 Compiler::CompileClass(cls); |
| 361 // Eagerly compile Bool class, bool constants are used from within compiler. | 350 // Eagerly compile Bool class, bool constants are used from within compiler. |
| 362 cls = isolate->object_store()->bool_class(); | 351 cls = isolate->object_store()->bool_class(); |
| 363 Compiler::CompileClass(cls); | 352 Compiler::CompileClass(cls); |
| 364 } | 353 } |
| 365 | 354 |
| 366 // Restore the library tag handler for the isolate. | 355 // Restore the library tag handler for the isolate. |
| 367 isolate->set_library_tag_handler(saved_tag_handler); | 356 isolate->set_library_tag_handler(saved_tag_handler); |
| 368 | 357 |
| 369 return error.raw(); | 358 return error.raw(); |
| 370 } | 359 } |
| 371 | 360 |
| 372 } // namespace dart | 361 } // namespace dart |
| OLD | NEW |