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

Unified Diff: runtime/bin/dartutils.cc

Issue 889443002: Service isolate rework take 2 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 11 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/dartutils.h ('k') | runtime/bin/gen_snapshot.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/dartutils.cc
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index cd6b3e915c65d984e898f7820cb256ebed6d55db..57784898e8f1ec693a19d1453700d474f8028125 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -15,6 +15,7 @@
#include "bin/extensions.h"
#include "bin/file.h"
#include "bin/io_buffer.h"
+#include "bin/platform.h"
#include "bin/socket.h"
#include "bin/utils.h"
@@ -46,6 +47,10 @@ static bool IsWindowsHost() {
}
+// Experimental flag that offloads all script loading I/O onto
+// the service isolate. Disabled for now.
+// #define LOAD_VIA_SERVICE_ISOLATE
+
const char* DartUtils::MapLibraryUrl(CommandLineOptions* url_mapping,
const char* url_string) {
ASSERT(url_mapping != NULL);
@@ -477,6 +482,15 @@ void DartUtils::WriteMagicNumber(File* file) {
Dart_Handle DartUtils::LoadScript(const char* script_uri,
Dart_Handle builtin_lib) {
Dart_Handle uri = Dart_NewStringFromCString(script_uri);
+
+#if defined(LOAD_VIA_SERVICE_ISOLATE)
+ Dart_Port load_port = Dart_ServiceWaitForLoadPort();
+ if (load_port == ILLEGAL_PORT) {
+ return NewDartUnsupportedError("Service did not return load port.");
+ }
+ Builtin::SetLoadPort(load_port);
+#endif
+
return LoadDataAsync_Invoke(Dart_Null(), uri, Dart_Null(), builtin_lib);
}
@@ -590,10 +604,111 @@ void FUNCTION_NAME(Builtin_DoneLoading)(Dart_NativeArguments args) {
}
+void FUNCTION_NAME(Builtin_NativeLibraryExtension)(Dart_NativeArguments args) {
+ const char* suffix = Platform::LibraryExtension();
+ ASSERT(suffix != NULL);
+ Dart_Handle res = Dart_NewStringFromCString(suffix);
+ if (Dart_IsError(res)) {
+ Dart_PropagateError(res);
+ }
+ Dart_SetReturnValue(args, res);
+}
+
+
+void DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib,
+ Dart_Handle internal_lib,
+ bool is_service_isolate,
+ const char* package_root) {
+ // Setup the internal library's 'internalPrint' function.
+ Dart_Handle print = Dart_Invoke(
+ builtin_lib, NewString("_getPrintClosure"), 0, NULL);
+ DART_CHECK_VALID(print);
+ Dart_Handle result =
+ Dart_SetField(internal_lib, NewString("_printClosure"), print);
+ DART_CHECK_VALID(result);
+
+ if (!is_service_isolate) {
+ result =
+ Dart_SetField(builtin_lib, NewString("_isWindows"),
+ IsWindowsHost() ? Dart_True() : Dart_False());
+ DART_CHECK_VALID(result);
+ }
+
+#if defined(LOAD_VIA_SERVICE_ISOLATE)
+ result = Dart_SetField(builtin_lib, NewString("_load_via_service_isolate"),
+ Dart_True());
+ DART_CHECK_VALID(result);
+#endif
+
+ if (!is_service_isolate) {
+ // Set current working directory.
+ result = SetWorkingDirectory(builtin_lib);
+ DART_CHECK_VALID(result);
+ }
+
+ // Set up package root if specified.
+ if (package_root != NULL) {
+ result = NewString(package_root);
+ DART_CHECK_VALID(result);
+ const int kNumArgs = 1;
+ Dart_Handle dart_args[kNumArgs];
+ dart_args[0] = result;
+ result = Dart_Invoke(builtin_lib,
+ NewString("_setPackageRoot"),
+ kNumArgs,
+ dart_args);
+ DART_CHECK_VALID(result);
+ }
+}
+
+
+void DartUtils::PrepareCoreLibrary(Dart_Handle core_lib,
+ Dart_Handle builtin_lib,
+ bool is_service_isolate) {
+ if (!is_service_isolate) {
+ // Setup the 'Uri.base' getter in dart:core.
+ Dart_Handle uri_base = Dart_Invoke(
+ builtin_lib, NewString("_getUriBaseClosure"), 0, NULL);
+ DART_CHECK_VALID(uri_base);
+ Dart_Handle result = Dart_SetField(core_lib,
+ NewString("_uriBaseClosure"),
+ uri_base);
+ DART_CHECK_VALID(result);
+ }
+}
+
+
+void DartUtils::PrepareAsyncLibrary(Dart_Handle async_lib,
+ Dart_Handle isolate_lib) {
+ Dart_Handle schedule_immediate_closure =
+ Dart_Invoke(isolate_lib, NewString("_getIsolateScheduleImmediateClosure"),
+ 0, NULL);
+ Dart_Handle args[1];
+ args[0] = schedule_immediate_closure;
+ DART_CHECK_VALID(Dart_Invoke(
+ async_lib, NewString("_setScheduleImmediateClosure"), 1, args));
+}
+
+
+void DartUtils::PrepareIOLibrary(Dart_Handle io_lib) {
+ DART_CHECK_VALID(Dart_Invoke(io_lib, NewString("_setupHooks"), 0, NULL));
+}
+
+
+void DartUtils::PrepareIsolateLibrary(Dart_Handle isolate_lib) {
+ DART_CHECK_VALID(Dart_Invoke(isolate_lib, NewString("_setupHooks"), 0, NULL));
+}
+
+
Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root,
+ bool is_service_isolate,
Dart_Handle builtin_lib) {
// First ensure all required libraries are available.
- Dart_Handle url = NewString(kAsyncLibURL);
+ Dart_Handle url = NewString(kCoreLibURL);
+ DART_CHECK_VALID(url);
+ Dart_Handle core_lib = Dart_LookupLibrary(url);
+ DART_CHECK_VALID(core_lib);
+ url = NewString(kAsyncLibURL);
DART_CHECK_VALID(url);
Dart_Handle async_lib = Dart_LookupLibrary(url);
DART_CHECK_VALID(async_lib);
@@ -605,7 +720,6 @@ Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root,
DART_CHECK_VALID(url);
Dart_Handle internal_lib = Dart_LookupLibrary(url);
DART_CHECK_VALID(internal_lib);
-
Dart_Handle io_lib = Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
DART_CHECK_VALID(io_lib);
@@ -614,68 +728,32 @@ Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root,
Dart_Handle result = Dart_FinalizeLoading(false);
DART_CHECK_VALID(result);
- // Setup the internal library's 'internalPrint' function.
- Dart_Handle print = Dart_Invoke(
- builtin_lib, NewString("_getPrintClosure"), 0, NULL);
- result = Dart_SetField(internal_lib,
- NewString("_printClosure"),
- print);
- DART_CHECK_VALID(result);
-
- DART_CHECK_VALID(Dart_Invoke(isolate_lib, NewString("_setupHooks"), 0, NULL));
- DART_CHECK_VALID(Dart_Invoke(io_lib, NewString("_setupHooks"), 0, NULL));
-
-
- // Setup the 'scheduleImmediate' closure.
- Dart_Handle schedule_immediate_closure =
- Dart_Invoke(isolate_lib, NewString("_getIsolateScheduleImmediateClosure"),
- 0, NULL);
- Dart_Handle args[1];
- args[0] = schedule_immediate_closure;
- DART_CHECK_VALID(Dart_Invoke(
- async_lib, NewString("_setScheduleImmediateClosure"), 1, args));
-
- // Setup the corelib 'Uri.base' getter.
- url = NewString(kCoreLibURL);
- DART_CHECK_VALID(url);
- Dart_Handle corelib = Dart_LookupLibrary(url);
- DART_CHECK_VALID(corelib);
- Dart_Handle uri_base = Dart_Invoke(
- builtin_lib, NewString("_getUriBaseClosure"), 0, NULL);
- DART_CHECK_VALID(uri_base);
- result = Dart_SetField(corelib,
- NewString("_uriBaseClosure"),
- uri_base);
- DART_CHECK_VALID(result);
-
- if (IsWindowsHost()) {
- // Set running on Windows flag.
- result = Dart_Invoke(builtin_lib, NewString("_setWindows"), 0, NULL);
- if (Dart_IsError(result)) {
- return result;
- }
- }
+ PrepareBuiltinLibrary(builtin_lib,
+ internal_lib,
+ is_service_isolate,
+ package_root);
+ PrepareAsyncLibrary(async_lib, isolate_lib);
+ PrepareCoreLibrary(core_lib, builtin_lib, is_service_isolate);
+ PrepareIsolateLibrary(isolate_lib);
+ PrepareIOLibrary(io_lib);
+ return result;
+}
- // Set current working directory.
- result = SetWorkingDirectory(builtin_lib);
- if (Dart_IsError(result)) {
- return result;
- }
- // Set up package root if specified.
- if (package_root != NULL) {
- result = NewString(package_root);
- if (!Dart_IsError(result)) {
- const int kNumArgs = 1;
- Dart_Handle dart_args[kNumArgs];
- dart_args[0] = result;
- return Dart_Invoke(builtin_lib,
- NewString("_setPackageRoot"),
- kNumArgs,
- dart_args);
- }
- }
- return result;
+void DartUtils::SetupIOLibrary(const char* script_uri) {
+ Dart_Handle io_lib_url = NewString(kIOLibURL);
+ DART_CHECK_VALID(io_lib_url);
+ Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
+ DART_CHECK_VALID(io_lib);
+ Dart_Handle platform_type = GetDartType(DartUtils::kIOLibURL, "_Platform");
+ DART_CHECK_VALID(platform_type);
+ Dart_Handle script_name = NewString("_nativeScript");
+ DART_CHECK_VALID(script_name);
+ Dart_Handle dart_script = NewString(script_uri);
+ DART_CHECK_VALID(dart_script);
+ Dart_Handle set_script_name =
+ Dart_SetField(platform_type, script_name, dart_script);
+ DART_CHECK_VALID(set_script_name);
}
@@ -768,6 +846,13 @@ Dart_Handle DartUtils::NewDartArgumentError(const char* message) {
}
+Dart_Handle DartUtils::NewDartUnsupportedError(const char* message) {
+ return NewDartExceptionWithMessage(kCoreLibURL,
+ "UnsupportedError",
+ message);
+}
+
+
Dart_Handle DartUtils::NewDartIOException(const char* exception_name,
const char* message,
Dart_Handle os_error) {
« no previous file with comments | « runtime/bin/dartutils.h ('k') | runtime/bin/gen_snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698