@@ -3341,11 +3341,6 @@ void SetupProcessObject(Environment* env,
33413341#undef  READONLY_PROPERTY
33423342
33433343
3344- static  void  AtProcessExit () {
3345-   uv_tty_reset_mode ();
3346- }
3347- 
3348- 
33493344void  SignalExit (int  signo) {
33503345  uv_tty_reset_mode ();
33513346#ifdef  __FreeBSD__
@@ -3375,11 +3370,6 @@ static void RawDebug(const FunctionCallbackInfo<Value>& args) {
33753370void  LoadEnvironment (Environment* env) {
33763371  HandleScope handle_scope (env->isolate ());
33773372
3378-   env->isolate ()->SetFatalErrorHandler (node::OnFatalError);
3379-   env->isolate ()->AddMessageListener (OnMessage);
3380- 
3381-   atexit (AtProcessExit);
3382- 
33833373  TryCatch try_catch (env->isolate ());
33843374
33853375  //  Disable verbose mode to stop FatalException() handler from trying
@@ -4369,107 +4359,118 @@ void FreeEnvironment(Environment* env) {
43694359}
43704360
43714361
4362+ inline  int  Start (Isolate* isolate, IsolateData* isolate_data,
4363+                  int  argc, const  char * const * argv,
4364+                  int  exec_argc, const  char * const * exec_argv) {
4365+   HandleScope handle_scope (isolate);
4366+   Local<Context> context = Context::New (isolate);
4367+   Context::Scope context_scope (context);
4368+   Environment env (isolate_data, context);
4369+   env.Start (argc, argv, exec_argc, exec_argv, v8_is_profiling);
4370+ 
4371+   //  Start debug agent when argv has --debug
4372+   if  (use_debug_agent) {
4373+     const  char * path = argc > 1  ? argv[1 ] : nullptr ;
4374+     StartDebug (&env, path, debug_wait_connect);
4375+     if  (use_inspector && !debugger_running)
4376+       return  12 ;  //  Signal internal error.
4377+   }
4378+ 
4379+   {
4380+     Environment::AsyncCallbackScope callback_scope (&env);
4381+     LoadEnvironment (&env);
4382+   }
4383+ 
4384+   env.set_trace_sync_io (trace_sync_io);
4385+ 
4386+   //  Enable debugger
4387+   if  (use_debug_agent)
4388+     EnableDebug (&env);
4389+ 
4390+   {
4391+     SealHandleScope seal (isolate);
4392+     bool  more;
4393+     do  {
4394+       v8_platform.PumpMessageLoop (isolate);
4395+       more = uv_run (env.event_loop (), UV_RUN_ONCE);
4396+ 
4397+       if  (more == false ) {
4398+         v8_platform.PumpMessageLoop (isolate);
4399+         EmitBeforeExit (&env);
4400+ 
4401+         //  Emit `beforeExit` if the loop became alive either after emitting
4402+         //  event, or after running some callbacks.
4403+         more = uv_loop_alive (env.event_loop ());
4404+         if  (uv_run (env.event_loop (), UV_RUN_NOWAIT) != 0 )
4405+           more = true ;
4406+       }
4407+     } while  (more == true );
4408+   }
4409+ 
4410+   env.set_trace_sync_io (false );
4411+ 
4412+   const  int  exit_code = EmitExit (&env);
4413+   RunAtExit (&env);
4414+ 
4415+   WaitForInspectorDisconnect (&env);
4416+ #if  defined(LEAK_SANITIZER)
4417+   __lsan_do_leak_check ();
4418+ #endif 
4419+ 
4420+   return  exit_code;
4421+ }
4422+ 
43724423inline  int  Start (uv_loop_t * event_loop,
43734424                 int  argc, const  char * const * argv,
43744425                 int  exec_argc, const  char * const * exec_argv) {
43754426  Isolate::CreateParams params;
4376-   ArrayBufferAllocator array_buffer_allocator ;
4377-   params.array_buffer_allocator  = &array_buffer_allocator ;
4427+   ArrayBufferAllocator allocator ;
4428+   params.array_buffer_allocator  = &allocator ;
43784429#ifdef  NODE_ENABLE_VTUNE_PROFILING
43794430  params.code_event_handler  = vTune::GetVtuneCodeEventHandler ();
43804431#endif 
4381-   Isolate* isolate = Isolate::New (params);
4432+ 
4433+   Isolate* const  isolate = Isolate::New (params);
4434+   if  (isolate == nullptr )
4435+     return  12 ;  //  Signal internal error.
4436+ 
4437+   isolate->AddMessageListener (OnMessage);
4438+   isolate->SetAbortOnUncaughtExceptionCallback (ShouldAbortOnUncaughtException);
4439+   isolate->SetAutorunMicrotasks (false );
4440+   isolate->SetFatalErrorHandler (OnFatalError);
4441+ 
4442+   if  (track_heap_objects) {
4443+     isolate->GetHeapProfiler ()->StartTrackingHeapObjects (true );
4444+   }
43824445
43834446  {
43844447    Mutex::ScopedLock scoped_lock (node_isolate_mutex);
43854448    CHECK_EQ (node_isolate, nullptr );
43864449    node_isolate = isolate;
43874450  }
43884451
4389-   if  (track_heap_objects) {
4390-     isolate->GetHeapProfiler ()->StartTrackingHeapObjects (true );
4391-   }
4392- 
43934452  int  exit_code;
43944453  {
43954454    Locker locker (isolate);
43964455    Isolate::Scope isolate_scope (isolate);
43974456    HandleScope handle_scope (isolate);
4398-     IsolateData isolate_data (isolate, event_loop,
4399-                              array_buffer_allocator.zero_fill_field ());
4400-     Local<Context> context = Context::New (isolate);
4401-     Context::Scope context_scope (context);
4402-     Environment env (&isolate_data, context);
4403-     env.Start (argc, argv, exec_argc, exec_argv, v8_is_profiling);
4404- 
4405-     isolate->SetAbortOnUncaughtExceptionCallback (
4406-         ShouldAbortOnUncaughtException);
4407- 
4408-     //  Start debug agent when argv has --debug
4409-     if  (use_debug_agent) {
4410-       const  char * path = argc > 1  ? argv[1 ] : nullptr ;
4411-       StartDebug (&env, path, debug_wait_connect);
4412-       if  (use_inspector && !debugger_running) {
4413-         exit (12 );
4414-       }
4415-     }
4416- 
4417-     {
4418-       Environment::AsyncCallbackScope callback_scope (&env);
4419-       LoadEnvironment (&env);
4420-     }
4421- 
4422-     env.set_trace_sync_io (trace_sync_io);
4423- 
4424-     //  Enable debugger
4425-     if  (use_debug_agent)
4426-       EnableDebug (&env);
4427- 
4428-     {
4429-       SealHandleScope seal (isolate);
4430-       bool  more;
4431-       do  {
4432-         v8_platform.PumpMessageLoop (isolate);
4433-         more = uv_run (env.event_loop (), UV_RUN_ONCE);
4434- 
4435-         if  (more == false ) {
4436-           v8_platform.PumpMessageLoop (isolate);
4437-           EmitBeforeExit (&env);
4438- 
4439-           //  Emit `beforeExit` if the loop became alive either after emitting
4440-           //  event, or after running some callbacks.
4441-           more = uv_loop_alive (env.event_loop ());
4442-           if  (uv_run (env.event_loop (), UV_RUN_NOWAIT) != 0 )
4443-             more = true ;
4444-         }
4445-       } while  (more == true );
4446-     }
4447- 
4448-     env.set_trace_sync_io (false );
4449- 
4450-     exit_code = EmitExit (&env);
4451-     RunAtExit (&env);
4452- 
4453-     WaitForInspectorDisconnect (&env);
4454- #if  defined(LEAK_SANITIZER)
4455-     __lsan_do_leak_check ();
4456- #endif 
4457+     IsolateData isolate_data (isolate, event_loop, allocator.zero_fill_field ());
4458+     exit_code = Start (isolate, &isolate_data, argc, argv, exec_argc, exec_argv);
44574459  }
44584460
44594461  {
44604462    Mutex::ScopedLock scoped_lock (node_isolate_mutex);
4461-     if   (node_isolate ==  isolate)
4462-        node_isolate = nullptr ;
4463+     CHECK_EQ (node_isolate,  isolate); 
4464+     node_isolate = nullptr ;
44634465  }
44644466
4465-   CHECK_NE (isolate, nullptr );
44664467  isolate->Dispose ();
4467-   isolate = nullptr ;
44684468
44694469  return  exit_code;
44704470}
44714471
44724472int  Start (int  argc, char ** argv) {
4473+   atexit ([] () { uv_tty_reset_mode (); });
44734474  PlatformInit ();
44744475
44754476  CHECK_GT (argc, 0 );
0 commit comments