| 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 <stdio.h> | 5 #include <stdio.h> |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 | 8 |
| 9 #include "bin/builtin.h" | 9 #include "bin/builtin.h" |
| 10 #include "bin/dartutils.h" | 10 #include "bin/dartutils.h" |
| 11 #include "bin/io_natives.h" | |
| 12 | 11 |
| 13 namespace dart { | 12 namespace dart { |
| 14 namespace bin { | 13 namespace bin { |
| 15 | 14 |
| 16 Builtin::builtin_lib_props Builtin::builtin_libraries_[] = { | 15 Builtin::builtin_lib_props Builtin::builtin_libraries_[] = { |
| 17 /* { url_, source_, patch_url_, patch_source_, has_natives_ } */ | 16 /* { url_, source_, patch_url_, patch_source_, has_natives_ } */ |
| 18 { DartUtils::kBuiltinLibURL, builtin_source_, NULL, NULL, true }, | 17 { DartUtils::kBuiltinLibURL, builtin_source_paths_, NULL, NULL, true }, |
| 19 { DartUtils::kIOLibURL, io_source_, | 18 { DartUtils::kIOLibURL, io_source_paths_, |
| 20 DartUtils::kIOLibPatchURL, io_patch_, true }, | 19 DartUtils::kIOLibPatchURL, io_patch_paths_, true }, |
| 21 }; | 20 }; |
| 22 | 21 |
| 23 | 22 |
| 23 // Patch all the specified patch files in the array 'patch_files' into the |
| 24 // library specified in 'library'. |
| 25 static void LoadPatchFiles(Dart_Handle library, |
| 26 const char* patch_uri, |
| 27 const char** patch_files) { |
| 28 for (intptr_t j = 0; patch_files[j] != NULL; j += 2) { |
| 29 Dart_Handle patch_src = DartUtils::ReadStringFromFile(patch_files[j + 1]); |
| 30 |
| 31 // Prepend the patch library URI to form a unique script URI for the patch. |
| 32 intptr_t len = snprintf(NULL, 0, "%s/%s", patch_uri, patch_files[j]); |
| 33 char* patch_filename = reinterpret_cast<char*>(malloc(len + 1)); |
| 34 snprintf(patch_filename, len + 1, "%s/%s", patch_uri, patch_files[j]); |
| 35 Dart_Handle patch_file_uri = DartUtils::NewString(patch_filename); |
| 36 free(patch_filename); |
| 37 |
| 38 DART_CHECK_VALID(Dart_LoadPatch(library, patch_file_uri, patch_src)); |
| 39 } |
| 40 } |
| 41 |
| 42 |
| 24 Dart_Handle Builtin::Source(BuiltinLibraryId id) { | 43 Dart_Handle Builtin::Source(BuiltinLibraryId id) { |
| 25 ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) == | 44 ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) == |
| 26 kInvalidLibrary); | 45 kInvalidLibrary); |
| 27 ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary); | 46 ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary); |
| 28 return DartUtils::NewString(builtin_libraries_[id].source_); | 47 |
| 48 // Try to read the source using the path specified for the uri. |
| 49 const char* uri = builtin_libraries_[id].url_; |
| 50 const char** source_paths = builtin_libraries_[id].source_paths_; |
| 51 return GetSource(source_paths, uri); |
| 29 } | 52 } |
| 30 | 53 |
| 31 /** | 54 |
| 32 * Looks up native functions in both libdart_builtin and libdart_io. | 55 Dart_Handle Builtin::PartSource(BuiltinLibraryId id, const char* part_uri) { |
| 33 */ | 56 ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) == |
| 34 Dart_NativeFunction Builtin::NativeLookup(Dart_Handle name, | 57 kInvalidLibrary); |
| 35 int argument_count) { | 58 ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary); |
| 36 Dart_NativeFunction result = BuiltinNativeLookup(name, argument_count); | 59 |
| 37 if (result != NULL) return result; | 60 // Try to read the source using the path specified for the uri. |
| 38 return IONativeLookup(name, argument_count); | 61 const char** source_paths = builtin_libraries_[id].source_paths_; |
| 62 return GetSource(source_paths, part_uri); |
| 39 } | 63 } |
| 40 | 64 |
| 65 |
| 66 Dart_Handle Builtin::GetSource(const char** source_paths, const char* uri) { |
| 67 if (source_paths == NULL) { |
| 68 return Dart_Null(); // No path mapping information exists for library. |
| 69 } |
| 70 const char* source_path = NULL; |
| 71 for (intptr_t i = 0; source_paths[i] != NULL; i += 2) { |
| 72 if (!strcmp(uri, source_paths[i])) { |
| 73 source_path = source_paths[i + 1]; |
| 74 break; |
| 75 } |
| 76 } |
| 77 if (source_path == NULL) { |
| 78 return Dart_Null(); // Uri does not exist in path mapping information. |
| 79 } |
| 80 return DartUtils::ReadStringFromFile(source_path); |
| 81 } |
| 82 |
| 83 |
| 41 void Builtin::SetNativeResolver(BuiltinLibraryId id) { | 84 void Builtin::SetNativeResolver(BuiltinLibraryId id) { |
| 42 UNREACHABLE(); | 85 UNREACHABLE(); |
| 43 } | 86 } |
| 44 | 87 |
| 45 | 88 |
| 46 Dart_Handle Builtin::LoadAndCheckLibrary(BuiltinLibraryId id) { | 89 Dart_Handle Builtin::LoadAndCheckLibrary(BuiltinLibraryId id) { |
| 47 ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) == | 90 ASSERT((sizeof(builtin_libraries_) / sizeof(builtin_lib_props)) == |
| 48 kInvalidLibrary); | 91 kInvalidLibrary); |
| 49 ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary); | 92 ASSERT(id >= kBuiltinLibrary && id < kInvalidLibrary); |
| 50 Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_); | 93 Dart_Handle url = DartUtils::NewString(builtin_libraries_[id].url_); |
| 51 Dart_Handle library = Dart_LookupLibrary(url); | 94 Dart_Handle library = Dart_LookupLibrary(url); |
| 52 if (Dart_IsError(library)) { | 95 if (Dart_IsError(library)) { |
| 53 library = Dart_LoadLibrary(url, Source(id)); | 96 library = Dart_LoadLibrary(url, Source(id)); |
| 54 if (!Dart_IsError(library) && (builtin_libraries_[id].has_natives_)) { | 97 if (!Dart_IsError(library) && (builtin_libraries_[id].has_natives_)) { |
| 55 // Setup the native resolver for built in library functions. | 98 // Setup the native resolver for built in library functions. |
| 56 DART_CHECK_VALID(Dart_SetNativeResolver(library, NativeLookup)); | 99 DART_CHECK_VALID(Dart_SetNativeResolver(library, NativeLookup)); |
| 57 } | 100 } |
| 58 if (builtin_libraries_[id].patch_url_ != NULL) { | 101 if (builtin_libraries_[id].patch_url_ != NULL) { |
| 59 ASSERT(builtin_libraries_[id].patch_source_ != NULL); | 102 ASSERT(builtin_libraries_[id].patch_paths_ != NULL); |
| 60 Dart_Handle patch_url = | 103 LoadPatchFiles(library, |
| 61 DartUtils::NewString(builtin_libraries_[id].patch_url_); | 104 builtin_libraries_[id].patch_url_, |
| 62 Dart_Handle patch_source = | 105 builtin_libraries_[id].patch_paths_); |
| 63 DartUtils::NewString(builtin_libraries_[id].patch_source_); | |
| 64 DART_CHECK_VALID(Dart_LoadPatch(library, patch_url, patch_source)); | |
| 65 } | 106 } |
| 66 } | 107 } |
| 67 DART_CHECK_VALID(library); | 108 DART_CHECK_VALID(library); |
| 68 return library; | 109 return library; |
| 69 } | 110 } |
| 70 | 111 |
| 71 } // namespace bin | 112 } // namespace bin |
| 72 } // namespace dart | 113 } // namespace dart |
| OLD | NEW |