| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include <stdlib.h> | 5 #include <stdlib.h> | 
| 6 #include <string.h> | 6 #include <string.h> | 
| 7 #include <stdio.h> | 7 #include <stdio.h> | 
| 8 | 8 | 
| 9 #include "include/dart_api.h" | 9 #include "include/dart_api.h" | 
| 10 #include "include/dart_debugger_api.h" | 10 #include "include/dart_debugger_api.h" | 
| (...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 890     } | 890     } | 
| 891 | 891 | 
| 892     // Write the magic number to indicate file is a script snapshot. | 892     // Write the magic number to indicate file is a script snapshot. | 
| 893     DartUtils::WriteMagicNumber(snapshot_file); | 893     DartUtils::WriteMagicNumber(snapshot_file); | 
| 894 | 894 | 
| 895     // Now write the snapshot out to specified file. | 895     // Now write the snapshot out to specified file. | 
| 896     bool bytes_written = snapshot_file->WriteFully(buffer, size); | 896     bool bytes_written = snapshot_file->WriteFully(buffer, size); | 
| 897     ASSERT(bytes_written); | 897     ASSERT(bytes_written); | 
| 898     delete snapshot_file; | 898     delete snapshot_file; | 
| 899   } else { | 899   } else { | 
|  | 900     // Lookup the library of the root script. | 
|  | 901     Dart_Handle root_lib = Dart_RootLibrary(); | 
|  | 902     // Import the root library into the builtin library so that we can easily | 
|  | 903     // lookup the main entry point exported from the root library. | 
|  | 904     Dart_Handle builtin_lib = | 
|  | 905         Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); | 
|  | 906     result = Dart_LibraryImportLibrary(builtin_lib, root_lib, Dart_Null()); | 
|  | 907 | 
| 900     if (has_compile_all) { | 908     if (has_compile_all) { | 
| 901       result = Dart_CompileAll(); | 909       result = Dart_CompileAll(); | 
| 902       if (Dart_IsError(result)) { | 910       if (Dart_IsError(result)) { | 
| 903         return DartErrorExit(result); | 911         return DartErrorExit(result); | 
| 904       } | 912       } | 
| 905     } | 913     } | 
| 906 | 914 | 
| 907     if (has_check_function_fingerprints) { | 915     if (has_check_function_fingerprints) { | 
| 908       result = Dart_CheckFunctionFingerprints(); | 916       result = Dart_CheckFunctionFingerprints(); | 
| 909       if (Dart_IsError(result)) { | 917       if (Dart_IsError(result)) { | 
| 910         return DartErrorExit(result); | 918         return DartErrorExit(result); | 
| 911       } | 919       } | 
| 912     } | 920     } | 
| 913 | 921 | 
| 914     // Lookup the library of the root script. | 922     if (Dart_IsNull(root_lib)) { | 
| 915     Dart_Handle library = Dart_RootLibrary(); |  | 
| 916     if (Dart_IsNull(library)) { |  | 
| 917       return ErrorExit(kErrorExitCode, | 923       return ErrorExit(kErrorExitCode, | 
| 918                        "Unable to find root library for '%s'\n", | 924                        "Unable to find root library for '%s'\n", | 
| 919                        script_name); | 925                        script_name); | 
| 920     } | 926     } | 
| 921     // Set debug breakpoint if specified on the command line. |  | 
| 922     if (breakpoint_at != NULL) { |  | 
| 923       result = SetBreakpoint(breakpoint_at, library); |  | 
| 924       if (Dart_IsError(result)) { |  | 
| 925         return ErrorExit(kErrorExitCode, |  | 
| 926                          "Error setting breakpoint at '%s': %s\n", |  | 
| 927                          breakpoint_at, |  | 
| 928                          Dart_GetError(result)); |  | 
| 929       } |  | 
| 930     } |  | 
| 931     if (has_print_script) { | 927     if (has_print_script) { | 
| 932       result = GenerateScriptSource(); | 928       result = GenerateScriptSource(); | 
| 933       if (Dart_IsError(result)) { | 929       if (Dart_IsError(result)) { | 
| 934         return DartErrorExit(result); | 930         return DartErrorExit(result); | 
| 935       } | 931       } | 
| 936     } else { | 932     } else { | 
| 937       // Lookup and invoke the top level main function. | 933       // The helper function _getMainClosure creates a closure for the main | 
| 938       // The top-level function may accept up to two arguments: | 934       // entry point which is either explicitly or implictly exported from the | 
| 939       //   main(List<String> args, var message). | 935       // root library. | 
| 940       // However most commonly it either accepts one (the args list) or | 936       Dart_Handle main_closure = Dart_Invoke( | 
| 941       // none. | 937           builtin_lib, Dart_NewStringFromCString("_getMainClosure"), 0, NULL); | 
| 942       // If the message is optional, main(args, [message]), it is invoked with | 938       if (Dart_IsError(main_closure)) { | 
| 943       // one argument only. | 939         return DartErrorExit(result); | 
| 944       Dart_Handle main_args[2]; | 940       } | 
| 945       main_args[0] = CreateRuntimeOptions(&dart_options); | 941 | 
| 946       main_args[1] = Dart_Null(); | 942       // Set debug breakpoint if specified on the command line before calling | 
| 947       // First try with 1 argument. | 943       // the main function. | 
| 948       result = Dart_Invoke(library, DartUtils::NewString("main"), 1, main_args); | 944       if (breakpoint_at != NULL) { | 
| 949       // TODO(iposva): Return a special error type for mismatched argument | 945         result = SetBreakpoint(breakpoint_at, root_lib); | 
| 950       // counts from Dart_Invoke to avoid the string comparison. | 946         if (Dart_IsError(result)) { | 
| 951       const char* expected_error = "Dart_Invoke: wrong argument count for " | 947           return ErrorExit(kErrorExitCode, | 
| 952           "function 'main': "; | 948                            "Error setting breakpoint at '%s': %s\n", | 
| 953       intptr_t length = strlen(expected_error); | 949                            breakpoint_at, | 
| 954       if (Dart_IsError(result) && | 950                            Dart_GetError(result)); | 
| 955           strncmp(expected_error, Dart_GetError(result), length) == 0) { |  | 
| 956         // Try with two arguments. |  | 
| 957         result = |  | 
| 958             Dart_Invoke(library, DartUtils::NewString("main"), 2, main_args); |  | 
| 959         if (Dart_IsError(result) && |  | 
| 960             strncmp(expected_error, Dart_GetError(result), length) == 0) { |  | 
| 961           // Finally try with 0 arguments. |  | 
| 962           result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL); |  | 
| 963         } | 951         } | 
| 964       } | 952       } | 
|  | 953 | 
|  | 954       // Call _startIsolate in the isolate library to enable dispatching the | 
|  | 955       // initial startup message. | 
|  | 956       Dart_Handle isolate_args[2]; | 
|  | 957       isolate_args[0] = main_closure; | 
|  | 958       isolate_args[1] = Dart_True(); | 
|  | 959 | 
|  | 960       Dart_Handle isolate_lib = Dart_LookupLibrary( | 
|  | 961           Dart_NewStringFromCString("dart:isolate")); | 
|  | 962       result = Dart_Invoke(isolate_lib, | 
|  | 963                            Dart_NewStringFromCString("_startIsolate"), | 
|  | 964                            2, isolate_args); | 
|  | 965 | 
|  | 966       // Setup the arguments in the initial startup message and leave the | 
|  | 967       // replyTo and message fields empty. | 
|  | 968       Dart_Handle initial_startup_msg = Dart_NewList(3); | 
|  | 969       result = Dart_ListSetAt(initial_startup_msg, 1, | 
|  | 970                               CreateRuntimeOptions(&dart_options)); | 
| 965       if (Dart_IsError(result)) { | 971       if (Dart_IsError(result)) { | 
| 966         return DartErrorExit(result); | 972         return DartErrorExit(result); | 
| 967       } | 973       } | 
|  | 974       Dart_Port main_port = Dart_GetMainPortId(); | 
|  | 975       bool posted = Dart_Post(main_port, initial_startup_msg); | 
|  | 976       if (!posted) { | 
|  | 977         return ErrorExit(kErrorExitCode, | 
|  | 978                          "Failed posting startup message to main " | 
|  | 979                          "isolate control port."); | 
|  | 980       } | 
| 968 | 981 | 
| 969       // Keep handling messages until the last active receive port is closed. | 982       // Keep handling messages until the last active receive port is closed. | 
| 970       result = Dart_RunLoop(); | 983       result = Dart_RunLoop(); | 
| 971       if (Dart_IsError(result)) { | 984       if (Dart_IsError(result)) { | 
| 972         return DartErrorExit(result); | 985         return DartErrorExit(result); | 
| 973       } | 986       } | 
| 974     } | 987     } | 
| 975   } | 988   } | 
| 976 | 989 | 
| 977   Dart_ExitScope(); | 990   Dart_ExitScope(); | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 1000 | 1013 | 
| 1001   return Process::GlobalExitCode(); | 1014   return Process::GlobalExitCode(); | 
| 1002 } | 1015 } | 
| 1003 | 1016 | 
| 1004 }  // namespace bin | 1017 }  // namespace bin | 
| 1005 }  // namespace dart | 1018 }  // namespace dart | 
| 1006 | 1019 | 
| 1007 int main(int argc, char** argv) { | 1020 int main(int argc, char** argv) { | 
| 1008   return dart::bin::main(argc, argv); | 1021   return dart::bin::main(argc, argv); | 
| 1009 } | 1022 } | 
| OLD | NEW | 
|---|