| Index: runtime/vm/bootstrap.cc
|
| diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
|
| index ed97340f8e254946e1a2e7c78c499f3319702664..25f8bbab4add8a576ac36be8e17ef6468c7899fd 100644
|
| --- a/runtime/vm/bootstrap.cc
|
| +++ b/runtime/vm/bootstrap.cc
|
| @@ -16,18 +16,13 @@
|
|
|
| namespace dart {
|
|
|
| -#define INIT_LIBRARY(index, name, source, patch) \
|
| - { index, \
|
| - "dart:"#name, source, \
|
| - "dart:"#name"-patch", patch } \
|
| -
|
| -typedef struct {
|
| - ObjectStore::BootstrapLibraryId index_;
|
| - const char* uri_;
|
| - const char** source_paths_;
|
| - const char* patch_uri_;
|
| - const char** patch_paths_;
|
| -} bootstrap_lib_props;
|
| +struct BootstrapLibProps {
|
| + ObjectStore::BootstrapLibraryId index;
|
| + const char* uri;
|
| + const char** source_paths;
|
| + const char* patch_uri;
|
| + const char** patch_paths;
|
| +};
|
|
|
|
|
| enum {
|
| @@ -38,81 +33,36 @@ enum {
|
| };
|
|
|
|
|
| -static bootstrap_lib_props bootstrap_libraries[] = {
|
| - INIT_LIBRARY(ObjectStore::kCore,
|
| - core,
|
| - Bootstrap::core_source_paths_,
|
| - Bootstrap::core_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kAsync,
|
| - async,
|
| - Bootstrap::async_source_paths_,
|
| - Bootstrap::async_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kConvert,
|
| - convert,
|
| - Bootstrap::convert_source_paths_,
|
| - Bootstrap::convert_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kCollection,
|
| - collection,
|
| - Bootstrap::collection_source_paths_,
|
| - Bootstrap::collection_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kDeveloper,
|
| - developer,
|
| - Bootstrap::developer_source_paths_,
|
| - Bootstrap::developer_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kInternal,
|
| - _internal,
|
| - Bootstrap::_internal_source_paths_,
|
| - Bootstrap::_internal_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kIsolate,
|
| - isolate,
|
| - Bootstrap::isolate_source_paths_,
|
| - Bootstrap::isolate_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kMath,
|
| - math,
|
| - Bootstrap::math_source_paths_,
|
| - Bootstrap::math_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kMirrors,
|
| - mirrors,
|
| - Bootstrap::mirrors_source_paths_,
|
| - Bootstrap::mirrors_patch_paths_),
|
| - INIT_LIBRARY(ObjectStore::kProfiler,
|
| - profiler,
|
| - Bootstrap::profiler_source_paths_,
|
| - NULL),
|
| - INIT_LIBRARY(ObjectStore::kTypedData,
|
| - typed_data,
|
| - Bootstrap::typed_data_source_paths_,
|
| - NULL),
|
| - INIT_LIBRARY(ObjectStore::kVMService,
|
| - _vmservice,
|
| - Bootstrap::_vmservice_source_paths_,
|
| - Bootstrap::_vmservice_patch_paths_),
|
| - { ObjectStore::kNone, NULL, NULL, NULL, NULL }
|
| +const char** Bootstrap::profiler_patch_paths_ = NULL;
|
| +const char** Bootstrap::typed_data_patch_paths_ = NULL;
|
| +
|
| +
|
| +#define MAKE_PROPERTIES(CamelName, name) \
|
| + { ObjectStore::k##CamelName, \
|
| + "dart:" #name, \
|
| + Bootstrap::name##_source_paths_, \
|
| + "dart:" #name "-patch", \
|
| + Bootstrap::name##_patch_paths_ \
|
| + },
|
| +
|
| +static const BootstrapLibProps bootstrap_libraries[] = {
|
| + FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES)
|
| };
|
|
|
| +#undef MAKE_PROPERTIES
|
|
|
| -static RawString* GetLibrarySource(const Library& lib,
|
| - const String& uri,
|
| - bool patch) {
|
| - // First check if this is a valid bootstrap library and find it's index
|
| - // in the 'bootstrap_libraries' table above.
|
| - intptr_t index;
|
| - const String& lib_uri = String::Handle(lib.url());
|
| - for (index = 0;
|
| - bootstrap_libraries[index].index_ != ObjectStore::kNone;
|
| - ++index) {
|
| - if (lib_uri.Equals(bootstrap_libraries[index].uri_)) {
|
| - break;
|
| - }
|
| - }
|
| - if (bootstrap_libraries[index].index_ == ObjectStore::kNone) {
|
| - return String::null(); // Library is not a bootstrap library.
|
| - }
|
| +
|
| +static const intptr_t kBootstrapLibraryCount = ARRAY_SIZE(bootstrap_libraries);
|
| +
|
| +
|
| +static RawString* GetLibrarySourceByIndex(intptr_t index,
|
| + const String& uri,
|
| + bool patch) {
|
| + ASSERT(index >= 0 && index < kBootstrapLibraryCount);
|
|
|
| // Try to read the source using the path specified for the uri.
|
| - const char** source_paths = patch ?
|
| - bootstrap_libraries[index].patch_paths_ :
|
| - bootstrap_libraries[index].source_paths_;
|
| + const char** source_paths = patch ? bootstrap_libraries[index].patch_paths
|
| + : bootstrap_libraries[index].source_paths;
|
| if (source_paths == NULL) {
|
| return String::null(); // No path mapping information exists for library.
|
| }
|
| @@ -157,6 +107,26 @@ static RawString* GetLibrarySource(const Library& lib,
|
| }
|
|
|
|
|
| +static RawString* GetLibrarySource(const Library& lib,
|
| + const String& uri,
|
| + bool patch) {
|
| + // First check if this is a valid bootstrap library and find its index in
|
| + // the 'bootstrap_libraries' table above.
|
| + intptr_t index;
|
| + const String& lib_uri = String::Handle(lib.url());
|
| + for (index = 0; index < kBootstrapLibraryCount; ++index) {
|
| + if (lib_uri.Equals(bootstrap_libraries[index].uri)) {
|
| + break;
|
| + }
|
| + }
|
| + if (index == kBootstrapLibraryCount) {
|
| + return String::null(); // The library is not a bootstrap library.
|
| + }
|
| +
|
| + return GetLibrarySourceByIndex(index, uri, patch);
|
| +}
|
| +
|
| +
|
| static RawError* Compile(const Library& library, const Script& script) {
|
| bool update_lib_status = (script.kind() == RawScript::kScriptTag ||
|
| script.kind() == RawScript::kLibraryTag);
|
| @@ -240,10 +210,15 @@ static Dart_Handle BootstrapLibraryTagHandler(Dart_LibraryTag tag,
|
| }
|
|
|
|
|
| -static RawError* LoadPatchFiles(Zone* zone,
|
| +static RawError* LoadPatchFiles(Thread* thread,
|
| const Library& lib,
|
| - const String& patch_uri,
|
| - const char** patch_files) {
|
| + intptr_t index) {
|
| + const char** patch_files = bootstrap_libraries[index].patch_paths;
|
| + if (patch_files == NULL) return Error::null();
|
| +
|
| + Zone* zone = thread->zone();
|
| + String& patch_uri = String::Handle(
|
| + zone, Symbols::New(thread, bootstrap_libraries[index].patch_uri));
|
| String& patch_file_uri = String::Handle(zone);
|
| String& source = String::Handle(zone);
|
| Script& script = Script::Handle(zone);
|
| @@ -253,7 +228,7 @@ static RawError* LoadPatchFiles(Zone* zone,
|
| strings.SetAt(1, Symbols::Slash());
|
| for (intptr_t j = 0; patch_files[j] != NULL; j += kPathsEntryLength) {
|
| patch_file_uri = String::New(patch_files[j + kPathsUriOffset]);
|
| - source = GetLibrarySource(lib, patch_file_uri, true);
|
| + source = GetLibrarySourceByIndex(index, patch_file_uri, true);
|
| if (source.IsNull()) {
|
| const String& message = String::Handle(
|
| String::NewFormatted("Unable to find dart patch source for %s",
|
| @@ -273,57 +248,28 @@ static RawError* LoadPatchFiles(Zone* zone,
|
| }
|
|
|
|
|
| -RawError* Bootstrap::LoadandCompileScripts() {
|
| - Thread* thread = Thread::Current();
|
| +static RawError* BootstrapFromSource(Thread* thread) {
|
| Isolate* isolate = thread->isolate();
|
| Zone* zone = thread->zone();
|
| String& uri = String::Handle(zone);
|
| - String& patch_uri = String::Handle(zone);
|
| String& source = String::Handle(zone);
|
| Script& script = Script::Handle(zone);
|
| Library& lib = Library::Handle(zone);
|
| Error& error = Error::Handle(zone);
|
| - Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler();
|
|
|
| // Set the library tag handler for the isolate to the bootstrap
|
| // library tag handler so that we can load all the bootstrap libraries.
|
| + Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler();
|
| isolate->set_library_tag_handler(BootstrapLibraryTagHandler);
|
|
|
| - HANDLESCOPE(thread);
|
| -
|
| - // Create library objects for all the bootstrap libraries.
|
| - for (intptr_t i = 0;
|
| - bootstrap_libraries[i].index_ != ObjectStore::kNone;
|
| - ++i) {
|
| -#ifdef PRODUCT
|
| - if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) {
|
| - continue;
|
| - }
|
| -#endif // !PRODUCT
|
| - uri = Symbols::New(thread, bootstrap_libraries[i].uri_);
|
| - lib = Library::LookupLibrary(thread, uri);
|
| - if (lib.IsNull()) {
|
| - lib = Library::NewLibraryHelper(uri, false);
|
| - lib.SetLoadRequested();
|
| - lib.Register(thread);
|
| - }
|
| - isolate->object_store()->set_bootstrap_library(
|
| - bootstrap_libraries[i].index_, lib);
|
| - }
|
| -
|
| // Load, compile and patch bootstrap libraries.
|
| - for (intptr_t i = 0;
|
| - bootstrap_libraries[i].index_ != ObjectStore::kNone;
|
| - ++i) {
|
| -#ifdef PRODUCT
|
| - if (bootstrap_libraries[i].index_ == ObjectStore::kMirrors) {
|
| - continue;
|
| - }
|
| -#endif // PRODUCT
|
| - uri = Symbols::New(thread, bootstrap_libraries[i].uri_);
|
| - lib = Library::LookupLibrary(thread, uri);
|
| + for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) {
|
| + ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
|
| + uri = Symbols::New(thread, bootstrap_libraries[i].uri);
|
| + lib = isolate->object_store()->bootstrap_library(id);
|
| ASSERT(!lib.IsNull());
|
| - source = GetLibrarySource(lib, uri, false);
|
| + ASSERT(lib.raw() == Library::LookupLibrary(thread, uri));
|
| + source = GetLibrarySourceByIndex(i, uri, false);
|
| if (source.IsNull()) {
|
| const String& message = String::Handle(
|
| String::NewFormatted("Unable to find dart source for %s",
|
| @@ -337,19 +283,14 @@ RawError* Bootstrap::LoadandCompileScripts() {
|
| break;
|
| }
|
| // If a patch exists, load and patch the script.
|
| - if (bootstrap_libraries[i].patch_paths_ != NULL) {
|
| - patch_uri = Symbols::New(thread, bootstrap_libraries[i].patch_uri_);
|
| - error = LoadPatchFiles(zone,
|
| - lib,
|
| - patch_uri,
|
| - bootstrap_libraries[i].patch_paths_);
|
| - if (!error.IsNull()) {
|
| - break;
|
| - }
|
| + error = LoadPatchFiles(thread, lib, i);
|
| + if (!error.IsNull()) {
|
| + break;
|
| }
|
| }
|
| +
|
| if (error.IsNull()) {
|
| - SetupNativeResolver();
|
| + Bootstrap::SetupNativeResolver();
|
| ClassFinalizer::ProcessPendingClasses();
|
|
|
| // Eagerly compile the _Closure class as it is the class of all closure
|
| @@ -369,4 +310,31 @@ RawError* Bootstrap::LoadandCompileScripts() {
|
| return error.raw();
|
| }
|
|
|
| +
|
| +RawError* Bootstrap::DoBootstrapping() {
|
| + Thread* thread = Thread::Current();
|
| + Isolate* isolate = thread->isolate();
|
| + Zone* zone = thread->zone();
|
| + String& uri = String::Handle(zone);
|
| + Library& lib = Library::Handle(zone);
|
| +
|
| + HANDLESCOPE(thread);
|
| +
|
| + // Ensure there are library objects for all the bootstrap libraries.
|
| + for (intptr_t i = 0; i < kBootstrapLibraryCount; ++i) {
|
| + ObjectStore::BootstrapLibraryId id = bootstrap_libraries[i].index;
|
| + uri = Symbols::New(thread, bootstrap_libraries[i].uri);
|
| + lib = isolate->object_store()->bootstrap_library(id);
|
| + ASSERT(lib.raw() == Library::LookupLibrary(thread, uri));
|
| + if (lib.IsNull()) {
|
| + lib = Library::NewLibraryHelper(uri, false);
|
| + lib.SetLoadRequested();
|
| + lib.Register(thread);
|
| + isolate->object_store()->set_bootstrap_library(id, lib);
|
| + }
|
| + }
|
| +
|
| + return BootstrapFromSource(thread);
|
| +}
|
| +
|
| } // namespace dart
|
|
|