Index: runtime/bin/dartutils.cc |
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc |
index 11c5f5b40d8f1e07c434815cac2e80c4957a6f4b..dd63bec000de6c79ed7a318f7d4231b0924039fb 100644 |
--- a/runtime/bin/dartutils.cc |
+++ b/runtime/bin/dartutils.cc |
@@ -482,12 +482,6 @@ void DartUtils::WriteMagicNumber(File* file) { |
Dart_Handle DartUtils::LoadScript(const char* script_uri, |
Dart_Handle builtin_lib) { |
Dart_Handle uri = Dart_NewStringFromCString(script_uri); |
- |
- Dart_Port load_port = Dart_ServiceWaitForLoadPort(); |
- if (load_port == ILLEGAL_PORT) { |
- return NewDartUnsupportedError("Service did not return load port."); |
- } |
- Builtin::SetLoadPort(load_port); |
IsolateData* isolate_data = |
reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); |
Dart_TimelineAsyncBegin("LoadScript", &(isolate_data->load_async_id)); |
@@ -632,11 +626,12 @@ void FUNCTION_NAME(Builtin_GetCurrentDirectory)(Dart_NativeArguments args) { |
} |
-void DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib, |
- Dart_Handle internal_lib, |
- bool is_service_isolate, |
- bool trace_loading, |
- const char* package_root) { |
+Dart_Handle DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib, |
+ Dart_Handle internal_lib, |
+ bool is_service_isolate, |
+ bool trace_loading, |
+ const char* package_root, |
+ const char* packages_file) { |
// Setup the internal library's 'internalPrint' function. |
Dart_Handle print = Dart_Invoke( |
builtin_lib, NewString("_getPrintClosure"), 0, NULL); |
@@ -655,16 +650,20 @@ void DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib, |
NewString("_traceLoading"), Dart_True()); |
DART_CHECK_VALID(result); |
} |
- } |
- |
- if (!is_service_isolate) { |
// Set current working directory. |
result = SetWorkingDirectory(builtin_lib); |
DART_CHECK_VALID(result); |
+ // Wait for the service isolate to initialize the load port. |
+ Dart_Port load_port = Dart_ServiceWaitForLoadPort(); |
+ if (load_port == ILLEGAL_PORT) { |
+ return NewDartUnsupportedError("Service did not return load port."); |
+ } |
+ Builtin::SetLoadPort(load_port); |
} |
// Set up package root if specified. |
if (package_root != NULL) { |
+ ASSERT(packages_file == NULL); |
result = NewString(package_root); |
DART_CHECK_VALID(result); |
const int kNumArgs = 1; |
@@ -675,7 +674,19 @@ void DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib, |
kNumArgs, |
dart_args); |
DART_CHECK_VALID(result); |
+ } else if (packages_file != NULL) { |
+ result = NewString(packages_file); |
+ DART_CHECK_VALID(result); |
+ const int kNumArgs = 1; |
+ Dart_Handle dart_args[kNumArgs]; |
+ dart_args[0] = result; |
+ result = Dart_Invoke(builtin_lib, |
+ NewString("_loadPackagesMap"), |
+ kNumArgs, |
+ dart_args); |
+ DART_CHECK_VALID(result); |
} |
+ return Dart_True(); |
} |
@@ -718,6 +729,7 @@ void DartUtils::PrepareIsolateLibrary(Dart_Handle isolate_lib) { |
Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root, |
+ const char* packages_file, |
bool is_service_isolate, |
bool trace_loading, |
Dart_Handle builtin_lib) { |
@@ -746,11 +758,14 @@ Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root, |
Dart_Handle result = Dart_FinalizeLoading(false); |
DART_CHECK_VALID(result); |
- PrepareBuiltinLibrary(builtin_lib, |
- internal_lib, |
- is_service_isolate, |
- trace_loading, |
- package_root); |
+ result = PrepareBuiltinLibrary(builtin_lib, |
+ internal_lib, |
+ is_service_isolate, |
+ trace_loading, |
+ package_root, |
+ packages_file); |
+ DART_CHECK_VALID(result); |
+ |
PrepareAsyncLibrary(async_lib, isolate_lib); |
PrepareCoreLibrary(core_lib, builtin_lib, is_service_isolate); |
PrepareIsolateLibrary(isolate_lib); |