Chromium Code Reviews| Index: runtime/bin/dartutils.cc |
| diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc |
| index c2eb2e0eae756a53e87a9c98b4a38186e3fa1620..58b462c661089000f930dbbfdb5e64aee8a9901b 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" |
| @@ -477,6 +478,10 @@ 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(); |
| + Builtin::SetLoadPort(load_port); |
|
siva
2015/01/27 19:12:46
Maybe return an error if load_port remains ILLEGAL
Cutch
2015/01/27 19:30:59
Done.
|
| + |
| return LoadDataAsync_Invoke(Dart_Null(), uri, Dart_Null(), builtin_lib); |
| } |
| @@ -590,96 +595,140 @@ void FUNCTION_NAME(Builtin_DoneLoading)(Dart_NativeArguments args) { |
| } |
| -Dart_Handle DartUtils::PrepareForScriptLoading(const char* package_root, |
| - Dart_Handle builtin_lib) { |
| - // First ensure all required libraries are available. |
| - Dart_Handle url = NewString(kAsyncLibURL); |
| - DART_CHECK_VALID(url); |
| - Dart_Handle async_lib = Dart_LookupLibrary(url); |
| - DART_CHECK_VALID(async_lib); |
| - Dart_Handle io_lib = Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary); |
| +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); |
| +} |
|
siva
2015/01/27 19:12:46
it was not clear to me why these Builtin_Native fu
Cutch
2015/01/27 19:30:59
Acknowledged.
|
| - // We need to ensure that all the scripts loaded so far are finalized |
| - // as we are about to invoke some Dart code below to setup closures. |
| - Dart_Handle result = Dart_FinalizeLoading(false); |
| - DART_CHECK_VALID(result); |
| + |
| +void DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib, |
| + const char* package_root) { |
| + Dart_Handle url = NewString(kInternalLibURL); |
| + DART_CHECK_VALID(url); |
| + Dart_Handle internal_lib = Dart_LookupLibrary(url); |
| + DART_CHECK_VALID(internal_lib); |
| // Setup the internal library's 'internalPrint' function. |
| Dart_Handle print = Dart_Invoke( |
| builtin_lib, NewString("_getPrintClosure"), 0, NULL); |
| - url = NewString(kInternalLibURL); |
| + DART_CHECK_VALID(print); |
| + Dart_Handle result = |
| + Dart_SetField(internal_lib, NewString("_printClosure"), print); |
| + DART_CHECK_VALID(result); |
| + |
| + if (IsWindowsHost()) { |
| + // Set running on Windows flag. |
| + result = Dart_Invoke(builtin_lib, NewString("_setWindows"), 0, NULL); |
| + DART_CHECK_VALID(result); |
| + } |
| + |
| + // 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 builtin_lib) { |
| + Dart_Handle url = NewString(kCoreLibURL); |
| DART_CHECK_VALID(url); |
| - Dart_Handle internal_lib = Dart_LookupLibrary(url); |
| - DART_CHECK_VALID(internal_lib); |
| - result = Dart_SetField(internal_lib, |
| - NewString("_printClosure"), |
| - print); |
| + Dart_Handle core_lib = Dart_LookupLibrary(url); |
| + DART_CHECK_VALID(core_lib); |
| + |
| + // 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 io_lib) { |
| + Dart_Handle url = NewString(kIsolateLibURL); |
| + DART_CHECK_VALID(url); |
| + Dart_Handle isolate_lib = Dart_LookupLibrary(url); |
| + DART_CHECK_VALID(isolate_lib); |
| - // Setup the 'timer' factory. |
| + // Setup the 'timer' factory in dart:async. |
| Dart_Handle timer_closure = |
| Dart_Invoke(io_lib, NewString("_getTimerFactoryClosure"), 0, NULL); |
| + DART_CHECK_VALID(timer_closure); |
| Dart_Handle args[1]; |
| args[0] = timer_closure; |
| DART_CHECK_VALID(Dart_Invoke( |
| async_lib, NewString("_setTimerFactoryClosure"), 1, args)); |
| - // Setup the 'scheduleImmediate' closure. |
| - url = NewString(kIsolateLibURL); |
| - DART_CHECK_VALID(url); |
| - Dart_Handle isolate_lib = Dart_LookupLibrary(url); |
| - DART_CHECK_VALID(isolate_lib); |
| + // Setup the 'scheduleImmediate' closure in dart:async. |
| Dart_Handle schedule_immediate_closure = |
| Dart_Invoke(isolate_lib, NewString("_getIsolateScheduleImmediateClosure"), |
| 0, NULL); |
| 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_Handle DartUtils::PrepareForScriptLoading(const char* package_root, |
| + Dart_Handle builtin_lib) { |
| + // First ensure all required libraries are available. |
| + Dart_Handle url = NewString(kAsyncLibURL); |
| 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); |
| + Dart_Handle async_lib = Dart_LookupLibrary(url); |
| + DART_CHECK_VALID(async_lib); |
| + Dart_Handle io_lib = Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary); |
| - if (IsWindowsHost()) { |
| - // Set running on Windows flag. |
| - result = Dart_Invoke(builtin_lib, NewString("_setWindows"), 0, NULL); |
| - if (Dart_IsError(result)) { |
| - return result; |
| - } |
| - } |
| + // We need to ensure that all the scripts loaded so far are finalized |
| + // as we are about to invoke some Dart code below to setup closures. |
| + Dart_Handle result = Dart_FinalizeLoading(false); |
| + DART_CHECK_VALID(result); |
| - // Set current working directory. |
| - result = SetWorkingDirectory(builtin_lib); |
| - if (Dart_IsError(result)) { |
| - return result; |
| - } |
| + PrepareBuiltinLibrary(builtin_lib, package_root); |
| + PrepareAsyncLibrary(async_lib, io_lib); |
| + PrepareCoreLibrary(builtin_lib); |
| - // 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); |
| +} |
| + |
| + |
| bool DartUtils::PostNull(Dart_Port port_id) { |
| // Post a message with just the null object. |
| return Dart_PostCObject(port_id, CObject::Null()->AsApiCObject()); |