@@ -12,8 +12,13 @@ using v8::Context;
1212using v8::Function;
1313using v8::FunctionCallbackInfo;
1414using v8::Isolate;
15+ using v8::kPromiseHandlerAddedAfterReject ;
16+ using v8::kPromiseRejectAfterResolved ;
17+ using v8::kPromiseRejectWithNoHandler ;
18+ using v8::kPromiseResolveAfterResolved ;
1519using v8::Local;
1620using v8::MaybeLocal;
21+ using v8::Number;
1722using v8::Object;
1823using v8::Promise;
1924using v8::PromiseRejectEvent;
@@ -61,34 +66,40 @@ void PromiseRejectCallback(PromiseRejectMessage message) {
6166 PromiseRejectEvent event = message.GetEvent ();
6267
6368 Environment* env = Environment::GetCurrent (isolate);
69+
6470 if (env == nullptr ) return ;
65- Local<Function> callback;
71+
72+ Local<Function> callback = env->promise_handler_function ();
6673 Local<Value> value;
74+ Local<Value> type = Number::New (env->isolate (), event);
6775
68- if (event == v8::kPromiseRejectWithNoHandler ) {
69- callback = env->promise_reject_unhandled_function ();
76+ if (event == kPromiseRejectWithNoHandler ) {
7077 value = message.GetValue ();
71-
72- if (value.IsEmpty ())
73- value = Undefined (isolate);
74-
7578 unhandledRejections++;
76- } else if (event == v8::kPromiseHandlerAddedAfterReject ) {
77- callback = env->promise_reject_handled_function ();
79+ TRACE_COUNTER2 (TRACING_CATEGORY_NODE2 (promises, rejections),
80+ " rejections" ,
81+ " unhandled" , unhandledRejections,
82+ " handledAfter" , rejectionsHandledAfter);
83+ } else if (event == kPromiseHandlerAddedAfterReject ) {
7884 value = Undefined (isolate);
79-
8085 rejectionsHandledAfter++;
86+ TRACE_COUNTER2 (TRACING_CATEGORY_NODE2 (promises, rejections),
87+ " rejections" ,
88+ " unhandled" , unhandledRejections,
89+ " handledAfter" , rejectionsHandledAfter);
90+ } else if (event == kPromiseResolveAfterResolved ) {
91+ value = message.GetValue ();
92+ } else if (event == kPromiseRejectAfterResolved ) {
93+ value = message.GetValue ();
8194 } else {
8295 return ;
8396 }
8497
85- TRACE_COUNTER2 (TRACING_CATEGORY_NODE2 (promises, rejections),
86- " rejections" ,
87- " unhandled" , unhandledRejections,
88- " handledAfter" , rejectionsHandledAfter);
89-
98+ if (value.IsEmpty ()) {
99+ value = Undefined (isolate);
100+ }
90101
91- Local<Value> args[] = { promise, value };
102+ Local<Value> args[] = { type, promise, value };
92103 MaybeLocal<Value> ret = callback->Call (env->context (),
93104 Undefined (isolate),
94105 arraysize (args),
@@ -103,11 +114,17 @@ void SetupPromises(const FunctionCallbackInfo<Value>& args) {
103114 Isolate* isolate = env->isolate ();
104115
105116 CHECK (args[0 ]->IsFunction ());
106- CHECK (args[1 ]->IsFunction ());
117+ CHECK (args[1 ]->IsObject ());
118+
119+ Local<Object> constants = args[1 ].As <Object>();
120+
121+ NODE_DEFINE_CONSTANT (constants, kPromiseRejectWithNoHandler );
122+ NODE_DEFINE_CONSTANT (constants, kPromiseHandlerAddedAfterReject );
123+ NODE_DEFINE_CONSTANT (constants, kPromiseResolveAfterResolved );
124+ NODE_DEFINE_CONSTANT (constants, kPromiseRejectAfterResolved );
107125
108126 isolate->SetPromiseRejectCallback (PromiseRejectCallback);
109- env->set_promise_reject_unhandled_function (args[0 ].As <Function>());
110- env->set_promise_reject_handled_function (args[1 ].As <Function>());
127+ env->set_promise_handler_function (args[0 ].As <Function>());
111128}
112129
113130#define BOOTSTRAP_METHOD (name, fn ) env->SetMethod (bootstrapper, #name, fn)
0 commit comments