diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc index 55da17d932e..1b1f42faced 100644 --- a/runtime/bin/dartutils.cc +++ b/runtime/bin/dartutils.cc @@ -335,6 +335,17 @@ Dart_Handle DartUtils::SetWorkingDirectory() { } +Dart_Handle DartUtils::ResolveUriInWorkingDirectory(Dart_Handle script_uri) { + const int kNumArgs = 1; + Dart_Handle dart_args[kNumArgs]; + dart_args[0] = script_uri; + return Dart_Invoke(DartUtils::BuiltinLib(), + NewString("_resolveInWorkingDirectory"), + kNumArgs, + dart_args); +} + + Dart_Handle DartUtils::LibraryFilePath(Dart_Handle library_uri) { const int kNumArgs = 1; Dart_Handle dart_args[kNumArgs]; diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h index 4aba08b0568..b9fe476e0ac 100644 --- a/runtime/bin/dartutils.h +++ b/runtime/bin/dartutils.h @@ -197,6 +197,7 @@ class DartUtils { static const char* MapLibraryUrl(const char* url_string); + static Dart_Handle ResolveUriInWorkingDirectory(Dart_Handle script_uri); static Dart_Handle ResolveScript(Dart_Handle url); // Sniffs the specified text_buffer to see if it contains the magic number diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc index a8d04e329e9..cc8bb06692a 100644 --- a/runtime/bin/gen_snapshot.cc +++ b/runtime/bin/gen_snapshot.cc @@ -451,12 +451,36 @@ static Dart_Handle LoadUrlContents(const char* uri_string) { } +static Dart_Handle ResolveUriInWorkingDirectory(const char* script_uri) { + bool failed = false; + char* result_string = NULL; + + { + UriResolverIsolateScope scope; + + // Run DartUtils::ResolveUriInWorkingDirectory in context of uri resolver + // isolate. + Dart_Handle result = DartUtils::ResolveUriInWorkingDirectory( + DartUtils::NewString(script_uri)); + if (Dart_IsError(result)) { + failed = true; + result_string = strdup(Dart_GetError(result)); + } else { + result_string = strdup(DartUtils::GetStringValue(result)); + } + } + + Dart_Handle result = failed ? Dart_NewApiError(result_string) : + DartUtils::NewString(result_string); + free(result_string); + return result; +} + + static Dart_Handle LoadSnapshotCreationScript(const char* script_name) { // First resolve the specified script uri with respect to the original // working directory. - Dart_Handle resolved_uri = Dart_DefaultCanonicalizeUrl( - DartUtils::GetCanonicalizableWorkingDirectory(), - Dart_NewStringFromCString(script_name)); + Dart_Handle resolved_uri = ResolveUriInWorkingDirectory(script_name); if (Dart_IsError(resolved_uri)) { return resolved_uri; } @@ -499,9 +523,7 @@ static Dart_Handle CreateSnapshotLibraryTagHandler(Dart_LibraryTag tag, const char* mapped_library_url_string = DartUtils::MapLibraryUrl( library_url_string); if (mapped_library_url_string != NULL) { - library_url = Dart_DefaultCanonicalizeUrl( - DartUtils::GetCanonicalizableWorkingDirectory(), - Dart_NewStringFromCString(mapped_library_url_string)); + library_url = ResolveUriInWorkingDirectory(mapped_library_url_string); library_url_string = DartUtils::GetStringValue(library_url); } @@ -546,9 +568,7 @@ static Dart_Handle CreateSnapshotLibraryTagHandler(Dart_LibraryTag tag, Dart_Handle resolved_url = url; if (mapped_url_string != NULL) { // Mapped urls are relative to working directory. - resolved_url = Dart_DefaultCanonicalizeUrl( - DartUtils::GetCanonicalizableWorkingDirectory(), - Dart_NewStringFromCString(mapped_url_string)); + resolved_url = ResolveUriInWorkingDirectory(mapped_url_string); if (Dart_IsError(resolved_url)) { return resolved_url; }