| Index: runtime/vm/bootstrap.cc
|
| diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
|
| index 85fcf5296e2e7b61df53aeb592c5d26ddb01f104..5d7bdc39215736c950b92c1eae86059ba4324fb2 100644
|
| --- a/runtime/vm/bootstrap.cc
|
| +++ b/runtime/vm/bootstrap.cc
|
| @@ -30,6 +30,14 @@ typedef struct {
|
| } bootstrap_lib_props;
|
|
|
|
|
| +enum {
|
| + kPathsUriOffset = 0,
|
| + kPathsFileOffset = 1,
|
| + kPathsSourceOffset = 2,
|
| + kPathsEntryLength = 3
|
| +};
|
| +
|
| +
|
| static bootstrap_lib_props bootstrap_libraries[] = {
|
| INIT_LIBRARY(ObjectStore::kCore,
|
| core,
|
| @@ -86,7 +94,7 @@ static bootstrap_lib_props bootstrap_libraries[] = {
|
| static RawString* GetLibrarySource(const Library& lib,
|
| const String& uri,
|
| bool patch) {
|
| - // First check if this is a valid boot strap library and find it's index
|
| + // 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());
|
| @@ -98,7 +106,7 @@ static RawString* GetLibrarySource(const Library& lib,
|
| }
|
| }
|
| if (bootstrap_libraries[index].index_ == ObjectStore::kNone) {
|
| - return String::null(); // Library is not a boot strap library.
|
| + return String::null(); // Library is not a bootstrap library.
|
| }
|
|
|
| // Try to read the source using the path specified for the uri.
|
| @@ -109,38 +117,42 @@ static RawString* GetLibrarySource(const Library& lib,
|
| return String::null(); // No path mapping information exists for library.
|
| }
|
| const char* source_path = NULL;
|
| - for (intptr_t i = 0; source_paths[i] != NULL; i += 2) {
|
| - if (uri.Equals(source_paths[i])) {
|
| - source_path = source_paths[i + 1];
|
| + const char* source_data = NULL;
|
| + for (intptr_t i = 0; source_paths[i] != NULL; i += kPathsEntryLength) {
|
| + if (uri.Equals(source_paths[i + kPathsUriOffset])) {
|
| + source_path = source_paths[i + kPathsFileOffset];
|
| + source_data = source_paths[i + kPathsSourceOffset];
|
| break;
|
| }
|
| }
|
| - if (source_path == NULL) {
|
| + if ((source_path == NULL) && (source_data == NULL)) {
|
| return String::null(); // Uri does not exist in path mapping information.
|
| }
|
|
|
| + const uint8_t* utf8_array = NULL;
|
| + intptr_t file_length = -1;
|
| +
|
| Dart_FileOpenCallback file_open = Isolate::file_open_callback();
|
| Dart_FileReadCallback file_read = Isolate::file_read_callback();
|
| Dart_FileCloseCallback file_close = Isolate::file_close_callback();
|
| - if (file_open == NULL || file_read == NULL || file_close == NULL) {
|
| - return String::null(); // File operations are not supported.
|
| - }
|
| -
|
| - void* stream = (*file_open)(source_path, false);
|
| - if (stream == NULL) {
|
| - return String::null();
|
| + if ((file_open != NULL) && (file_read != NULL) && (file_close != NULL)) {
|
| + // Try to open and read the file.
|
| + void* stream = (*file_open)(source_path, false);
|
| + if (stream != NULL) {
|
| + (*file_read)(&utf8_array, &file_length, stream);
|
| + (*file_close)(stream);
|
| + }
|
| }
|
| -
|
| - const uint8_t* utf8_array = NULL;
|
| - intptr_t file_length = -1;
|
| - (*file_read)(&utf8_array, &file_length, stream);
|
| if (file_length == -1) {
|
| - return String::null();
|
| + if (source_data != NULL) {
|
| + file_length = strlen(source_data);
|
| + utf8_array = reinterpret_cast<const uint8_t*>(source_data);
|
| + } else {
|
| + return String::null();
|
| + }
|
| }
|
| ASSERT(utf8_array != NULL);
|
| -
|
| - (*file_close)(stream);
|
| -
|
| + ASSERT(file_length >= 0);
|
| return String::FromUTF8(utf8_array, file_length);
|
| }
|
|
|
| @@ -237,8 +249,8 @@ static RawError* LoadPatchFiles(Zone* zone,
|
| const Array& strings = Array::Handle(zone, Array::New(3));
|
| strings.SetAt(0, patch_uri);
|
| strings.SetAt(1, Symbols::Slash());
|
| - for (intptr_t j = 0; patch_files[j] != NULL; j += 2) {
|
| - patch_file_uri = String::New(patch_files[j]);
|
| + 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);
|
| if (source.IsNull()) {
|
| const String& message = String::Handle(
|
|
|