@@ -36,18 +36,14 @@ Maybe<bool> EmitProcessBeforeExit(Environment* env) {
3636 if (!env->destroy_async_id_list ()->empty ())
3737 AsyncWrap::DestroyAsyncIdsCallback (env);
3838
39- HandleScope handle_scope (env->isolate ());
39+ Isolate* isolate = env->isolate ();
40+ HandleScope handle_scope (isolate);
4041 Local<Context> context = env->context ();
4142 Context::Scope context_scope (context);
4243
43- Local<Value> exit_code_v;
44- if (!env->process_object ()->Get (context, env->exit_code_string ())
45- .ToLocal (&exit_code_v)) return Nothing<bool >();
46-
47- Local<Integer> exit_code;
48- if (!exit_code_v->ToInteger (context).ToLocal (&exit_code)) {
49- return Nothing<bool >();
50- }
44+ Local<Integer> exit_code = v8::Integer::New (
45+ isolate,
46+ env->exit_code ().value_or (static_cast <int32_t >(ExitCode::kNoFailure )));
5147
5248 return ProcessEmit (env, " beforeExit" , exit_code).IsEmpty () ?
5349 Nothing<bool >() : Just (true );
@@ -67,27 +63,19 @@ Maybe<ExitCode> EmitProcessExitInternal(Environment* env) {
6763 HandleScope handle_scope (isolate);
6864 Local<Context> context = env->context ();
6965 Context::Scope context_scope (context);
70- Local<Object> process_object = env->process_object ();
7166
72- // TODO(addaleax): It might be nice to share process.exitCode via
73- // getter/setter pairs that pass data directly to the native side, so that we
74- // don't manually have to read and write JS properties here. These getters
75- // could use e.g. a typed array for performance.
7667 env->set_exiting (true );
7768
78- Local<String> exit_code = env->exit_code_string ();
79- Local<Value> code_v;
80- int code;
81- if (!process_object->Get (context, exit_code).ToLocal (&code_v) ||
82- !code_v->Int32Value (context).To (&code) ||
83- ProcessEmit (env, " exit" , Integer::New (isolate, code)).IsEmpty () ||
84- // Reload exit code, it may be changed by `emit('exit')`
85- !process_object->Get (context, exit_code).ToLocal (&code_v) ||
86- !code_v->Int32Value (context).To (&code)) {
69+ const std::optional<int32_t >& exit_code = env->exit_code ();
70+ const int no_failure = static_cast <int32_t >(ExitCode::kNoFailure );
71+
72+ if (ProcessEmit (
73+ env, " exit" , Integer::New (isolate, exit_code.value_or (no_failure)))
74+ .IsEmpty ()) {
8775 return Nothing<ExitCode>();
8876 }
89-
90- return Just (static_cast <ExitCode>(code ));
77+ // Reload exit code, it may be changed by `emit('exit')`
78+ return Just (static_cast <ExitCode>(exit_code. value_or (no_failure) ));
9179}
9280
9381Maybe<int > EmitProcessExit (Environment* env) {
0 commit comments