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_tools_api.h" | 10 #include "include/dart_tools_api.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 * Global state used to control and store generation of application snapshots | 45 * Global state used to control and store generation of application snapshots |
46 * (script/full). | 46 * (script/full). |
47 * A full application snapshot can be generated and run using the following | 47 * A full application snapshot can be generated and run using the following |
48 * commands | 48 * commands |
49 * - Generating a full application snapshot : | 49 * - Generating a full application snapshot : |
50 * dart_bootstrap --full-snapshot-after-run=<filename> --package-root=<dirs> | 50 * dart_bootstrap --full-snapshot-after-run=<filename> --package-root=<dirs> |
51 * <script_uri> [<script_options>] | 51 * <script_uri> [<script_options>] |
52 * - Running the full application snapshot generated above : | 52 * - Running the full application snapshot generated above : |
53 * dart --run-full-snapshot=<filename> <script_uri> [<script_options>] | 53 * dart --run-full-snapshot=<filename> <script_uri> [<script_options>] |
54 */ | 54 */ |
55 static bool generate_script_snapshot = false; | 55 static bool run_app_snapshot = false; |
56 static bool generate_full_snapshot_after_run = false; | |
57 static bool run_full_snapshot = false; | |
58 static const char* snapshot_filename = NULL; | 56 static const char* snapshot_filename = NULL; |
| 57 enum SnapshotKind { |
| 58 kNone, |
| 59 kScript, |
| 60 kAppAOT, |
| 61 kAppJITAfterRun, |
| 62 kAppAfterRun, |
| 63 }; |
| 64 static SnapshotKind gen_snapshot_kind = kNone; |
59 | 65 |
60 // Value of the --package-root flag. | 66 // Value of the --package-root flag. |
61 // (This pointer points into an argv buffer and does not need to be | 67 // (This pointer points into an argv buffer and does not need to be |
62 // free'd.) | 68 // free'd.) |
63 static const char* commandline_package_root = NULL; | 69 static const char* commandline_package_root = NULL; |
64 | 70 |
65 // Value of the --packages flag. | 71 // Value of the --packages flag. |
66 // (This pointer points into an argv buffer and does not need to be | 72 // (This pointer points into an argv buffer and does not need to be |
67 // free'd.) | 73 // free'd.) |
68 static const char* commandline_packages_file = NULL; | 74 static const char* commandline_packages_file = NULL; |
69 | 75 |
70 | 76 |
71 // Global flag that is used to indicate that we want to compile all the | 77 // Global flag that is used to indicate that we want to compile all the |
72 // dart functions and not run anything. | 78 // dart functions and not run anything. |
73 static bool compile_all = false; | 79 static bool compile_all = false; |
74 | 80 |
75 | 81 |
76 // Global flag that is used to indicate that we want to compile all the | |
77 // dart functions before running main and not compile anything thereafter. | |
78 static bool gen_precompiled_snapshot = false; | |
79 static bool gen_precompiled_jit_snapshot = false; | |
80 | |
81 | |
82 // Global flag that is used to indicate that we want to run from a precompiled | |
83 // snapshot. | |
84 static bool run_precompiled_snapshot = false; | |
85 static bool run_precompiled_jit_snapshot = false; | |
86 | |
87 | |
88 // Global flag that is used to indicate that we want to use blobs/mmap instead | 82 // Global flag that is used to indicate that we want to use blobs/mmap instead |
89 // of assembly/shared libraries for precompilation. | 83 // of assembly/shared libraries for precompilation. |
90 static bool use_blobs = false; | 84 static bool use_blobs = false; |
91 | 85 |
92 | 86 |
93 // Value of the --gen/run_precompiled_snapshot flag. | |
94 // (This pointer points into an argv buffer and does not need to be | |
95 // free'd.) | |
96 static const char* precompiled_snapshot_directory = NULL; | |
97 | |
98 | |
99 // Global flag that is used to indicate that we want to compile everything in | 87 // Global flag that is used to indicate that we want to compile everything in |
100 // the same way as precompilation before main, then continue running in the | 88 // the same way as precompilation before main, then continue running in the |
101 // same process. | 89 // same process. |
102 // Always set this with dart_noopt. | 90 // Always set this with dart_noopt. |
103 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) | 91 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) |
104 static const bool is_noopt = true; | 92 static const bool is_noopt = true; |
105 #else | 93 #else |
106 static const bool is_noopt = false; | 94 static const bool is_noopt = false; |
107 #endif | 95 #endif |
108 | 96 |
109 | 97 |
110 extern const char* kPrecompiledLibraryName; | 98 extern const char* kPrecompiledLibraryName; |
111 extern const char* kPrecompiledInstructionsSymbolName; | 99 extern const char* kPrecompiledInstructionsSymbolName; |
112 extern const char* kPrecompiledDataSymbolName; | 100 extern const char* kPrecompiledDataSymbolName; |
113 static const char* kPrecompiledVmIsolateName = "precompiled.vmisolate"; | 101 |
114 static const char* kPrecompiledIsolateName = "precompiled.isolate"; | 102 static const char* kVMIsolateSuffix = "snapshot.vmisolate"; |
115 static const char* kPrecompiledAssemblyName = "precompiled.S"; | 103 static const char* kIsolateSuffix = "snapshot.isolate"; |
116 static const char* kPrecompiledInstructionsBlobName = | 104 static const char* kAssemblySuffix = "snapshot.S"; |
117 "precompiled.instructions"; | 105 static const char* kInstructionsSuffix = "snapshot.instructions"; |
118 static const char* kPrecompiledRodataBlobName = "precompiled.rodata"; | 106 static const char* kRODataSuffix = "snapshot.rodata"; |
119 static const char* kVMIsolateSuffix = "vmisolate"; | 107 |
120 static const char* kIsolateSuffix = "isolate"; | |
121 | 108 |
122 // Global flag that is used to indicate that we want to trace resolution of | 109 // Global flag that is used to indicate that we want to trace resolution of |
123 // URIs and the loading of libraries, parts and scripts. | 110 // URIs and the loading of libraries, parts and scripts. |
124 static bool trace_loading = false; | 111 static bool trace_loading = false; |
125 | 112 |
126 | 113 |
127 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1"; | 114 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1"; |
128 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; | 115 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; |
129 // VM Service options. | 116 // VM Service options. |
130 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; | 117 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 CommandLineOptions* vm_options) { | 327 CommandLineOptions* vm_options) { |
341 ASSERT(arg != NULL); | 328 ASSERT(arg != NULL); |
342 if (*arg != '\0') { | 329 if (*arg != '\0') { |
343 return false; | 330 return false; |
344 } | 331 } |
345 use_blobs = true; | 332 use_blobs = true; |
346 return true; | 333 return true; |
347 } | 334 } |
348 | 335 |
349 | 336 |
350 static bool ProcessGenPrecompiledSnapshotOption( | 337 static bool ProcessSnapshotFilenameOption(const char* filename, |
351 const char* arg, | 338 CommandLineOptions* vm_options) { |
352 CommandLineOptions* vm_options) { | |
353 #if !defined(DART_PRECOMPILER) | |
354 Log::PrintErr("Precompiled snapshots must be generated with " | |
355 "dart_bootstrap.\n"); | |
356 return false; | |
357 #else // defined(DART_PRECOMPILER) | |
358 ASSERT(arg != NULL); | |
359 if ((arg[0] == '=') || (arg[0] == ':')) { | |
360 precompiled_snapshot_directory = &arg[1]; | |
361 } else { | |
362 precompiled_snapshot_directory = arg; | |
363 } | |
364 gen_precompiled_snapshot = true; | |
365 vm_options->AddArgument("--precompilation"); | |
366 return true; | |
367 #endif // defined(DART_PRECOMPILER) | |
368 } | |
369 | |
370 | |
371 static bool ProcessGenPrecompiledJITSnapshotOption( | |
372 const char* arg, | |
373 CommandLineOptions* vm_options) { | |
374 ASSERT(arg != NULL); | |
375 if ((arg[0] == '=') || (arg[0] == ':')) { | |
376 precompiled_snapshot_directory = &arg[1]; | |
377 } else { | |
378 precompiled_snapshot_directory = arg; | |
379 } | |
380 gen_precompiled_jit_snapshot = true; | |
381 return true; | |
382 } | |
383 | |
384 | |
385 static bool ProcessRunPrecompiledSnapshotOption( | |
386 const char* arg, | |
387 CommandLineOptions* vm_options) { | |
388 ASSERT(arg != NULL); | |
389 precompiled_snapshot_directory = arg; | |
390 if ((precompiled_snapshot_directory[0] == '=') || | |
391 (precompiled_snapshot_directory[0] == ':')) { | |
392 precompiled_snapshot_directory = &precompiled_snapshot_directory[1]; | |
393 } | |
394 run_precompiled_snapshot = true; | |
395 vm_options->AddArgument("--precompilation"); | |
396 return true; | |
397 } | |
398 | |
399 | |
400 static bool ProcessRunPrecompiledJITSnapshotOption( | |
401 const char* arg, | |
402 CommandLineOptions* vm_options) { | |
403 ASSERT(arg != NULL); | |
404 precompiled_snapshot_directory = arg; | |
405 if ((precompiled_snapshot_directory[0] == '=') || | |
406 (precompiled_snapshot_directory[0] == ':')) { | |
407 precompiled_snapshot_directory = &precompiled_snapshot_directory[1]; | |
408 } | |
409 run_precompiled_jit_snapshot = true; | |
410 return true; | |
411 } | |
412 | |
413 | |
414 static bool ProcessSnapshotOptionHelper(const char* filename, | |
415 bool* snapshot_option) { | |
416 ASSERT((filename != NULL) && (strlen(filename) != 0)); | |
417 snapshot_filename = filename; | 339 snapshot_filename = filename; |
418 *snapshot_option = true; | 340 if (gen_snapshot_kind == kNone) { |
419 if (generate_script_snapshot && generate_full_snapshot_after_run) { | 341 gen_snapshot_kind = kScript; // Default behavior. |
420 Log::PrintErr("--snapshot and --snapshot-after-run options" | |
421 " cannot be specified at the same time\n"); | |
422 *snapshot_option = false; | |
423 return false; | |
424 } | 342 } |
425 return true; | 343 return true; |
426 } | 344 } |
427 | 345 |
428 | 346 |
429 static bool ProcessScriptSnapshotOption(const char* filename, | 347 static bool ProcessSnapshotKindOption(const char* kind, |
430 CommandLineOptions* vm_options) { | 348 CommandLineOptions* vm_options) { |
431 if ((filename == NULL) || (strlen(filename) == 0)) { | 349 if (strcmp(kind, "script") == 0) { |
432 return false; | 350 gen_snapshot_kind = kScript; |
| 351 return true; |
| 352 } else if (strcmp(kind, "app-aot") == 0) { |
| 353 gen_snapshot_kind = kAppAOT; |
| 354 return true; |
| 355 } else if (strcmp(kind, "app-jit-after-run") == 0) { |
| 356 gen_snapshot_kind = kAppJITAfterRun; |
| 357 return true; |
| 358 } else if (strcmp(kind, "app-after-run") == 0) { |
| 359 gen_snapshot_kind = kAppAfterRun; |
| 360 return true; |
433 } | 361 } |
434 // Ensure that we are already running using a full snapshot. | 362 Log::PrintErr("Unrecognized snapshot kind: '%s'\nValid kinds are: " |
435 if (isolate_snapshot_buffer == NULL) { | 363 "script, app-aot, app-jit-after-run, app-after-run\n", kind); |
436 Log::PrintErr("Script snapshots cannot be generated in this version of" | 364 return false; |
437 " Dart\n"); | |
438 return false; | |
439 } | |
440 return ProcessSnapshotOptionHelper(filename, &generate_script_snapshot); | |
441 } | 365 } |
442 | 366 |
443 | 367 |
444 static bool ProcessFullSnapshotAfterRunOption( | 368 static bool ProcessRunAppSnapshotOption( |
445 const char* filename, CommandLineOptions* vm_options) { | 369 const char* filename, CommandLineOptions* vm_options) { |
446 if ((filename == NULL) || (strlen(filename) == 0)) { | 370 ASSERT(filename != NULL); |
447 return false; | 371 snapshot_filename = filename; |
448 } | 372 run_app_snapshot = true; |
449 // Ensure that we are running 'dart_bootstrap'. | 373 return true; |
450 if (isolate_snapshot_buffer != NULL) { | |
451 Log::PrintErr("Full Application snapshots must be generated with" | |
452 " dart_bootstrap\n"); | |
453 return false; | |
454 } | |
455 return ProcessSnapshotOptionHelper(filename, | |
456 &generate_full_snapshot_after_run); | |
457 } | 374 } |
458 | 375 |
459 | 376 |
460 static bool ProcessRunFullSnapshotOption( | |
461 const char* filename, CommandLineOptions* vm_options) { | |
462 #if !defined(PRODUCT) | |
463 Log::PrintErr("Full Application snapshots can only be be run with" | |
464 " product mode\n"); | |
465 return false; | |
466 #else | |
467 return ProcessSnapshotOptionHelper(filename, &run_full_snapshot); | |
468 #endif // defined(PRODUCT) | |
469 } | |
470 | |
471 | |
472 static bool ProcessEnableVmServiceOption(const char* option_value, | 377 static bool ProcessEnableVmServiceOption(const char* option_value, |
473 CommandLineOptions* vm_options) { | 378 CommandLineOptions* vm_options) { |
474 ASSERT(option_value != NULL); | 379 ASSERT(option_value != NULL); |
475 | 380 |
476 if (!ExtractPortAndIP(option_value, | 381 if (!ExtractPortAndIP(option_value, |
477 &vm_service_server_port, | 382 &vm_service_server_port, |
478 &vm_service_server_ip, | 383 &vm_service_server_ip, |
479 DEFAULT_VM_SERVICE_SERVER_PORT, | 384 DEFAULT_VM_SERVICE_SERVER_PORT, |
480 DEFAULT_VM_SERVICE_SERVER_IP)) { | 385 DEFAULT_VM_SERVICE_SERVER_IP)) { |
481 Log::PrintErr("unrecognized --enable-vm-service option syntax. " | 386 Log::PrintErr("unrecognized --enable-vm-service option syntax. " |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 { "-h", ProcessHelpOption }, | 460 { "-h", ProcessHelpOption }, |
556 { "--help", ProcessHelpOption }, | 461 { "--help", ProcessHelpOption }, |
557 { "--packages=", ProcessPackagesOption }, | 462 { "--packages=", ProcessPackagesOption }, |
558 { "--package-root=", ProcessPackageRootOption }, | 463 { "--package-root=", ProcessPackageRootOption }, |
559 { "-v", ProcessVerboseOption }, | 464 { "-v", ProcessVerboseOption }, |
560 { "--verbose", ProcessVerboseOption }, | 465 { "--verbose", ProcessVerboseOption }, |
561 { "--version", ProcessVersionOption }, | 466 { "--version", ProcessVersionOption }, |
562 | 467 |
563 // VM specific options to the standalone dart program. | 468 // VM specific options to the standalone dart program. |
564 { "--compile_all", ProcessCompileAllOption }, | 469 { "--compile_all", ProcessCompileAllOption }, |
565 { "--use_blobs", ProcessUseBlobsOption }, | |
566 { "--enable-vm-service", ProcessEnableVmServiceOption }, | 470 { "--enable-vm-service", ProcessEnableVmServiceOption }, |
567 { "--gen-precompiled-snapshot", ProcessGenPrecompiledSnapshotOption }, | |
568 { "--gen-precompiled-jit-snapshot", ProcessGenPrecompiledJITSnapshotOption }, | |
569 { "--observe", ProcessObserveOption }, | 471 { "--observe", ProcessObserveOption }, |
570 { "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption }, | |
571 { "--run-precompiled-jit-snapshot", ProcessRunPrecompiledJITSnapshotOption }, | |
572 { "--shutdown", ProcessShutdownOption }, | 472 { "--shutdown", ProcessShutdownOption }, |
573 { "--snapshot=", ProcessScriptSnapshotOption }, | 473 { "--snapshot=", ProcessSnapshotFilenameOption }, |
574 { "--full-snapshot-after-run=", ProcessFullSnapshotAfterRunOption }, | 474 { "--snapshot-kind=", ProcessSnapshotKindOption }, |
575 { "--run-full-snapshot=", ProcessRunFullSnapshotOption }, | 475 { "--run-app-snapshot=", ProcessRunAppSnapshotOption }, |
| 476 { "--use-blobs", ProcessUseBlobsOption }, |
576 { "--trace-loading", ProcessTraceLoadingOption }, | 477 { "--trace-loading", ProcessTraceLoadingOption }, |
577 { NULL, NULL } | 478 { NULL, NULL } |
578 }; | 479 }; |
579 | 480 |
580 | 481 |
581 static bool ProcessMainOptions(const char* option, | 482 static bool ProcessMainOptions(const char* option, |
582 CommandLineOptions* vm_options) { | 483 CommandLineOptions* vm_options) { |
583 int i = 0; | 484 int i = 0; |
584 const char* name = main_options[0].option_name; | 485 const char* name = main_options[0].option_name; |
585 int option_length = strlen(option); | 486 int option_length = strlen(option); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 i++; | 583 i++; |
683 } | 584 } |
684 | 585 |
685 // Verify consistency of arguments. | 586 // Verify consistency of arguments. |
686 if ((commandline_package_root != NULL) && | 587 if ((commandline_package_root != NULL) && |
687 (commandline_packages_file != NULL)) { | 588 (commandline_packages_file != NULL)) { |
688 Log::PrintErr("Specifying both a packages directory and a packages " | 589 Log::PrintErr("Specifying both a packages directory and a packages " |
689 "file is invalid.\n"); | 590 "file is invalid.\n"); |
690 return -1; | 591 return -1; |
691 } | 592 } |
692 if (is_noopt) { | 593 if (is_noopt && gen_snapshot_kind != kNone) { |
693 if (gen_precompiled_snapshot) { | 594 Log::PrintErr("Generating a snapshot with dart_noopt is invalid.\n"); |
694 Log::PrintErr("Running dart_noopt with --gen_precompiled_snapshot" | |
695 " is invalid.\n"); | |
696 return -1; | |
697 } | |
698 if (run_precompiled_snapshot) { | |
699 Log::PrintErr("Running dart_noopt with --run_precompiled_snapshot" | |
700 " is invalid.\n"); | |
701 return -1; | |
702 } | |
703 } | |
704 if (run_full_snapshot && run_precompiled_snapshot) { | |
705 Log::PrintErr("Specifying --run_full_snapshot and" | |
706 " --run_precompiled_snapshot is invalid.\n"); | |
707 return -1; | 595 return -1; |
708 } | 596 } |
709 if ((generate_full_snapshot_after_run || gen_precompiled_snapshot) && | 597 if ((gen_snapshot_kind != kNone) && (snapshot_filename == NULL)) { |
710 (run_full_snapshot || run_precompiled_snapshot)) { | 598 Log::PrintErr("Generating a snapshot requires a filename (--snapshot).\n"); |
| 599 return -1; |
| 600 } |
| 601 if ((gen_snapshot_kind != kNone) && run_app_snapshot) { |
711 Log::PrintErr("Specifying an option to generate a snapshot and" | 602 Log::PrintErr("Specifying an option to generate a snapshot and" |
712 " run using a snapshot is invalid.\n"); | 603 " run using a snapshot is invalid.\n"); |
713 return -1; | 604 return -1; |
714 } | 605 } |
715 | 606 |
716 return 0; | 607 return 0; |
717 } | 608 } |
718 | 609 |
719 | 610 |
720 static Dart_Handle CreateRuntimeOptions(CommandLineOptions* options) { | 611 static Dart_Handle CreateRuntimeOptions(CommandLineOptions* options) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 // Returns true on success, false on failure. | 682 // Returns true on success, false on failure. |
792 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, | 683 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, |
793 const char* main, | 684 const char* main, |
794 const char* package_root, | 685 const char* package_root, |
795 const char* packages_config, | 686 const char* packages_config, |
796 Dart_IsolateFlags* flags, | 687 Dart_IsolateFlags* flags, |
797 char** error, | 688 char** error, |
798 int* exit_code) { | 689 int* exit_code) { |
799 ASSERT(script_uri != NULL); | 690 ASSERT(script_uri != NULL); |
800 | 691 |
| 692 const bool needs_load_port = !run_app_snapshot; |
801 #if defined(PRODUCT) | 693 #if defined(PRODUCT) |
802 const bool run_service_isolate = !run_full_snapshot && | 694 const bool run_service_isolate = needs_load_port; |
803 !run_precompiled_snapshot; | |
804 #else | 695 #else |
805 const bool run_service_isolate = !run_full_snapshot; | 696 // Always create the service isolate in DEBUG and RELEASE modes for profiling, |
| 697 // even if we don't need it for loading. |
| 698 const bool run_service_isolate = true; |
806 #endif // PRODUCT | 699 #endif // PRODUCT |
807 if (!run_service_isolate && | 700 if (!run_service_isolate && |
808 (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0)) { | 701 (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0)) { |
809 // We do not create a service isolate when running a full application | |
810 // snapshot or a precompiled snapshot in product mode. | |
811 return NULL; | 702 return NULL; |
812 } | 703 } |
813 | 704 |
814 IsolateData* isolate_data = new IsolateData(script_uri, | 705 IsolateData* isolate_data = new IsolateData(script_uri, |
815 package_root, | 706 package_root, |
816 packages_config); | 707 packages_config); |
817 Dart_Isolate isolate = Dart_CreateIsolate(script_uri, | 708 Dart_Isolate isolate = Dart_CreateIsolate(script_uri, |
818 main, | 709 main, |
819 isolate_snapshot_buffer, | 710 isolate_snapshot_buffer, |
820 flags, | 711 flags, |
(...skipping 11 matching lines...) Expand all Loading... |
832 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); | 723 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); |
833 Builtin::SetNativeResolver(Builtin::kIOLibrary); | 724 Builtin::SetNativeResolver(Builtin::kIOLibrary); |
834 } | 725 } |
835 | 726 |
836 // Set up the library tag handler for this isolate. | 727 // Set up the library tag handler for this isolate. |
837 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler); | 728 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler); |
838 CHECK_RESULT(result); | 729 CHECK_RESULT(result); |
839 | 730 |
840 if (Dart_IsServiceIsolate(isolate)) { | 731 if (Dart_IsServiceIsolate(isolate)) { |
841 // If this is the service isolate, load embedder specific bits and return. | 732 // If this is the service isolate, load embedder specific bits and return. |
842 bool skip_library_load = run_precompiled_snapshot || | 733 bool skip_library_load = run_app_snapshot; |
843 run_precompiled_jit_snapshot; | |
844 if (!VmService::Setup(vm_service_server_ip, | 734 if (!VmService::Setup(vm_service_server_ip, |
845 vm_service_server_port, | 735 vm_service_server_port, |
846 skip_library_load)) { | 736 skip_library_load)) { |
847 *error = strdup(VmService::GetErrorMessage()); | 737 *error = strdup(VmService::GetErrorMessage()); |
848 return NULL; | 738 return NULL; |
849 } | 739 } |
850 if (compile_all) { | 740 if (compile_all) { |
851 result = Dart_CompileAll(); | 741 result = Dart_CompileAll(); |
852 CHECK_RESULT(result); | 742 CHECK_RESULT(result); |
853 } | 743 } |
854 Dart_ExitScope(); | 744 Dart_ExitScope(); |
855 Dart_ExitIsolate(); | 745 Dart_ExitIsolate(); |
856 return isolate; | 746 return isolate; |
857 } | 747 } |
858 | 748 |
859 // Prepare builtin and other core libraries for use to resolve URIs. | 749 // Prepare builtin and other core libraries for use to resolve URIs. |
860 // Set up various closures, e.g: printing, timers etc. | 750 // Set up various closures, e.g: printing, timers etc. |
861 // Set up 'package root' for URI resolution. | 751 // Set up 'package root' for URI resolution. |
862 result = DartUtils::PrepareForScriptLoading(false, trace_loading); | 752 result = DartUtils::PrepareForScriptLoading(false, trace_loading); |
863 CHECK_RESULT(result); | 753 CHECK_RESULT(result); |
864 | 754 |
865 if (!run_precompiled_snapshot && | 755 if (needs_load_port) { |
866 !run_precompiled_jit_snapshot && | |
867 !run_full_snapshot) { | |
868 // Set up the load port provided by the service isolate so that we can | 756 // Set up the load port provided by the service isolate so that we can |
869 // load scripts. | 757 // load scripts. |
870 // With a full snapshot or a precompiled snapshot in product mode, there is | |
871 // no service isolate. A precompiled snapshot in release or debug mode does | |
872 // have the service isolate, but it doesn't use it for loading. | |
873 result = DartUtils::SetupServiceLoadPort(); | 758 result = DartUtils::SetupServiceLoadPort(); |
874 CHECK_RESULT(result); | 759 CHECK_RESULT(result); |
875 } | 760 } |
876 | 761 |
877 // Setup package root if specified. | 762 // Setup package root if specified. |
878 result = DartUtils::SetupPackageRoot(package_root, packages_config); | 763 result = DartUtils::SetupPackageRoot(package_root, packages_config); |
879 CHECK_RESULT(result); | 764 CHECK_RESULT(result); |
880 | 765 |
881 result = Dart_SetEnvironmentCallback(EnvironmentCallback); | 766 result = Dart_SetEnvironmentCallback(EnvironmentCallback); |
882 CHECK_RESULT(result); | 767 CHECK_RESULT(result); |
883 | 768 |
884 if (run_precompiled_snapshot) { | 769 if (run_app_snapshot) { |
885 // No setup. | |
886 } else if (run_full_snapshot || run_precompiled_jit_snapshot) { | |
887 result = DartUtils::SetupIOLibrary(script_uri); | 770 result = DartUtils::SetupIOLibrary(script_uri); |
888 CHECK_RESULT(result); | 771 CHECK_RESULT(result); |
889 } else { | 772 } else { |
890 // Load the specified application script into the newly created isolate. | 773 // Load the specified application script into the newly created isolate. |
891 result = DartUtils::LoadScript(script_uri); | 774 result = DartUtils::LoadScript(script_uri); |
892 CHECK_RESULT(result); | 775 CHECK_RESULT(result); |
893 | 776 |
894 // Run event-loop and wait for script loading to complete. | 777 // Run event-loop and wait for script loading to complete. |
895 result = Dart_RunLoop(); | 778 result = Dart_RunLoop(); |
896 CHECK_RESULT(result); | 779 CHECK_RESULT(result); |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 const char* qualified_libname; | 1120 const char* qualified_libname; |
1238 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) { | 1121 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) { |
1239 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, libname); | 1122 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, libname); |
1240 concat = new char[len + 1]; | 1123 concat = new char[len + 1]; |
1241 snprintf(concat, len + 1, "%s/%s", snapshot_directory, libname); | 1124 snprintf(concat, len + 1, "%s/%s", snapshot_directory, libname); |
1242 qualified_libname = concat; | 1125 qualified_libname = concat; |
1243 } else { | 1126 } else { |
1244 qualified_libname = libname; | 1127 qualified_libname = libname; |
1245 } | 1128 } |
1246 void* library = Extensions::LoadExtensionLibrary(qualified_libname); | 1129 void* library = Extensions::LoadExtensionLibrary(qualified_libname); |
1247 if (library == NULL) { | |
1248 Log::PrintErr("Error: Failed to load library '%s'\n", qualified_libname); | |
1249 Platform::Exit(kErrorExitCode); | |
1250 } | |
1251 void* symbol = Extensions::ResolveSymbol(library, symname); | |
1252 if (symbol == NULL) { | |
1253 Log::PrintErr("Error: Failed to load symbol '%s'\n", symname); | |
1254 Platform::Exit(kErrorExitCode); | |
1255 } | |
1256 if (concat != NULL) { | 1130 if (concat != NULL) { |
1257 delete concat; | 1131 delete concat; |
1258 } | 1132 } |
1259 return symbol; | 1133 if (library == NULL) { |
| 1134 return NULL; |
| 1135 } |
| 1136 return Extensions::ResolveSymbol(library, symname); |
1260 } | 1137 } |
1261 | 1138 |
1262 | 1139 |
1263 static void GenerateScriptSnapshot() { | 1140 static void GenerateScriptSnapshot() { |
1264 // First create a snapshot. | 1141 // First create a snapshot. |
1265 uint8_t* buffer = NULL; | 1142 uint8_t* buffer = NULL; |
1266 intptr_t size = 0; | 1143 intptr_t size = 0; |
1267 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); | 1144 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); |
1268 if (Dart_IsError(result)) { | 1145 if (Dart_IsError(result)) { |
1269 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); | 1146 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); |
1270 } | 1147 } |
1271 | 1148 |
1272 WriteSnapshotFile(NULL, snapshot_filename, true, buffer, size); | 1149 WriteSnapshotFile(NULL, snapshot_filename, true, buffer, size); |
1273 } | 1150 } |
1274 | 1151 |
1275 | 1152 |
1276 static void ComputeSnapshotFilenames(const char* filename, | |
1277 char** vm_snapshot_fname, | |
1278 char** isolate_snapshot_fname) { | |
1279 intptr_t len = snprintf(NULL, 0, "%s.%s", filename, kVMIsolateSuffix); | |
1280 *vm_snapshot_fname = new char[len + 1]; | |
1281 snprintf(*vm_snapshot_fname, len + 1, "%s.%s", filename, kVMIsolateSuffix); | |
1282 | |
1283 len = snprintf(NULL, 0, "%s.%s", filename, kIsolateSuffix); | |
1284 *isolate_snapshot_fname = new char[len + 1]; | |
1285 snprintf(*isolate_snapshot_fname, len + 1, "%s.%s", filename, kIsolateSuffix); | |
1286 } | |
1287 | |
1288 | |
1289 static void GeneratePrecompiledSnapshot() { | 1153 static void GeneratePrecompiledSnapshot() { |
1290 uint8_t* vm_isolate_buffer = NULL; | 1154 uint8_t* vm_isolate_buffer = NULL; |
1291 intptr_t vm_isolate_size = 0; | 1155 intptr_t vm_isolate_size = 0; |
1292 uint8_t* isolate_buffer = NULL; | 1156 uint8_t* isolate_buffer = NULL; |
1293 intptr_t isolate_size = 0; | 1157 intptr_t isolate_size = 0; |
1294 uint8_t* assembly_buffer = NULL; | 1158 uint8_t* assembly_buffer = NULL; |
1295 intptr_t assembly_size = 0; | 1159 intptr_t assembly_size = 0; |
1296 uint8_t* instructions_blob_buffer = NULL; | 1160 uint8_t* instructions_blob_buffer = NULL; |
1297 intptr_t instructions_blob_size = 0; | 1161 intptr_t instructions_blob_size = 0; |
1298 uint8_t* rodata_blob_buffer = NULL; | 1162 uint8_t* rodata_blob_buffer = NULL; |
(...skipping 14 matching lines...) Expand all Loading... |
1313 &vm_isolate_buffer, | 1177 &vm_isolate_buffer, |
1314 &vm_isolate_size, | 1178 &vm_isolate_size, |
1315 &isolate_buffer, | 1179 &isolate_buffer, |
1316 &isolate_size, | 1180 &isolate_size, |
1317 &assembly_buffer, | 1181 &assembly_buffer, |
1318 &assembly_size); | 1182 &assembly_size); |
1319 } | 1183 } |
1320 if (Dart_IsError(result)) { | 1184 if (Dart_IsError(result)) { |
1321 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); | 1185 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); |
1322 } | 1186 } |
1323 WriteSnapshotFile(precompiled_snapshot_directory, | 1187 WriteSnapshotFile(snapshot_filename, kVMIsolateSuffix, |
1324 kPrecompiledVmIsolateName, | |
1325 false, | 1188 false, |
1326 vm_isolate_buffer, | 1189 vm_isolate_buffer, |
1327 vm_isolate_size); | 1190 vm_isolate_size); |
1328 WriteSnapshotFile(precompiled_snapshot_directory, | 1191 WriteSnapshotFile(snapshot_filename, kIsolateSuffix, |
1329 kPrecompiledIsolateName, | |
1330 false, | 1192 false, |
1331 isolate_buffer, | 1193 isolate_buffer, |
1332 isolate_size); | 1194 isolate_size); |
1333 if (use_blobs) { | 1195 if (use_blobs) { |
1334 WriteSnapshotFile(precompiled_snapshot_directory, | 1196 WriteSnapshotFile(snapshot_filename, kInstructionsSuffix, |
1335 kPrecompiledInstructionsBlobName, | |
1336 false, | 1197 false, |
1337 instructions_blob_buffer, | 1198 instructions_blob_buffer, |
1338 instructions_blob_size); | 1199 instructions_blob_size); |
1339 WriteSnapshotFile(precompiled_snapshot_directory, | 1200 WriteSnapshotFile(snapshot_filename, kRODataSuffix, |
1340 kPrecompiledRodataBlobName, | |
1341 false, | 1201 false, |
1342 rodata_blob_buffer, | 1202 rodata_blob_buffer, |
1343 rodata_blob_size); | 1203 rodata_blob_size); |
1344 } else { | 1204 } else { |
1345 WriteSnapshotFile(precompiled_snapshot_directory, | 1205 WriteSnapshotFile(snapshot_filename, kAssemblySuffix, |
1346 kPrecompiledAssemblyName, | |
1347 false, | 1206 false, |
1348 assembly_buffer, | 1207 assembly_buffer, |
1349 assembly_size); | 1208 assembly_size); |
1350 } | 1209 } |
1351 } | 1210 } |
1352 | 1211 |
1353 | 1212 |
1354 static void GeneratePrecompiledJITSnapshot() { | 1213 static void GeneratePrecompiledJITSnapshot() { |
| 1214 if (!use_blobs) { |
| 1215 ErrorExit(kErrorExitCode, |
| 1216 "Generating app JIT snapshots as assembly unimplemented\n"); |
| 1217 } |
1355 uint8_t* vm_isolate_buffer = NULL; | 1218 uint8_t* vm_isolate_buffer = NULL; |
1356 intptr_t vm_isolate_size = 0; | 1219 intptr_t vm_isolate_size = 0; |
1357 uint8_t* isolate_buffer = NULL; | 1220 uint8_t* isolate_buffer = NULL; |
1358 intptr_t isolate_size = 0; | 1221 intptr_t isolate_size = 0; |
1359 uint8_t* instructions_blob_buffer = NULL; | 1222 uint8_t* instructions_blob_buffer = NULL; |
1360 intptr_t instructions_blob_size = 0; | 1223 intptr_t instructions_blob_size = 0; |
1361 uint8_t* rodata_blob_buffer = NULL; | 1224 uint8_t* rodata_blob_buffer = NULL; |
1362 intptr_t rodata_blob_size = 0; | 1225 intptr_t rodata_blob_size = 0; |
1363 Dart_Handle result = Dart_CreatePrecompiledJITSnapshotBlob( | 1226 Dart_Handle result = Dart_CreatePrecompiledJITSnapshotBlob( |
1364 &vm_isolate_buffer, | 1227 &vm_isolate_buffer, |
1365 &vm_isolate_size, | 1228 &vm_isolate_size, |
1366 &isolate_buffer, | 1229 &isolate_buffer, |
1367 &isolate_size, | 1230 &isolate_size, |
1368 &instructions_blob_buffer, | 1231 &instructions_blob_buffer, |
1369 &instructions_blob_size, | 1232 &instructions_blob_size, |
1370 &rodata_blob_buffer, | 1233 &rodata_blob_buffer, |
1371 &rodata_blob_size); | 1234 &rodata_blob_size); |
1372 if (Dart_IsError(result)) { | 1235 if (Dart_IsError(result)) { |
1373 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); | 1236 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); |
1374 } | 1237 } |
1375 WriteSnapshotFile(precompiled_snapshot_directory, | 1238 WriteSnapshotFile(snapshot_filename, kVMIsolateSuffix, |
1376 kPrecompiledVmIsolateName, | |
1377 false, | 1239 false, |
1378 vm_isolate_buffer, | 1240 vm_isolate_buffer, |
1379 vm_isolate_size); | 1241 vm_isolate_size); |
1380 WriteSnapshotFile(precompiled_snapshot_directory, | 1242 WriteSnapshotFile(snapshot_filename, kIsolateSuffix, |
1381 kPrecompiledIsolateName, | |
1382 false, | 1243 false, |
1383 isolate_buffer, | 1244 isolate_buffer, |
1384 isolate_size); | 1245 isolate_size); |
1385 WriteSnapshotFile(precompiled_snapshot_directory, | 1246 WriteSnapshotFile(snapshot_filename, kInstructionsSuffix, |
1386 kPrecompiledInstructionsBlobName, | |
1387 false, | 1247 false, |
1388 instructions_blob_buffer, | 1248 instructions_blob_buffer, |
1389 instructions_blob_size); | 1249 instructions_blob_size); |
1390 WriteSnapshotFile(precompiled_snapshot_directory, | 1250 WriteSnapshotFile(snapshot_filename, kRODataSuffix, |
1391 kPrecompiledRodataBlobName, | |
1392 false, | 1251 false, |
1393 rodata_blob_buffer, | 1252 rodata_blob_buffer, |
1394 rodata_blob_size); | 1253 rodata_blob_size); |
1395 } | 1254 } |
1396 | 1255 |
1397 | 1256 |
1398 static void GenerateFullSnapshot() { | 1257 static void GenerateFullSnapshot() { |
1399 // Create a full snapshot of the script. | 1258 // Create a full snapshot of the script. |
1400 Dart_Handle result; | 1259 Dart_Handle result; |
1401 uint8_t* vm_isolate_buffer = NULL; | 1260 uint8_t* vm_isolate_buffer = NULL; |
1402 intptr_t vm_isolate_size = 0; | 1261 intptr_t vm_isolate_size = 0; |
1403 uint8_t* isolate_buffer = NULL; | 1262 uint8_t* isolate_buffer = NULL; |
1404 intptr_t isolate_size = 0; | 1263 intptr_t isolate_size = 0; |
1405 char* vm_snapshot_fname = NULL; | |
1406 char* isolate_snapshot_fname = NULL; | |
1407 | 1264 |
1408 result = Dart_CreateSnapshot(&vm_isolate_buffer, | 1265 result = Dart_CreateSnapshot(&vm_isolate_buffer, |
1409 &vm_isolate_size, | 1266 &vm_isolate_size, |
1410 &isolate_buffer, | 1267 &isolate_buffer, |
1411 &isolate_size); | 1268 &isolate_size); |
1412 if (Dart_IsError(result)) { | 1269 if (Dart_IsError(result)) { |
1413 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); | 1270 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); |
1414 } | 1271 } |
1415 | 1272 |
1416 // Compute snapshot file names and write out the snapshot files. | 1273 WriteSnapshotFile(snapshot_filename, |
1417 ComputeSnapshotFilenames(snapshot_filename, | 1274 kVMIsolateSuffix, |
1418 &vm_snapshot_fname, | |
1419 &isolate_snapshot_fname); | |
1420 WriteSnapshotFile(NULL, | |
1421 vm_snapshot_fname, | |
1422 false, | 1275 false, |
1423 vm_isolate_buffer, | 1276 vm_isolate_buffer, |
1424 vm_isolate_size); | 1277 vm_isolate_size); |
1425 WriteSnapshotFile(NULL, | 1278 WriteSnapshotFile(snapshot_filename, |
1426 isolate_snapshot_fname, | 1279 kIsolateSuffix, |
1427 false, | 1280 false, |
1428 isolate_buffer, | 1281 isolate_buffer, |
1429 isolate_size); | 1282 isolate_size); |
1430 } | 1283 } |
1431 | 1284 |
1432 | 1285 |
1433 #define CHECK_RESULT(result) \ | 1286 #define CHECK_RESULT(result) \ |
1434 if (Dart_IsError(result)) { \ | 1287 if (Dart_IsError(result)) { \ |
1435 if (Dart_IsVMRestartRequest(result)) { \ | 1288 if (Dart_IsVMRestartRequest(result)) { \ |
1436 Dart_ExitScope(); \ | 1289 Dart_ExitScope(); \ |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1479 } | 1332 } |
1480 delete [] isolate_name; | 1333 delete [] isolate_name; |
1481 | 1334 |
1482 Dart_EnterIsolate(isolate); | 1335 Dart_EnterIsolate(isolate); |
1483 ASSERT(isolate == Dart_CurrentIsolate()); | 1336 ASSERT(isolate == Dart_CurrentIsolate()); |
1484 ASSERT(isolate != NULL); | 1337 ASSERT(isolate != NULL); |
1485 Dart_Handle result; | 1338 Dart_Handle result; |
1486 | 1339 |
1487 Dart_EnterScope(); | 1340 Dart_EnterScope(); |
1488 | 1341 |
1489 if (generate_script_snapshot) { | 1342 if (gen_snapshot_kind == kScript) { |
1490 GenerateScriptSnapshot(); | 1343 GenerateScriptSnapshot(); |
1491 } else { | 1344 } else { |
1492 // Lookup the library of the root script. | 1345 // Lookup the library of the root script. |
1493 Dart_Handle root_lib = Dart_RootLibrary(); | 1346 Dart_Handle root_lib = Dart_RootLibrary(); |
1494 // Import the root library into the builtin library so that we can easily | 1347 // Import the root library into the builtin library so that we can easily |
1495 // lookup the main entry point exported from the root library. | 1348 // lookup the main entry point exported from the root library. |
1496 IsolateData* isolate_data = | 1349 IsolateData* isolate_data = |
1497 reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate)); | 1350 reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate)); |
1498 result = Dart_LibraryImportLibrary( | 1351 result = Dart_LibraryImportLibrary( |
1499 isolate_data->builtin_lib(), root_lib, Dart_Null()); | 1352 isolate_data->builtin_lib(), root_lib, Dart_Null()); |
1500 #if !defined(PRODUCT) | 1353 #if !defined(PRODUCT) |
1501 if (is_noopt || gen_precompiled_snapshot || gen_precompiled_jit_snapshot) { | 1354 if (is_noopt || |
| 1355 (gen_snapshot_kind == kAppAfterRun) || |
| 1356 (gen_snapshot_kind == kAppAOT) || |
| 1357 (gen_snapshot_kind == kAppJITAfterRun)) { |
1502 // Load the embedder's portion of the VM service's Dart code so it will | 1358 // Load the embedder's portion of the VM service's Dart code so it will |
1503 // be included in the precompiled snapshot. | 1359 // be included in the app snapshot. |
1504 if (!VmService::LoadForGenPrecompiled()) { | 1360 if (!VmService::LoadForGenPrecompiled()) { |
1505 fprintf(stderr, | 1361 fprintf(stderr, |
1506 "VM service loading failed: %s\n", | 1362 "VM service loading failed: %s\n", |
1507 VmService::GetErrorMessage()); | 1363 VmService::GetErrorMessage()); |
1508 fflush(stderr); | 1364 fflush(stderr); |
1509 exit(kErrorExitCode); | 1365 exit(kErrorExitCode); |
1510 } | 1366 } |
1511 } | 1367 } |
1512 #endif // PRODUCT | 1368 #endif // PRODUCT |
1513 | 1369 |
1514 if (compile_all) { | 1370 if (compile_all) { |
1515 result = Dart_CompileAll(); | 1371 result = Dart_CompileAll(); |
1516 CHECK_RESULT(result); | 1372 CHECK_RESULT(result); |
1517 } | 1373 } |
1518 | 1374 |
1519 if (is_noopt || gen_precompiled_snapshot) { | 1375 if (is_noopt || (gen_snapshot_kind == kAppAOT)) { |
1520 Dart_QualifiedFunctionName standalone_entry_points[] = { | 1376 Dart_QualifiedFunctionName standalone_entry_points[] = { |
1521 { "dart:_builtin", "::", "_getMainClosure" }, | 1377 { "dart:_builtin", "::", "_getMainClosure" }, |
1522 { "dart:_builtin", "::", "_getPrintClosure" }, | 1378 { "dart:_builtin", "::", "_getPrintClosure" }, |
1523 { "dart:_builtin", "::", "_getUriBaseClosure" }, | 1379 { "dart:_builtin", "::", "_getUriBaseClosure" }, |
1524 { "dart:_builtin", "::", "_resolveUri" }, | 1380 { "dart:_builtin", "::", "_resolveUri" }, |
1525 { "dart:_builtin", "::", "_setWorkingDirectory" }, | 1381 { "dart:_builtin", "::", "_setWorkingDirectory" }, |
1526 { "dart:_builtin", "::", "_setPackageRoot" }, | 1382 { "dart:_builtin", "::", "_setPackageRoot" }, |
1527 { "dart:_builtin", "::", "_loadPackagesMap" }, | 1383 { "dart:_builtin", "::", "_loadPackagesMap" }, |
1528 { "dart:_builtin", "::", "_loadDataAsync" }, | 1384 { "dart:_builtin", "::", "_loadDataAsync" }, |
1529 { "dart:io", "::", "_makeUint8ListView" }, | 1385 { "dart:io", "::", "_makeUint8ListView" }, |
(...skipping 14 matching lines...) Expand all Loading... |
1544 { "dart:io", "_ProcessStartStatus", "set:_errorCode" }, | 1400 { "dart:io", "_ProcessStartStatus", "set:_errorCode" }, |
1545 { "dart:io", "_ProcessStartStatus", "set:_errorMessage" }, | 1401 { "dart:io", "_ProcessStartStatus", "set:_errorMessage" }, |
1546 { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" }, | 1402 { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" }, |
1547 { "dart:io", "_SecureFilterImpl", "get:SIZE" }, | 1403 { "dart:io", "_SecureFilterImpl", "get:SIZE" }, |
1548 #if !defined(PRODUCT) | 1404 #if !defined(PRODUCT) |
1549 { "dart:vmservice_io", "::", "main" }, | 1405 { "dart:vmservice_io", "::", "main" }, |
1550 #endif // !PRODUCT | 1406 #endif // !PRODUCT |
1551 { NULL, NULL, NULL } // Must be terminated with NULL entries. | 1407 { NULL, NULL, NULL } // Must be terminated with NULL entries. |
1552 }; | 1408 }; |
1553 | 1409 |
1554 const bool reset_fields = gen_precompiled_snapshot; | 1410 const bool reset_fields = gen_snapshot_kind == kAppAOT; |
1555 result = Dart_Precompile(standalone_entry_points, reset_fields); | 1411 result = Dart_Precompile(standalone_entry_points, reset_fields); |
1556 CHECK_RESULT(result); | 1412 CHECK_RESULT(result); |
1557 } | 1413 } |
1558 | 1414 |
1559 if (gen_precompiled_snapshot) { | 1415 if (gen_snapshot_kind == kAppAOT) { |
1560 GeneratePrecompiledSnapshot(); | 1416 GeneratePrecompiledSnapshot(); |
1561 } else { | 1417 } else { |
1562 if (Dart_IsNull(root_lib)) { | 1418 if (Dart_IsNull(root_lib)) { |
1563 ErrorExit(kErrorExitCode, | 1419 ErrorExit(kErrorExitCode, |
1564 "Unable to find root library for '%s'\n", | 1420 "Unable to find root library for '%s'\n", |
1565 script_name); | 1421 script_name); |
1566 } | 1422 } |
1567 | 1423 |
1568 // The helper function _getMainClosure creates a closure for the main | 1424 // The helper function _getMainClosure creates a closure for the main |
1569 // entry point which is either explicitly or implictly exported from the | 1425 // entry point which is either explicitly or implictly exported from the |
(...skipping 11 matching lines...) Expand all Loading... |
1581 | 1437 |
1582 Dart_Handle isolate_lib = | 1438 Dart_Handle isolate_lib = |
1583 Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate")); | 1439 Dart_LookupLibrary(Dart_NewStringFromCString("dart:isolate")); |
1584 result = Dart_Invoke(isolate_lib, | 1440 result = Dart_Invoke(isolate_lib, |
1585 Dart_NewStringFromCString("_startMainIsolate"), | 1441 Dart_NewStringFromCString("_startMainIsolate"), |
1586 kNumIsolateArgs, isolate_args); | 1442 kNumIsolateArgs, isolate_args); |
1587 CHECK_RESULT(result); | 1443 CHECK_RESULT(result); |
1588 | 1444 |
1589 // Keep handling messages until the last active receive port is closed. | 1445 // Keep handling messages until the last active receive port is closed. |
1590 result = Dart_RunLoop(); | 1446 result = Dart_RunLoop(); |
1591 // Generate a full snapshot after execution if specified. | 1447 // Generate an app snapshot after execution if specified. |
1592 if (generate_full_snapshot_after_run || gen_precompiled_jit_snapshot) { | 1448 if ((gen_snapshot_kind == kAppAfterRun) || |
| 1449 (gen_snapshot_kind == kAppJITAfterRun)) { |
1593 if (!Dart_IsCompilationError(result) && | 1450 if (!Dart_IsCompilationError(result) && |
1594 !Dart_IsVMRestartRequest(result)) { | 1451 !Dart_IsVMRestartRequest(result)) { |
1595 if (generate_full_snapshot_after_run) { | 1452 if (gen_snapshot_kind == kAppAfterRun) { |
1596 GenerateFullSnapshot(); | 1453 GenerateFullSnapshot(); |
1597 } else { | 1454 } else { |
1598 Dart_Handle prepare_result = Dart_PrecompileJIT(); | 1455 Dart_Handle prepare_result = Dart_PrecompileJIT(); |
1599 CHECK_RESULT(prepare_result); | 1456 CHECK_RESULT(prepare_result); |
1600 GeneratePrecompiledJITSnapshot(); | 1457 GeneratePrecompiledJITSnapshot(); |
1601 } | 1458 } |
1602 } | 1459 } |
1603 } | 1460 } |
1604 CHECK_RESULT(result); | 1461 CHECK_RESULT(result); |
1605 } | 1462 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1749 | 1606 |
1750 Thread::InitOnce(); | 1607 Thread::InitOnce(); |
1751 | 1608 |
1752 if (!DartUtils::SetOriginalWorkingDirectory()) { | 1609 if (!DartUtils::SetOriginalWorkingDirectory()) { |
1753 OSError err; | 1610 OSError err; |
1754 fprintf(stderr, "Error determining current directory: %s\n", err.message()); | 1611 fprintf(stderr, "Error determining current directory: %s\n", err.message()); |
1755 fflush(stderr); | 1612 fflush(stderr); |
1756 Platform::Exit(kErrorExitCode); | 1613 Platform::Exit(kErrorExitCode); |
1757 } | 1614 } |
1758 | 1615 |
1759 #if !defined(PRODUCT) | 1616 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) |
1760 // Constant true in PRODUCT mode. | 1617 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME. |
1761 if (generate_script_snapshot || | 1618 if ((gen_snapshot_kind != kNone) || run_app_snapshot) { |
1762 generate_full_snapshot_after_run || | |
1763 run_full_snapshot || | |
1764 gen_precompiled_jit_snapshot || | |
1765 run_precompiled_jit_snapshot) { | |
1766 vm_options.AddArgument("--load_deferred_eagerly"); | 1619 vm_options.AddArgument("--load_deferred_eagerly"); |
1767 } | 1620 } |
1768 #endif | 1621 #endif |
1769 | 1622 |
1770 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) | 1623 if ((gen_snapshot_kind == kAppAOT) || is_noopt) { |
1771 // Always set --precompilation with dart_noopt. | 1624 vm_options.AddArgument("--precompilation"); |
1772 ASSERT(!gen_precompiled_snapshot && !run_precompiled_snapshot); | 1625 } |
| 1626 #if defined(DART_PRECOMPILED_RUNTIME) |
1773 vm_options.AddArgument("--precompilation"); | 1627 vm_options.AddArgument("--precompilation"); |
1774 #endif | 1628 #endif |
1775 | 1629 |
1776 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | 1630 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
1777 | 1631 |
1778 // Start event handler. | 1632 // Start event handler. |
1779 TimerUtils::InitOnce(); | 1633 TimerUtils::InitOnce(); |
1780 EventHandler::Start(); | 1634 EventHandler::Start(); |
1781 | 1635 |
1782 const uint8_t* instructions_snapshot = NULL; | 1636 const uint8_t* instructions_snapshot = NULL; |
1783 const uint8_t* data_snapshot = NULL; | 1637 const uint8_t* data_snapshot = NULL; |
1784 if (run_precompiled_snapshot || run_precompiled_jit_snapshot) { | 1638 if (run_app_snapshot) { |
1785 ReadSnapshotFile(precompiled_snapshot_directory, | 1639 ReadSnapshotFile(snapshot_filename, kVMIsolateSuffix, |
1786 kPrecompiledVmIsolateName, | |
1787 &vm_isolate_snapshot_buffer); | 1640 &vm_isolate_snapshot_buffer); |
1788 ReadSnapshotFile(precompiled_snapshot_directory, | 1641 ReadSnapshotFile(snapshot_filename, kIsolateSuffix, |
1789 kPrecompiledIsolateName, | |
1790 &isolate_snapshot_buffer); | 1642 &isolate_snapshot_buffer); |
1791 if (use_blobs) { | 1643 if (use_blobs) { |
1792 ReadExecutableSnapshotFile(precompiled_snapshot_directory, | 1644 ReadExecutableSnapshotFile(snapshot_filename, |
1793 kPrecompiledInstructionsBlobName, | 1645 kInstructionsSuffix, |
1794 &instructions_snapshot); | 1646 &instructions_snapshot); |
1795 ReadSnapshotFile(precompiled_snapshot_directory, | 1647 ReadSnapshotFile(snapshot_filename, kRODataSuffix, |
1796 kPrecompiledRodataBlobName, | |
1797 &data_snapshot); | 1648 &data_snapshot); |
1798 } else { | 1649 } else { |
1799 instructions_snapshot = reinterpret_cast<const uint8_t*>( | 1650 instructions_snapshot = reinterpret_cast<const uint8_t*>( |
1800 LoadLibrarySymbol(precompiled_snapshot_directory, | 1651 LoadLibrarySymbol(snapshot_filename, |
1801 kPrecompiledLibraryName, | 1652 kPrecompiledLibraryName, |
1802 kPrecompiledInstructionsSymbolName)); | 1653 kPrecompiledInstructionsSymbolName)); |
1803 data_snapshot = reinterpret_cast<const uint8_t*>( | 1654 data_snapshot = reinterpret_cast<const uint8_t*>( |
1804 LoadLibrarySymbol(precompiled_snapshot_directory, | 1655 LoadLibrarySymbol(snapshot_filename, |
1805 kPrecompiledLibraryName, | 1656 kPrecompiledLibraryName, |
1806 kPrecompiledDataSymbolName)); | 1657 kPrecompiledDataSymbolName)); |
1807 } | 1658 } |
1808 } else if (run_full_snapshot) { | |
1809 char* vm_snapshot_fname; | |
1810 char* isolate_snapshot_fname; | |
1811 | |
1812 // Compute file names. | |
1813 ComputeSnapshotFilenames(snapshot_filename, | |
1814 &vm_snapshot_fname, | |
1815 &isolate_snapshot_fname); | |
1816 | |
1817 ReadSnapshotFile(NULL, vm_snapshot_fname, &vm_isolate_snapshot_buffer); | |
1818 ReadSnapshotFile(NULL, isolate_snapshot_fname, &isolate_snapshot_buffer); | |
1819 delete vm_snapshot_fname; | |
1820 delete isolate_snapshot_fname; | |
1821 } | 1659 } |
1822 | 1660 |
1823 // Initialize the Dart VM. | 1661 // Initialize the Dart VM. |
1824 char* error = Dart_Initialize( | 1662 char* error = Dart_Initialize( |
1825 vm_isolate_snapshot_buffer, instructions_snapshot, data_snapshot, | 1663 vm_isolate_snapshot_buffer, instructions_snapshot, data_snapshot, |
1826 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, | 1664 CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, |
1827 NULL, | 1665 NULL, |
1828 DartUtils::OpenFile, | 1666 DartUtils::OpenFile, |
1829 DartUtils::ReadFile, | 1667 DartUtils::ReadFile, |
1830 DartUtils::WriteFile, | 1668 DartUtils::WriteFile, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 Platform::Exit(Process::GlobalExitCode()); | 1722 Platform::Exit(Process::GlobalExitCode()); |
1885 } | 1723 } |
1886 | 1724 |
1887 } // namespace bin | 1725 } // namespace bin |
1888 } // namespace dart | 1726 } // namespace dart |
1889 | 1727 |
1890 int main(int argc, char** argv) { | 1728 int main(int argc, char** argv) { |
1891 dart::bin::main(argc, argv); | 1729 dart::bin::main(argc, argv); |
1892 UNREACHABLE(); | 1730 UNREACHABLE(); |
1893 } | 1731 } |
OLD | NEW |