|
25 | 25 |
|
26 | 26 | #include "debug_utils.h"
|
27 | 27 | #include "node_binding.h"
|
28 |
| -#include "node_buffer.h" |
29 |
| -#include "node_constants.h" |
30 |
| -#include "node_context_data.h" |
31 |
| -#include "node_errors.h" |
32 | 28 | #include "node_internals.h"
|
| 29 | +#include "node_main_instance.h" |
33 | 30 | #include "node_metadata.h"
|
34 | 31 | #include "node_native_module_env.h"
|
35 | 32 | #include "node_options-inl.h"
|
36 | 33 | #include "node_perf.h"
|
37 |
| -#include "node_platform.h" |
38 | 34 | #include "node_process.h"
|
39 | 35 | #include "node_revert.h"
|
40 | 36 | #include "node_v8_platform-inl.h"
|
|
56 | 52 | #include "node_dtrace.h"
|
57 | 53 | #endif
|
58 | 54 |
|
59 |
| -#include "async_wrap-inl.h" |
60 |
| -#include "env-inl.h" |
61 |
| -#include "handle_wrap.h" |
62 |
| -#include "req_wrap-inl.h" |
63 |
| -#include "string_bytes.h" |
64 |
| -#include "util.h" |
65 |
| -#include "uv.h" |
66 | 55 | #if NODE_USE_V8_PLATFORM
|
67 | 56 | #include "libplatform/libplatform.h"
|
68 | 57 | #endif // NODE_USE_V8_PLATFORM
|
@@ -122,23 +111,19 @@ using native_module::NativeModuleEnv;
|
122 | 111 | using options_parser::kAllowedInEnvironment;
|
123 | 112 | using options_parser::kDisallowedInEnvironment;
|
124 | 113 |
|
125 |
| -using v8::Array; |
126 | 114 | using v8::Boolean;
|
127 | 115 | using v8::Context;
|
128 |
| -using v8::DEFAULT; |
129 | 116 | using v8::EscapableHandleScope;
|
130 | 117 | using v8::Exception;
|
131 | 118 | using v8::Function;
|
132 | 119 | using v8::FunctionCallbackInfo;
|
133 | 120 | using v8::HandleScope;
|
134 | 121 | using v8::Isolate;
|
135 | 122 | using v8::Local;
|
136 |
| -using v8::Locker; |
137 | 123 | using v8::Maybe;
|
138 | 124 | using v8::MaybeLocal;
|
139 | 125 | using v8::Object;
|
140 | 126 | using v8::Script;
|
141 |
| -using v8::SealHandleScope; |
142 | 127 | using v8::String;
|
143 | 128 | using v8::Undefined;
|
144 | 129 | using v8::V8;
|
@@ -767,161 +752,6 @@ void Init(int* argc,
|
767 | 752 | argv[i] = strdup(argv_[i].c_str());
|
768 | 753 | }
|
769 | 754 |
|
770 |
| -void RunBeforeExit(Environment* env) { |
771 |
| - env->RunBeforeExitCallbacks(); |
772 |
| - |
773 |
| - if (!uv_loop_alive(env->event_loop())) |
774 |
| - EmitBeforeExit(env); |
775 |
| -} |
776 |
| - |
777 |
| -// TODO(joyeecheung): align this with the CreateEnvironment exposed in node.h |
778 |
| -// and the environment creation routine in workers somehow. |
779 |
| -inline std::unique_ptr<Environment> CreateMainEnvironment( |
780 |
| - IsolateData* isolate_data, |
781 |
| - const std::vector<std::string>& args, |
782 |
| - const std::vector<std::string>& exec_args, |
783 |
| - int* exit_code) { |
784 |
| - Isolate* isolate = isolate_data->isolate(); |
785 |
| - HandleScope handle_scope(isolate); |
786 |
| - |
787 |
| - // TODO(addaleax): This should load a real per-Isolate option, currently |
788 |
| - // this is still effectively per-process. |
789 |
| - if (isolate_data->options()->track_heap_objects) { |
790 |
| - isolate->GetHeapProfiler()->StartTrackingHeapObjects(true); |
791 |
| - } |
792 |
| - |
793 |
| - Local<Context> context = NewContext(isolate); |
794 |
| - Context::Scope context_scope(context); |
795 |
| - |
796 |
| - std::unique_ptr<Environment> env = std::make_unique<Environment>( |
797 |
| - isolate_data, |
798 |
| - context, |
799 |
| - static_cast<Environment::Flags>(Environment::kIsMainThread | |
800 |
| - Environment::kOwnsProcessState | |
801 |
| - Environment::kOwnsInspector)); |
802 |
| - env->InitializeLibuv(per_process::v8_is_profiling); |
803 |
| - env->ProcessCliArgs(args, exec_args); |
804 |
| - |
805 |
| -#if HAVE_INSPECTOR && NODE_USE_V8_PLATFORM |
806 |
| - CHECK(!env->inspector_agent()->IsListening()); |
807 |
| - // Inspector agent can't fail to start, but if it was configured to listen |
808 |
| - // right away on the websocket port and fails to bind/etc, this will return |
809 |
| - // false. |
810 |
| - env->inspector_agent()->Start(args.size() > 1 ? args[1].c_str() : "", |
811 |
| - env->options()->debug_options(), |
812 |
| - env->inspector_host_port(), |
813 |
| - true); |
814 |
| - if (env->options()->debug_options().inspector_enabled && |
815 |
| - !env->inspector_agent()->IsListening()) { |
816 |
| - *exit_code = 12; // Signal internal error. |
817 |
| - return env; |
818 |
| - } |
819 |
| -#else |
820 |
| - // inspector_enabled can't be true if !HAVE_INSPECTOR or !NODE_USE_V8_PLATFORM |
821 |
| - // - the option parser should not allow that. |
822 |
| - CHECK(!env->options()->debug_options().inspector_enabled); |
823 |
| -#endif // HAVE_INSPECTOR && NODE_USE_V8_PLATFORM |
824 |
| - |
825 |
| - if (RunBootstrapping(env.get()).IsEmpty()) { |
826 |
| - *exit_code = 1; |
827 |
| - } |
828 |
| - |
829 |
| - return env; |
830 |
| -} |
831 |
| - |
832 |
| -inline int StartNodeWithIsolate(Isolate* isolate, |
833 |
| - IsolateData* isolate_data, |
834 |
| - const std::vector<std::string>& args, |
835 |
| - const std::vector<std::string>& exec_args) { |
836 |
| - int exit_code = 0; |
837 |
| - std::unique_ptr<Environment> env = |
838 |
| - CreateMainEnvironment(isolate_data, args, exec_args, &exit_code); |
839 |
| - CHECK_NOT_NULL(env); |
840 |
| - HandleScope handle_scope(env->isolate()); |
841 |
| - Context::Scope context_scope(env->context()); |
842 |
| - |
843 |
| - if (exit_code == 0) { |
844 |
| - { |
845 |
| - AsyncCallbackScope callback_scope(env.get()); |
846 |
| - env->async_hooks()->push_async_ids(1, 0); |
847 |
| - LoadEnvironment(env.get()); |
848 |
| - env->async_hooks()->pop_async_id(1); |
849 |
| - } |
850 |
| - |
851 |
| - { |
852 |
| - SealHandleScope seal(isolate); |
853 |
| - bool more; |
854 |
| - env->performance_state()->Mark( |
855 |
| - node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_START); |
856 |
| - do { |
857 |
| - uv_run(env->event_loop(), UV_RUN_DEFAULT); |
858 |
| - |
859 |
| - per_process::v8_platform.DrainVMTasks(isolate); |
860 |
| - |
861 |
| - more = uv_loop_alive(env->event_loop()); |
862 |
| - if (more && !env->is_stopping()) continue; |
863 |
| - |
864 |
| - RunBeforeExit(env.get()); |
865 |
| - |
866 |
| - // Emit `beforeExit` if the loop became alive either after emitting |
867 |
| - // event, or after running some callbacks. |
868 |
| - more = uv_loop_alive(env->event_loop()); |
869 |
| - } while (more == true && !env->is_stopping()); |
870 |
| - env->performance_state()->Mark( |
871 |
| - node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_EXIT); |
872 |
| - } |
873 |
| - |
874 |
| - env->set_trace_sync_io(false); |
875 |
| - exit_code = EmitExit(env.get()); |
876 |
| - WaitForInspectorDisconnect(env.get()); |
877 |
| - } |
878 |
| - |
879 |
| - env->set_can_call_into_js(false); |
880 |
| - env->stop_sub_worker_contexts(); |
881 |
| - uv_tty_reset_mode(); |
882 |
| - env->RunCleanup(); |
883 |
| - RunAtExit(env.get()); |
884 |
| - |
885 |
| - per_process::v8_platform.DrainVMTasks(isolate); |
886 |
| - per_process::v8_platform.CancelVMTasks(isolate); |
887 |
| - |
888 |
| -#if defined(LEAK_SANITIZER) |
889 |
| - __lsan_do_leak_check(); |
890 |
| -#endif |
891 |
| - |
892 |
| - return exit_code; |
893 |
| -} |
894 |
| - |
895 |
| -inline int StartNodeWithLoopAndArgs(uv_loop_t* event_loop, |
896 |
| - const std::vector<std::string>& args, |
897 |
| - const std::vector<std::string>& exec_args) { |
898 |
| - std::unique_ptr<ArrayBufferAllocator, decltype(&FreeArrayBufferAllocator)> |
899 |
| - allocator(CreateArrayBufferAllocator(), &FreeArrayBufferAllocator); |
900 |
| - Isolate* const isolate = NewIsolate(allocator.get(), event_loop); |
901 |
| - if (isolate == nullptr) |
902 |
| - return 12; // Signal internal error. |
903 |
| - |
904 |
| - int exit_code; |
905 |
| - { |
906 |
| - Locker locker(isolate); |
907 |
| - Isolate::Scope isolate_scope(isolate); |
908 |
| - HandleScope handle_scope(isolate); |
909 |
| - std::unique_ptr<IsolateData, decltype(&FreeIsolateData)> isolate_data( |
910 |
| - CreateIsolateData(isolate, |
911 |
| - event_loop, |
912 |
| - per_process::v8_platform.Platform(), |
913 |
| - allocator.get()), |
914 |
| - &FreeIsolateData); |
915 |
| - exit_code = |
916 |
| - StartNodeWithIsolate(isolate, isolate_data.get(), args, exec_args); |
917 |
| - } |
918 |
| - |
919 |
| - isolate->Dispose(); |
920 |
| - per_process::v8_platform.Platform()->UnregisterIsolate(isolate); |
921 |
| - |
922 |
| - return exit_code; |
923 |
| -} |
924 |
| - |
925 | 755 | int Start(int argc, char** argv) {
|
926 | 756 | atexit([] () { uv_tty_reset_mode(); });
|
927 | 757 | PlatformInit();
|
@@ -981,8 +811,13 @@ int Start(int argc, char** argv) {
|
981 | 811 | V8::Initialize();
|
982 | 812 | performance::performance_v8_start = PERFORMANCE_NOW();
|
983 | 813 | per_process::v8_initialized = true;
|
984 |
| - const int exit_code = |
985 |
| - StartNodeWithLoopAndArgs(uv_default_loop(), args, exec_args); |
| 814 | + |
| 815 | + int exit_code = 0; |
| 816 | + { |
| 817 | + NodeMainInstance main_instance(uv_default_loop(), args, exec_args); |
| 818 | + exit_code = main_instance.Run(); |
| 819 | + } |
| 820 | + |
986 | 821 | per_process::v8_initialized = false;
|
987 | 822 | V8::Dispose();
|
988 | 823 |
|
|
0 commit comments