| Index: runtime/bin/main.cc | 
| =================================================================== | 
| --- runtime/bin/main.cc	(revision 7756) | 
| +++ runtime/bin/main.cc	(working copy) | 
| @@ -25,8 +25,10 @@ | 
| extern const uint8_t* snapshot_buffer; | 
|  | 
|  | 
| -// Global state that stores the original working directory.. | 
| +// Global state that stores a pointer to the application script file. | 
| +static const char* original_script_name = NULL; | 
| static const char* original_working_directory = NULL; | 
| +static const char* original_script_url = NULL; | 
|  | 
|  | 
| // Global state that stores the import URL map specified on the | 
| @@ -65,15 +67,6 @@ | 
| static bool has_compile_all = false; | 
|  | 
|  | 
| -static bool IsWindowsHost() { | 
| -#if defined(TARGET_OS_WINDOWS) | 
| -  return true; | 
| -#else  // defined(TARGET_OS_WINDOWS) | 
| -  return false; | 
| -#endif  // defined(TARGET_OS_WINDOWS) | 
| -} | 
| - | 
| - | 
| static bool IsValidFlag(const char* name, | 
| const char* prefix, | 
| intptr_t prefix_length) { | 
| @@ -304,34 +297,10 @@ | 
| } | 
|  | 
|  | 
| - | 
| -static Dart_Handle ResolveScriptUri(Dart_Handle script_uri, | 
| -                                    Dart_Handle builtin_lib) { | 
| -  const int kNumArgs = 3; | 
| -  Dart_Handle dart_args[kNumArgs]; | 
| -  dart_args[0] = Dart_NewString(original_working_directory); | 
| -  dart_args[1] = script_uri; | 
| -  dart_args[2] = (IsWindowsHost() ? Dart_True() : Dart_False()); | 
| -  return Dart_Invoke( | 
| -      builtin_lib, Dart_NewString("_resolveScriptUri"), kNumArgs, dart_args); | 
| -} | 
| - | 
| - | 
| -static Dart_Handle FilePathFromUri(Dart_Handle script_uri, | 
| -                                   Dart_Handle builtin_lib) { | 
| -  const int kNumArgs = 2; | 
| -  Dart_Handle dart_args[kNumArgs]; | 
| -  dart_args[0] = script_uri; | 
| -  dart_args[1] = (IsWindowsHost() ? Dart_True() : Dart_False()); | 
| -  Dart_Handle script_path = Dart_Invoke( | 
| -      builtin_lib, Dart_NewString("_filePathFromUri"), kNumArgs, dart_args); | 
| -  return script_path; | 
| -} | 
| - | 
| - | 
| static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, | 
| Dart_Handle library, | 
| -                                     Dart_Handle url) { | 
| +                                     Dart_Handle url, | 
| +                                     Dart_Handle import_map) { | 
| if (!Dart_IsLibrary(library)) { | 
| return Dart_Error("not a library"); | 
| } | 
| @@ -357,12 +326,11 @@ | 
| if (Dart_IsError(library_url)) { | 
| return library_url; | 
| } | 
| -    const int kNumArgs = 2; | 
| -    Dart_Handle dart_args[kNumArgs]; | 
| +    Dart_Handle dart_args[2]; | 
| dart_args[0] = library_url; | 
| dart_args[1] = url; | 
| return Dart_Invoke( | 
| -        builtin_lib, Dart_NewString("_resolveUri"), kNumArgs, dart_args); | 
| +        builtin_lib, Dart_NewString("_resolveUri"), 2, dart_args); | 
| } | 
| if (is_dart_scheme_url) { | 
| ASSERT(tag == kImportTag); | 
| @@ -383,7 +351,10 @@ | 
| } else { | 
| // Get the file path out of the url. | 
| Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); | 
| -    Dart_Handle file_path = FilePathFromUri(url, builtin_lib); | 
| +    Dart_Handle dart_args[1]; | 
| +    dart_args[0] = url; | 
| +    Dart_Handle file_path = Dart_Invoke( | 
| +        builtin_lib, Dart_NewString("_filePathFromUri"), 1, dart_args); | 
| if (Dart_IsError(file_path)) { | 
| return file_path; | 
| } | 
| @@ -399,7 +370,8 @@ | 
| library, | 
| url, | 
| tag, | 
| -                                 url_string); | 
| +                                 url_string, | 
| +                                 import_map); | 
| if (!Dart_IsError(result) && (tag == kImportTag)) { | 
| Builtin::ImportLibrary(result, Builtin::kBuiltinLibrary); | 
| } | 
| @@ -407,41 +379,39 @@ | 
| } | 
|  | 
|  | 
| -static Dart_Handle ReadSource(Dart_Handle script_uri, | 
| -                              Dart_Handle builtin_lib) { | 
| -  Dart_Handle script_path = FilePathFromUri(script_uri, builtin_lib); | 
| +static Dart_Handle LoadScript(Dart_Handle builtin_lib, | 
| +                              CommandLineOptions* map) { | 
| +  Dart_Handle dart_args[3]; | 
| +  dart_args[0] = Dart_NewString(original_working_directory); | 
| +  dart_args[1] = Dart_NewString(original_script_name); | 
| +#if !defined(TARGET_OS_WINDOWS) | 
| +  dart_args[2] = Dart_False(); | 
| +#else  // !defined(TARGET_OS_WINDOWS) | 
| +  dart_args[2] = Dart_True(); | 
| +#endif  // !defined(TARGET_OS_WINDOWS) | 
| +  Dart_Handle script_url = Dart_Invoke( | 
| +      builtin_lib, Dart_NewString("_resolveScriptUri"), 3, dart_args); | 
| +  if (Dart_IsError(script_url)) { | 
| +    fprintf(stderr, "%s", Dart_GetError(script_url)); | 
| +    return script_url; | 
| +  } | 
| +  if (original_script_url == NULL) { | 
| +    const char* script_url_cstr; | 
| +    Dart_StringToCString(script_url, &script_url_cstr); | 
| +    original_script_url = strdup(script_url_cstr); | 
| +  } | 
| +  dart_args[0] = script_url; | 
| +  Dart_Handle script_path = Dart_Invoke( | 
| +      builtin_lib, Dart_NewString("_filePathFromUri"), 1, dart_args); | 
| if (Dart_IsError(script_path)) { | 
| return script_path; | 
| } | 
| const char* script_path_cstr; | 
| Dart_StringToCString(script_path, &script_path_cstr); | 
| Dart_Handle source = DartUtils::ReadStringFromFile(script_path_cstr); | 
| -  return source; | 
| -} | 
| - | 
| - | 
| -static Dart_Handle LoadScript(const char* script_uri, | 
| -                              bool resolve_script, | 
| -                              Dart_Handle builtin_lib) { | 
| -  Dart_Handle resolved_script_uri; | 
| -  if (resolve_script) { | 
| -    resolved_script_uri = ResolveScriptUri(Dart_NewString(script_uri), | 
| -                                           builtin_lib); | 
| -    if (Dart_IsError(resolved_script_uri)) { | 
| -      return resolved_script_uri; | 
| -    } | 
| -  } else { | 
| -    resolved_script_uri = Dart_NewString(script_uri); | 
| -  } | 
| -  Dart_Handle source = ReadSource(resolved_script_uri, builtin_lib); | 
| if (Dart_IsError(source)) { | 
| return source; | 
| } | 
| -  return Dart_LoadScript(resolved_script_uri, source); | 
| -} | 
| - | 
| - | 
| -static Dart_Handle CreateImportMap(CommandLineOptions* map) { | 
| intptr_t length =  (map == NULL) ? 0 : map->count(); | 
| Dart_Handle import_map = Dart_NewList(length * 2); | 
| for (intptr_t i = 0; i < length; i++) { | 
| @@ -461,18 +431,15 @@ | 
| } | 
| free(name); | 
| } | 
| -  return import_map; | 
| +  return Dart_LoadScript(script_url, source, import_map); | 
| } | 
|  | 
|  | 
| // Returns true on success, false on failure. | 
| -static bool CreateIsolateAndSetupHelper(const char* script_uri, | 
| -                                        const char* main, | 
| -                                        bool resolve_script, | 
| -                                        void* data, | 
| -                                        char** error) { | 
| +static bool CreateIsolateAndSetup(const char* name_prefix, | 
| +                                  void* data, char** error) { | 
| Dart_Isolate isolate = | 
| -      Dart_CreateIsolate(script_uri, main, snapshot_buffer, data, error); | 
| +      Dart_CreateIsolate(name_prefix, snapshot_buffer, data, error); | 
| if (isolate == NULL) { | 
| return false; | 
| } | 
| @@ -489,61 +456,41 @@ | 
| Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); | 
| if (Dart_IsError(result)) { | 
| *error = strdup(Dart_GetError(result)); | 
| -    Dart_ExitScope(); | 
| -    Dart_ShutdownIsolate(); | 
| return false; | 
| } | 
|  | 
| -  // Set up the import map for this isolate. | 
| -  result = Dart_SetImportMap(CreateImportMap(import_map_options)); | 
| -  if (Dart_IsError(result)) { | 
| -    *error = strdup(Dart_GetError(result)); | 
| -    Dart_ExitScope(); | 
| -    Dart_ShutdownIsolate(); | 
| -    return false; | 
| -  } | 
| - | 
| // Prepare builtin and its dependent libraries for use to resolve URIs. | 
| Dart_Handle uri_lib = Builtin::LoadLibrary(Builtin::kUriLibrary); | 
| if (Dart_IsError(uri_lib)) { | 
| *error = strdup(Dart_GetError(uri_lib)); | 
| -    Dart_ExitScope(); | 
| -    Dart_ShutdownIsolate(); | 
| return false; | 
| } | 
| Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); | 
| if (Dart_IsError(builtin_lib)) { | 
| *error = strdup(Dart_GetError(builtin_lib)); | 
| -    Dart_ExitScope(); | 
| -    Dart_ShutdownIsolate(); | 
| return false; | 
| } | 
|  | 
| if (package_root != NULL) { | 
| -    const int kNumArgs = 1; | 
| -    Dart_Handle dart_args[kNumArgs]; | 
| +    Dart_Handle dart_args[1]; | 
|  | 
| Dart_Handle handle = Dart_NewString(package_root); | 
| if (Dart_IsError(handle)) { | 
| *error = strdup(Dart_GetError(handle)); | 
| -      Dart_ExitScope(); | 
| -      Dart_ShutdownIsolate(); | 
| return false; | 
| } | 
| dart_args[0] = handle; | 
|  | 
| Dart_Handle result = Dart_Invoke(builtin_lib, | 
| -        Dart_NewString("_setPackageRoot"), kNumArgs, dart_args); | 
| +        Dart_NewString("_setPackageRoot"), 1, dart_args); | 
| if (Dart_IsError(result)) { | 
| *error = strdup(Dart_GetError(result)); | 
| -      Dart_ExitScope(); | 
| -      Dart_ShutdownIsolate(); | 
| return false; | 
| } | 
| } | 
|  | 
| // Load the specified application script into the newly created isolate. | 
| -  Dart_Handle library = LoadScript(script_uri, resolve_script, builtin_lib); | 
| +  Dart_Handle library = LoadScript(builtin_lib, import_map_options); | 
| if (Dart_IsError(library)) { | 
| *error = strdup(Dart_GetError(library)); | 
| Dart_ExitScope(); | 
| @@ -554,7 +501,7 @@ | 
| char errbuf[256]; | 
| snprintf(errbuf, sizeof(errbuf), | 
| "Expected a library when loading script: %s", | 
| -             script_uri); | 
| +             original_script_name); | 
| *error = strdup(errbuf); | 
| Dart_ExitScope(); | 
| Dart_ShutdownIsolate(); | 
| @@ -567,17 +514,6 @@ | 
| } | 
|  | 
|  | 
| -static bool CreateIsolateAndSetup(const char* script_uri, | 
| -                                  const char* main, | 
| -                                  void* data, char** error) { | 
| -  return CreateIsolateAndSetupHelper(script_uri, | 
| -                                     main, | 
| -                                     false,  // script_uri already canonical. | 
| -                                     data, | 
| -                                     error); | 
| -} | 
| - | 
| - | 
| static void PrintUsage() { | 
| fprintf(stderr, | 
| "dart [<vm-flags>] <dart-script-file> [<dart-options>]\n"); | 
| @@ -647,7 +583,10 @@ | 
|  | 
| Dart_ExitScope(); | 
| Dart_ShutdownIsolate(); | 
| + | 
| +  free(const_cast<char*>(original_script_name)); | 
| free(const_cast<char*>(original_working_directory)); | 
| +  free(const_cast<char*>(original_script_url)); | 
|  | 
| return kErrorExitCode; | 
| } | 
| @@ -682,18 +621,16 @@ | 
| // Initialize the Dart VM. | 
| Dart_Initialize(CreateIsolateAndSetup, NULL); | 
|  | 
| +  original_script_name = strdup(script_name); | 
| original_working_directory = Directory::Current(); | 
|  | 
| // Call CreateIsolateAndSetup which creates an isolate and loads up | 
| // the specified application script. | 
| char* error = NULL; | 
| -  char* isolate_name = BuildIsolateName(script_name, "main"); | 
| -  if (!CreateIsolateAndSetupHelper(script_name, | 
| -                                   "main", | 
| -                                   true,  // Canonicalize the script name. | 
| -                                   NULL, | 
| -                                   &error)) { | 
| +  char* isolate_name = BuildIsolateName(original_script_name, "main"); | 
| +  if (!CreateIsolateAndSetup(isolate_name, NULL, &error)) { | 
| fprintf(stderr, "%s\n", error); | 
| +    free(const_cast<char*>(original_script_name)); | 
| free(const_cast<char*>(original_working_directory)); | 
| free(error); | 
| delete [] isolate_name; | 
| @@ -716,15 +653,15 @@ | 
|  | 
| // Create a dart options object that can be accessed from dart code. | 
| Dart_Handle options_result = | 
| -      SetupRuntimeOptions(&dart_options, executable_name, script_name); | 
| +      SetupRuntimeOptions(&dart_options, executable_name, original_script_name); | 
| if (Dart_IsError(options_result)) { | 
| return ErrorExit("%s\n", Dart_GetError(options_result)); | 
| } | 
| -  // Lookup the library of the root script. | 
| -  Dart_Handle library = Dart_RootLibrary(); | 
| -  if (Dart_IsNull(library)) { | 
| -    return ErrorExit("Unable to find root library for '%s'\n", | 
| -                     script_name); | 
| +  // Lookup the library of the main script. | 
| +  Dart_Handle script_url = Dart_NewString(original_script_url); | 
| +  Dart_Handle library = Dart_LookupLibrary(script_url); | 
| +  if (Dart_IsError(library)) { | 
| +    return ErrorExit("%s\n", Dart_GetError(library)); | 
| } | 
| // Set debug breakpoint if specified on the command line. | 
| if (breakpoint_at != NULL) { | 
| @@ -761,7 +698,9 @@ | 
| // Terminate process exit-code handler. | 
| Process::TerminateExitCodeHandler(); | 
|  | 
| +  free(const_cast<char*>(original_script_name)); | 
| free(const_cast<char*>(original_working_directory)); | 
| +  free(const_cast<char*>(original_script_url)); | 
|  | 
| return 0; | 
| } | 
|  |