| Index: runtime/bin/builtin.cc
|
| ===================================================================
|
| --- runtime/bin/builtin.cc (revision 22513)
|
| +++ runtime/bin/builtin.cc (working copy)
|
| @@ -8,36 +8,79 @@
|
|
|
| #include "bin/builtin.h"
|
| #include "bin/dartutils.h"
|
| -#include "bin/io_natives.h"
|
|
|
| namespace dart {
|
| namespace bin {
|
|
|
| Builtin::builtin_lib_props Builtin::builtin_libraries_[] = {
|
| /* { url_, source_, patch_url_, patch_source_, has_natives_ } */
|
| - { DartUtils::kBuiltinLibURL, builtin_source_, NULL, NULL, true },
|
| - { DartUtils::kIOLibURL, io_source_,
|
| - DartUtils::kIOLibPatchURL, io_patch_, true },
|
| + { DartUtils::kBuiltinLibURL, builtin_source_paths_, NULL, NULL, true },
|
| + { DartUtils::kIOLibURL, io_source_paths_,
|
| + DartUtils::kIOLibPatchURL, io_patch_paths_, true },
|
| };
|
|
|
|
|
| +// Patch all the specified patch files in the array 'patch_files' into the
|
| +// library specified in 'library'.
|
| +static void LoadPatchFiles(Dart_Handle library,
|
| + const char* patch_uri,
|
| + const char** patch_files) {
|
| + for (intptr_t j = 0; patch_files[j] != NULL; j += 2) {
|
| + Dart_Handle patch_src = DartUtils::ReadStringFromFile(patch_files[j + 1]);
|
| +
|
| + // Prepend the patch library URI to form a unique script URI for the patch.
|
| + intptr_t len = snprintf(NULL, 0, "%s/%s", patch_uri, patch_files[j]);
|
| + char* patch_filename = reinterpret_cast<char*>(malloc(len + 1));
|
| + snprintf(patch_filename, len + 1, "%s/%s", patch_uri, patch_files[j]);
|
| + Dart_Handle patch_file_uri = DartUtils::NewString(patch_filename);
|
| + free(patch_filename);
|
| +
|
| + DART_CHECK_VALID(Dart_LoadPatch(library, patch_file_uri, patch_src));
|
| + }
|
| +}
|
| +
|
| +
|
| Dart_Handle Builtin::Source(BuiltinLibraryId id) {
|
| ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
|
| kInvalidLibrary);
|
| ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary);
|
| - return DartUtils::NewString(builtin_libraries_[id].source_);
|
| +
|
| + // Try to read the source using the path specified for the uri.
|
| + const char* uri = builtin_libraries_[id].url_;
|
| + const char** source_paths = builtin_libraries_[id].source_paths_;
|
| + return GetSource(source_paths, uri);
|
| }
|
|
|
| -/**
|
| - * Looks up native functions in both libdart_builtin and libdart_io.
|
| - */
|
| -Dart_NativeFunction Builtin::NativeLookup(Dart_Handle name,
|
| - int argument_count) {
|
| - Dart_NativeFunction result = BuiltinNativeLookup(name, argument_count);
|
| - if (result != NULL) return result;
|
| - return IONativeLookup(name, argument_count);
|
| +
|
| +Dart_Handle Builtin::PartSource(BuiltinLibraryId id, const char* part_uri) {
|
| + ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) ==
|
| + kInvalidLibrary);
|
| + ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary);
|
| +
|
| + // Try to read the source using the path specified for the uri.
|
| + const char** source_paths = builtin_libraries_[id].source_paths_;
|
| + return GetSource(source_paths, part_uri);
|
| }
|
|
|
| +
|
| +Dart_Handle Builtin::GetSource(const char** source_paths, const char* uri) {
|
| + if (source_paths == NULL) {
|
| + return Dart_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 (!strcmp(uri, source_paths[i])) {
|
| + source_path = source_paths[i + 1];
|
| + break;
|
| + }
|
| + }
|
| + if (source_path == NULL) {
|
| + return Dart_Null(); // Uri does not exist in path mapping information.
|
| + }
|
| + return DartUtils::ReadStringFromFile(source_path);
|
| +}
|
| +
|
| +
|
| void Builtin::SetNativeResolver(BuiltinLibraryId id) {
|
| UNREACHABLE();
|
| }
|
| @@ -56,12 +99,10 @@
|
| DART_CHECK_VALID(Dart_SetNativeResolver(library, NativeLookup));
|
| }
|
| if (builtin_libraries_[id].patch_url_ != NULL) {
|
| - ASSERT(builtin_libraries_[id].patch_source_ != NULL);
|
| - Dart_Handle patch_url =
|
| - DartUtils::NewString(builtin_libraries_[id].patch_url_);
|
| - Dart_Handle patch_source =
|
| - DartUtils::NewString(builtin_libraries_[id].patch_source_);
|
| - DART_CHECK_VALID(Dart_LoadPatch(library, patch_url, patch_source));
|
| + ASSERT(builtin_libraries_[id].patch_paths_ != NULL);
|
| + LoadPatchFiles(library,
|
| + builtin_libraries_[id].patch_url_,
|
| + builtin_libraries_[id].patch_paths_);
|
| }
|
| }
|
| DART_CHECK_VALID(library);
|
|
|