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

Unified Diff: runtime/bin/main.cc

Issue 10871092: Added option --script-snapshot in gen_snapshot to generate the snapshot of a scipt into the file. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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
« no previous file with comments | « runtime/bin/gen_snapshot.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/main.cc
===================================================================
--- runtime/bin/main.cc (revision 11672)
+++ runtime/bin/main.cc (working copy)
@@ -26,10 +26,6 @@
extern const uint8_t* snapshot_buffer;
-// Global state that stores the original working directory..
-static const char* original_working_directory = NULL;
-
-
// Global state that stores the import URL map specified on the
// command line.
static CommandLineOptions* import_map_options = NULL;
@@ -45,6 +41,11 @@
static const char* generate_pprof_symbols_filename = NULL;
+// Global state that stores a pointer to the application script snapshot.
+static bool use_script_snapshot = false;
+static File* snapshot_file = NULL;
+
+
// Global state that stores a file name for flow graph debugging output.
// NULL if no output is generated.
static File* flow_graph_file = NULL;
@@ -75,15 +76,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) {
@@ -158,6 +150,14 @@
}
+static void ProcessScriptSnapshotOption(const char* filename) {
+ if (filename != NULL && strlen(filename) != 0) {
+ use_script_snapshot = true;
+ snapshot_file = File::Open(filename, File::kRead);
+ }
+}
+
+
static void ProcessFlowGraphOption(const char* flowgraph_option) {
ASSERT(flowgraph_option != NULL);
flow_graph_file = File::Open("flowgraph.cfg", File::kWriteTruncate);
@@ -178,11 +178,12 @@
{ "--break_at=", ProcessBreakpointOption },
{ "--compile_all", ProcessCompileAllOption },
{ "--debug", ProcessDebugOption },
+ { "--generate_flow_graph", ProcessFlowGraphOption },
{ "--generate_perf_events_symbols", ProcessPerfEventsOption },
{ "--generate_pprof_symbols=", ProcessPprofOption },
{ "--import_map=", ProcessImportMapOption },
{ "--package-root=", ProcessPackageRootOption },
- { "--generate_flow_graph", ProcessFlowGraphOption },
+ { "--use_script_snapshot=", ProcessScriptSnapshotOption },
{ NULL, NULL }
};
@@ -370,143 +371,6 @@
}
-
-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) {
- if (!Dart_IsLibrary(library)) {
- return Dart_Error("not a library");
- }
- if (!Dart_IsString8(url)) {
- return Dart_Error("url is not a string");
- }
- const char* url_string = NULL;
- Dart_Handle result = Dart_StringToCString(url, &url_string);
- if (Dart_IsError(result)) {
- return result;
- }
- bool is_dart_scheme_url = DartUtils::IsDartSchemeURL(url_string);
- bool is_dart_extension_url = DartUtils::IsDartExtensionSchemeURL(url_string);
- if (tag == kCanonicalizeUrl) {
- // If this is a Dart Scheme URL then it is not modified as it will be
- // handled by the VM internally.
- if (is_dart_scheme_url) {
- return url;
- }
- // Resolve the url within the context of the library's URL.
- Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary);
- Dart_Handle library_url = Dart_LibraryUrl(library);
- if (Dart_IsError(library_url)) {
- return library_url;
- }
- const int kNumArgs = 2;
- Dart_Handle dart_args[kNumArgs];
- dart_args[0] = library_url;
- dart_args[1] = url;
- return Dart_Invoke(
- builtin_lib, Dart_NewString("_resolveUri"), kNumArgs, dart_args);
- }
- if (is_dart_scheme_url) {
- ASSERT(tag == kImportTag);
- // Handle imports of other built-in libraries present in the SDK.
- Builtin::BuiltinLibraryId id;
- if (DartUtils::IsDartCryptoLibURL(url_string)) {
- id = Builtin::kCryptoLibrary;
- } else if (DartUtils::IsDartIOLibURL(url_string)) {
- id = Builtin::kIOLibrary;
- } else if (DartUtils::IsDartJsonLibURL(url_string)) {
- id = Builtin::kJsonLibrary;
- } else if (DartUtils::IsDartUriLibURL(url_string)) {
- id = Builtin::kUriLibrary;
- } else if (DartUtils::IsDartUtfLibURL(url_string)) {
- id = Builtin::kUtfLibrary;
- } else if (DartUtils::IsDartWebLibURL(url_string)) {
- id = Builtin::kWebLibrary;
- } else {
- return Dart_Error("Do not know how to load '%s'", url_string);
- }
- return Builtin::LoadLibrary(id);
- } 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);
- if (Dart_IsError(file_path)) {
- return file_path;
- }
- Dart_StringToCString(file_path, &url_string);
- }
- if (is_dart_extension_url) {
- if (tag != kImportTag) {
- return Dart_Error("Dart extensions must use import: '%s'", url_string);
- }
- return Extensions::LoadExtension(url_string, library);
- }
- return DartUtils::LoadSource(NULL,
- library,
- url,
- tag,
- url_string);
-}
-
-
-static Dart_Handle ReadSource(Dart_Handle script_uri,
- Dart_Handle builtin_lib) {
- Dart_Handle script_path = FilePathFromUri(script_uri, builtin_lib);
- 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);
@@ -531,6 +395,15 @@
}
+#define CHECK_RESULT(result) \
+ if (Dart_IsError(result)) { \
+ *error = strdup(Dart_GetError(result)); \
+ Dart_ExitScope(); \
+ Dart_ShutdownIsolate(); \
+ return false; \
+ } \
+
+
// Returns true on success, false on failure.
static bool CreateIsolateAndSetupHelper(const char* script_uri,
const char* main,
@@ -554,82 +427,70 @@
}
// Set up the library tag handler for this isolate.
- Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
- if (Dart_IsError(result)) {
- *error = strdup(Dart_GetError(result));
- Dart_ExitScope();
- Dart_ShutdownIsolate();
- return false;
- }
+ Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
+ CHECK_RESULT(result);
// 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;
- }
+ CHECK_RESULT(result);
- // 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;
- }
-
- // Setup the corelib 'print' function.
- Dart_Handle print =
- Dart_Invoke(builtin_lib, Dart_NewString("_getPrintClosure"), 0, 0);
- Dart_Handle coreimpl = Dart_LookupLibrary(Dart_NewString("dart:coreimpl"));
- Dart_Handle print_impl =
- Dart_GetClass(coreimpl, Dart_NewString("PrintImplementation"));
- Dart_SetField(print_impl, Dart_NewString("_printClosure"), print);
-
- // Setup the IO library.
- Dart_Handle io_lib = Builtin::LoadLibrary(Builtin::kIOLibrary);
- Builtin::SetupIOLibrary(io_lib);
-
- if (package_root != NULL) {
- const int kNumArgs = 1;
- Dart_Handle dart_args[kNumArgs];
-
- Dart_Handle handle = Dart_NewString(package_root);
- if (Dart_IsError(handle)) {
- *error = strdup(Dart_GetError(handle));
+ // Load the specified application script into the newly created isolate.
+ Dart_Handle library;
+ if (use_script_snapshot) {
+ if (snapshot_file == NULL) {
+ *error = strdup("Invalid script snapshot file name specified");
Ivan Posva 2012/08/31 23:20:51 You will end up here if you ever spawn another iso
siva 2012/09/01 00:25:44 I have set use_script_snapshot to false after the
Dart_ExitScope();
Dart_ShutdownIsolate();
return false;
}
- dart_args[0] = handle;
-
- Dart_Handle result = Dart_Invoke(builtin_lib,
- Dart_NewString("_setPackageRoot"), kNumArgs, dart_args);
- if (Dart_IsError(result)) {
- *error = strdup(Dart_GetError(result));
+ size_t len = snapshot_file->Length();
+ uint8_t* buffer = reinterpret_cast<uint8_t*>(malloc(len));
+ if (buffer == NULL) {
+ delete snapshot_file;
+ snapshot_file = NULL;
+ *error = strdup("Unable to read contents of script snapshot file");
Dart_ExitScope();
Dart_ShutdownIsolate();
return false;
}
- }
+ snapshot_file->ReadFully(buffer, len);
+ library = Dart_LoadScriptFromSnapshot(buffer);
+ free(buffer);
+ delete snapshot_file;
+ snapshot_file = NULL;
+ } else {
+ // Prepare builtin and its dependent libraries for use to resolve URIs.
+ Dart_Handle uri_lib = Builtin::LoadLibrary(Builtin::kUriLibrary);
+ CHECK_RESULT(uri_lib);
+ Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary);
+ CHECK_RESULT(builtin_lib);
- // Load the specified application script into the newly created isolate.
- Dart_Handle library = LoadScript(script_uri, resolve_script, builtin_lib);
- if (Dart_IsError(library)) {
- *error = strdup(Dart_GetError(library));
- Dart_ExitScope();
- Dart_ShutdownIsolate();
- return false;
+ // Setup the corelib 'print' function.
+ Dart_Handle print =
+ Dart_Invoke(builtin_lib, Dart_NewString("_getPrintClosure"), 0, 0);
Ivan Posva 2012/08/31 23:20:51 This also needs to happen when setting up the isol
siva 2012/09/01 00:25:44 Good point. Move this code to dartutils and call h
+ Dart_Handle coreimpl = Dart_LookupLibrary(Dart_NewString("dart:coreimpl"));
+ Dart_Handle print_impl =
+ Dart_GetClass(coreimpl, Dart_NewString("PrintImplementation"));
+ Dart_SetField(print_impl, Dart_NewString("_printClosure"), print);
+
+ // Setup the IO library.
+ Dart_Handle io_lib = Builtin::LoadLibrary(Builtin::kIOLibrary);
+ Builtin::SetupIOLibrary(io_lib);
+
+ if (package_root != NULL) {
+ const int kNumArgs = 1;
+ Dart_Handle dart_args[kNumArgs];
+
+ Dart_Handle handle = Dart_NewString(package_root);
+ CHECK_RESULT(handle);
+ dart_args[0] = handle;
+ Dart_Handle result = Dart_Invoke(
+ builtin_lib, Dart_NewString("_setPackageRoot"), kNumArgs, dart_args);
+ CHECK_RESULT(result);
+ }
+ library = DartUtils::LoadScript(script_uri, resolve_script, builtin_lib);
}
+ CHECK_RESULT(library);
if (!Dart_IsLibrary(library)) {
char errbuf[256];
snprintf(errbuf, sizeof(errbuf),
@@ -725,7 +586,6 @@
Dart_ExitScope();
Dart_ShutdownIsolate();
- free(const_cast<char*>(original_working_directory));
return kErrorExitCode;
}
@@ -779,7 +639,7 @@
NULL,
ShutdownIsolate);
- original_working_directory = Directory::Current();
+ DartUtils::SetOriginalWorkingDirectory();
// Call CreateIsolateAndSetup which creates an isolate and loads up
// the specified application script.
@@ -791,7 +651,6 @@
new IsolateData(),
&error)) {
fprintf(stderr, "%s\n", error);
- free(const_cast<char*>(original_working_directory));
free(error);
delete [] isolate_name;
return kErrorExitCode; // Indicates we encountered an error.
@@ -858,7 +717,5 @@
// Terminate process exit-code handler.
Process::TerminateExitCodeHandler();
- free(const_cast<char*>(original_working_directory));
-
return 0;
}
« no previous file with comments | « runtime/bin/gen_snapshot.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698