Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(579)

Unified Diff: runtime/bin/main.cc

Issue 10386107: Implement spawnUri from dart:isolate. This function allows us to (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/bin/main.cc
===================================================================
--- runtime/bin/main.cc (revision 7517)
+++ runtime/bin/main.cc (working copy)
@@ -25,10 +25,8 @@
extern const uint8_t* snapshot_buffer;
-// Global state that stores a pointer to the application script file.
-static const char* original_script_name = NULL;
+// Global state that stores the original working directory..
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
@@ -299,8 +297,7 @@
static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
Dart_Handle library,
- Dart_Handle url,
- Dart_Handle import_map) {
+ Dart_Handle url) {
if (!Dart_IsLibrary(library)) {
return Dart_Error("not a library");
}
@@ -349,10 +346,15 @@
} else {
// Get the file path out of the url.
Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary);
- Dart_Handle dart_args[1];
+ Dart_Handle dart_args[2];
dart_args[0] = url;
+#if !defined(TARGET_OS_WINDOWS)
+ dart_args[1] = Dart_False();
+#else // !defined(TARGET_OS_WINDOWS)
+ dart_args[1] = Dart_True();
+#endif // !defined(TARGET_OS_WINDOWS)
Dart_Handle file_path = Dart_Invoke(
- builtin_lib, Dart_NewString("_filePathFromUri"), 1, dart_args);
+ builtin_lib, Dart_NewString("_filePathFromUri"), 2, dart_args);
if (Dart_IsError(file_path)) {
return file_path;
}
@@ -368,8 +370,7 @@
library,
url,
tag,
- url_string,
- import_map);
+ url_string);
if (!Dart_IsError(result) && (tag == kImportTag)) {
Builtin::ImportLibrary(result, Builtin::kBuiltinLibrary);
}
@@ -377,39 +378,64 @@
}
-static Dart_Handle LoadScript(Dart_Handle builtin_lib,
- CommandLineOptions* map) {
+static Dart_Handle ResolveScriptUri(Dart_Handle script_uri,
+ Dart_Handle builtin_lib) {
Dart_Handle dart_args[3];
dart_args[0] = Dart_NewString(original_working_directory);
- dart_args[1] = Dart_NewString(original_script_name);
+ dart_args[1] = script_uri;
#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(
+ return 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;
+}
+
+
+static Dart_Handle ReadSource(Dart_Handle script_uri,
+ Dart_Handle builtin_lib) {
+ Dart_Handle dart_args[2];
+ dart_args[0] = script_uri;
+#if !defined(TARGET_OS_WINDOWS)
+ dart_args[1] = Dart_False();
+#else // !defined(TARGET_OS_WINDOWS)
+ dart_args[1] = Dart_True();
+#endif // !defined(TARGET_OS_WINDOWS)
Dart_Handle script_path = Dart_Invoke(
- builtin_lib, Dart_NewString("_filePathFromUri"), 1, dart_args);
+ builtin_lib, Dart_NewString("_filePathFromUri"), 2, 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++) {
@@ -429,15 +455,18 @@
}
free(name);
}
- return Dart_LoadScript(script_url, source, import_map);
+ return import_map;
}
// Returns true on success, false on failure.
-static bool CreateIsolateAndSetup(const char* name_prefix,
- void* data, char** error) {
+static bool CreateIsolateAndSetupHelper(const char* script_uri,
+ const char* main,
+ bool resolve_script,
+ void* data,
+ char** error) {
Dart_Isolate isolate =
- Dart_CreateIsolate(name_prefix, snapshot_buffer, data, error);
+ Dart_CreateIsolate(script_uri, main, snapshot_buffer, data, error);
if (isolate == NULL) {
return false;
}
@@ -454,18 +483,33 @@
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;
}
@@ -475,6 +519,8 @@
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;
@@ -483,12 +529,14 @@
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(builtin_lib, import_map_options);
+ Dart_Handle library = LoadScript(script_uri, resolve_script, builtin_lib);
if (Dart_IsError(library)) {
*error = strdup(Dart_GetError(library));
Dart_ExitScope();
@@ -499,7 +547,7 @@
char errbuf[256];
snprintf(errbuf, sizeof(errbuf),
"Expected a library when loading script: %s",
- original_script_name);
+ script_uri);
*error = strdup(errbuf);
Dart_ExitScope();
Dart_ShutdownIsolate();
@@ -512,6 +560,17 @@
}
+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");
@@ -581,10 +640,7 @@
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;
}
@@ -619,16 +675,18 @@
// 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(original_script_name, "main");
- if (!CreateIsolateAndSetup(isolate_name, NULL, &error)) {
+ char* isolate_name = BuildIsolateName(script_name, "main");
+ if (!CreateIsolateAndSetupHelper(script_name,
+ "main",
+ true, // Canonicalize the script 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;
@@ -651,15 +709,15 @@
// Create a dart options object that can be accessed from dart code.
Dart_Handle options_result =
- SetupRuntimeOptions(&dart_options, executable_name, original_script_name);
+ SetupRuntimeOptions(&dart_options, executable_name, script_name);
if (Dart_IsError(options_result)) {
return ErrorExit("%s\n", Dart_GetError(options_result));
}
- // 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));
+ // 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);
}
// Set debug breakpoint if specified on the command line.
if (breakpoint_at != NULL) {
@@ -696,9 +754,7 @@
// 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;
}
« no previous file with comments | « runtime/bin/gen_snapshot.cc ('k') | runtime/include/dart_api.h » ('j') | runtime/lib/isolate.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698