Index: dart/runtime/bin/main.cc |
=================================================================== |
--- dart/runtime/bin/main.cc (revision 29808) |
+++ dart/runtime/bin/main.cc (working copy) |
@@ -897,6 +897,14 @@ |
ASSERT(bytes_written); |
delete snapshot_file; |
} else { |
+ // Lookup the library of the root script. |
+ Dart_Handle root_lib = Dart_RootLibrary(); |
+ // Import the root library into the builtin library so that we can easily |
+ // lookup the main entry point exported from the root library. |
+ Dart_Handle builtin_lib = |
+ Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); |
+ result = Dart_LibraryImportLibrary(builtin_lib, root_lib, Dart_Null()); |
+ |
if (has_compile_all) { |
result = Dart_CompileAll(); |
if (Dart_IsError(result)) { |
@@ -911,60 +919,65 @@ |
} |
} |
- // Lookup the library of the root script. |
- Dart_Handle library = Dart_RootLibrary(); |
- if (Dart_IsNull(library)) { |
+ if (Dart_IsNull(root_lib)) { |
return ErrorExit(kErrorExitCode, |
"Unable to find root library for '%s'\n", |
script_name); |
} |
- // Set debug breakpoint if specified on the command line. |
- if (breakpoint_at != NULL) { |
- result = SetBreakpoint(breakpoint_at, library); |
- if (Dart_IsError(result)) { |
- return ErrorExit(kErrorExitCode, |
- "Error setting breakpoint at '%s': %s\n", |
- breakpoint_at, |
- Dart_GetError(result)); |
- } |
- } |
if (has_print_script) { |
result = GenerateScriptSource(); |
if (Dart_IsError(result)) { |
return DartErrorExit(result); |
} |
} else { |
- // Lookup and invoke the top level main function. |
- // The top-level function may accept up to two arguments: |
- // main(List<String> args, var message). |
- // However most commonly it either accepts one (the args list) or |
- // none. |
- // If the message is optional, main(args, [message]), it is invoked with |
- // one argument only. |
- Dart_Handle main_args[2]; |
- main_args[0] = CreateRuntimeOptions(&dart_options); |
- main_args[1] = Dart_Null(); |
- // First try with 1 argument. |
- result = Dart_Invoke(library, DartUtils::NewString("main"), 1, main_args); |
- // TODO(iposva): Return a special error type for mismatched argument |
- // counts from Dart_Invoke to avoid the string comparison. |
- const char* expected_error = "Dart_Invoke: wrong argument count for " |
- "function 'main': "; |
- intptr_t length = strlen(expected_error); |
- if (Dart_IsError(result) && |
- strncmp(expected_error, Dart_GetError(result), length) == 0) { |
- // Try with two arguments. |
- result = |
- Dart_Invoke(library, DartUtils::NewString("main"), 2, main_args); |
- if (Dart_IsError(result) && |
- strncmp(expected_error, Dart_GetError(result), length) == 0) { |
- // Finally try with 0 arguments. |
- result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL); |
+ // The helper function _getMainClosure creates a closure for the main |
+ // entry point which is either explicitly or implictly exported from the |
+ // root library. |
+ Dart_Handle main_closure = Dart_Invoke( |
+ builtin_lib, Dart_NewStringFromCString("_getMainClosure"), 0, NULL); |
+ if (Dart_IsError(main_closure)) { |
+ return DartErrorExit(result); |
+ } |
+ |
+ // Set debug breakpoint if specified on the command line before calling |
+ // the main function. |
+ if (breakpoint_at != NULL) { |
+ result = SetBreakpoint(breakpoint_at, root_lib); |
+ if (Dart_IsError(result)) { |
+ return ErrorExit(kErrorExitCode, |
+ "Error setting breakpoint at '%s': %s\n", |
+ breakpoint_at, |
+ Dart_GetError(result)); |
} |
} |
+ |
+ // Call _startIsolate in the isolate library to enable dispatching the |
+ // initial startup message. |
+ Dart_Handle isolate_args[2]; |
+ isolate_args[0] = main_closure; |
+ isolate_args[1] = Dart_True(); |
+ |
+ Dart_Handle isolate_lib = Dart_LookupLibrary( |
+ Dart_NewStringFromCString("dart:isolate")); |
+ result = Dart_Invoke(isolate_lib, |
+ Dart_NewStringFromCString("_startIsolate"), |
+ 2, isolate_args); |
+ |
+ // Setup the arguments in the initial startup message and leave the |
+ // replyTo and message fields empty. |
+ Dart_Handle initial_startup_msg = Dart_NewList(3); |
+ result = Dart_ListSetAt(initial_startup_msg, 1, |
+ CreateRuntimeOptions(&dart_options)); |
if (Dart_IsError(result)) { |
return DartErrorExit(result); |
} |
+ Dart_Port main_port = Dart_GetMainPortId(); |
+ bool posted = Dart_Post(main_port, initial_startup_msg); |
+ if (!posted) { |
+ return ErrorExit(kErrorExitCode, |
+ "Failed posting startup message to main " |
+ "isolate control port."); |
+ } |
// Keep handling messages until the last active receive port is closed. |
result = Dart_RunLoop(); |