Index: runtime/vm/bootstrap.cc |
=================================================================== |
--- runtime/vm/bootstrap.cc (revision 22398) |
+++ runtime/vm/bootstrap.cc (working copy) |
@@ -27,7 +27,7 @@ |
const char* uri_; |
const char** source_paths_; |
const char* patch_uri_; |
- const char* patch_source_; |
+ const char** patch_paths_; |
} bootstrap_lib_props; |
@@ -35,19 +35,19 @@ |
INIT_LIBRARY(ObjectStore::kCore, |
core, |
Bootstrap::corelib_source_paths_, |
- Bootstrap::corelib_patch_), |
+ Bootstrap::corelib_patch_paths_), |
INIT_LIBRARY(ObjectStore::kAsync, |
async, |
Bootstrap::async_source_paths_, |
- Bootstrap::async_patch_), |
+ Bootstrap::async_patch_paths_), |
INIT_LIBRARY(ObjectStore::kCollection, |
collection, |
Bootstrap::collection_source_paths_, |
- Bootstrap::collection_patch_), |
+ Bootstrap::collection_patch_paths_), |
INIT_LIBRARY(ObjectStore::kCollectionDev, |
_collection-dev, |
Bootstrap::collection_dev_source_paths_, |
- Bootstrap::collection_dev_patch_), |
+ Bootstrap::collection_dev_patch_paths_), |
INIT_LIBRARY(ObjectStore::kCrypto, |
crypto, |
Bootstrap::crypto_source_paths_, |
@@ -55,23 +55,23 @@ |
INIT_LIBRARY(ObjectStore::kIsolate, |
isolate, |
Bootstrap::isolate_source_paths_, |
- Bootstrap::isolate_patch_), |
+ Bootstrap::isolate_patch_paths_), |
INIT_LIBRARY(ObjectStore::kJson, |
json, |
Bootstrap::json_source_paths_, |
- Bootstrap::json_patch_), |
+ Bootstrap::json_patch_paths_), |
INIT_LIBRARY(ObjectStore::kMath, |
math, |
Bootstrap::math_source_paths_, |
- Bootstrap::math_patch_), |
+ Bootstrap::math_patch_paths_), |
INIT_LIBRARY(ObjectStore::kMirrors, |
mirrors, |
Bootstrap::mirrors_source_paths_, |
- Bootstrap::mirrors_patch_), |
+ Bootstrap::mirrors_patch_paths_), |
INIT_LIBRARY(ObjectStore::kTypedData, |
typed_data, |
Bootstrap::typed_data_source_paths_, |
- Bootstrap::typed_data_patch_), |
+ Bootstrap::typed_data_patch_paths_), |
INIT_LIBRARY(ObjectStore::kUtf, |
utf, |
Bootstrap::utf_source_paths_, |
@@ -102,15 +102,10 @@ |
return String::null(); // Library is not a boot strap library. |
} |
- if (patch) { |
- // TODO(asiva): Replace with actual read of the source file. |
- const char* source = bootstrap_libraries[index].patch_source_; |
- ASSERT(source != NULL); |
- return String::New(source, Heap::kOld); |
- } |
- |
// Try to read the source using the path specified for the uri. |
- const char** source_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. |
} |
@@ -234,6 +229,41 @@ |
} |
+static RawError* LoadPatchFiles(Isolate* isolate, |
+ const Library& lib, |
+ const String& patch_uri, |
+ const char** patch_files) { |
+ String& patch_file_uri = String::Handle(isolate); |
+ String& source = String::Handle(isolate); |
+ Script& script = Script::Handle(isolate); |
+ Error& error = Error::Handle(isolate); |
+ const Array& strings = Array::Handle(isolate, Array::New(3)); |
+ strings.SetAt(0, patch_uri); |
+ strings.SetAt(1, Symbols::Slash()); |
+ intptr_t j = 0; |
+ while (patch_files[j] != NULL) { |
+ patch_file_uri = String::New(patch_files[j]); |
+ source = GetLibrarySource(lib, patch_file_uri, true); |
+ if (source.IsNull()) { |
+ return Api::UnwrapErrorHandle( |
+ isolate, |
+ Api::NewError("Unable to find dart patch source for %s", |
+ patch_file_uri.ToCString())).raw(); |
+ } |
+ // Prepend the patch library URI to form a unique script URI for the patch. |
+ strings.SetAt(2, patch_file_uri); |
+ patch_file_uri = String::ConcatAll(strings); |
+ script = Script::New(patch_file_uri, source, RawScript::kPatchTag); |
+ error = lib.Patch(script); |
+ if (!error.IsNull()) { |
+ return error.raw(); |
+ } |
+ j += 2; |
+ } |
+ return Error::null(); |
+} |
+ |
+ |
RawError* Bootstrap::LoadandCompileScripts() { |
Isolate* isolate = Isolate::Current(); |
String& uri = String::Handle(); |
@@ -266,7 +296,7 @@ |
i = i + 1; |
} |
- // Load and compile bootstrap libraries. |
+ // Load, compile and patch bootstrap libraries. |
i = 0; |
while (bootstrap_libraries[i].index_ != ObjectStore::kNone) { |
uri = Symbols::New(bootstrap_libraries[i].uri_); |
@@ -285,18 +315,12 @@ |
break; |
} |
// If a patch exists, load and patch the script. |
- if (bootstrap_libraries[i].patch_source_ != NULL) { |
- patch_uri = String::New(bootstrap_libraries[i].patch_uri_, |
- Heap::kOld); |
- source = GetLibrarySource(lib, uri, true); |
- if (source.IsNull()) { |
- error ^= Api::UnwrapErrorHandle( |
- isolate, Api::NewError("Unable to find dart patch source for %s", |
- uri.ToCString())).raw(); |
- break; |
- } |
- script = Script::New(patch_uri, source, RawScript::kPatchTag); |
- error = lib.Patch(script); |
+ if (bootstrap_libraries[i].patch_paths_ != NULL) { |
+ patch_uri = Symbols::New(bootstrap_libraries[i].patch_uri_); |
+ error = LoadPatchFiles(isolate, |
+ lib, |
+ patch_uri, |
+ bootstrap_libraries[i].patch_paths_); |
if (!error.IsNull()) { |
break; |
} |