| 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;
|
| }
|
|
|