@@ -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;
@@ -67,34 +72,40 @@ void PromiseRejectCallback(PromiseRejectMessage message) {
6772 PromiseRejectEvent event = message.GetEvent ();
6873
6974 Environment* env = Environment::GetCurrent (isolate);
75+
7076 if (env == nullptr ) return ;
71- Local<Function> callback;
77+
78+ Local<Function> callback = env->promise_handler_function ();
7279 Local<Value> value;
80+ Local<Value> type = Number::New (env->isolate (), event);
7381
74- if (event == v8::kPromiseRejectWithNoHandler ) {
75- callback = env->promise_reject_unhandled_function ();
82+ if (event == kPromiseRejectWithNoHandler ) {
7683 value = message.GetValue ();
77-
78- if (value.IsEmpty ())
79- value = Undefined (isolate);
80-
8184 unhandledRejections++;
82- } else if (event == v8::kPromiseHandlerAddedAfterReject ) {
83- callback = env->promise_reject_handled_function ();
85+ TRACE_COUNTER2 (TRACING_CATEGORY_NODE2 (promises, rejections),
86+ " rejections" ,
87+ " unhandled" , unhandledRejections,
88+ " handledAfter" , rejectionsHandledAfter);
89+ } else if (event == kPromiseHandlerAddedAfterReject ) {
8490 value = Undefined (isolate);
85-
8691 rejectionsHandledAfter++;
92+ TRACE_COUNTER2 (TRACING_CATEGORY_NODE2 (promises, rejections),
93+ " rejections" ,
94+ " unhandled" , unhandledRejections,
95+ " handledAfter" , rejectionsHandledAfter);
96+ } else if (event == kPromiseResolveAfterResolved ) {
97+ value = message.GetValue ();
98+ } else if (event == kPromiseRejectAfterResolved ) {
99+ value = message.GetValue ();
87100 } else {
88101 return ;
89102 }
90103
91- TRACE_COUNTER2 (TRACING_CATEGORY_NODE2 (promises, rejections),
92- " rejections" ,
93- " unhandled" , unhandledRejections,
94- " handledAfter" , rejectionsHandledAfter);
95-
104+ if (value.IsEmpty ()) {
105+ value = Undefined (isolate);
106+ }
96107
97- Local<Value> args[] = { promise, value };
108+ Local<Value> args[] = { type, promise, value };
98109 MaybeLocal<Value> ret = callback->Call (env->context (),
99110 Undefined (isolate),
100111 arraysize (args),
@@ -109,11 +120,17 @@ void SetupPromises(const FunctionCallbackInfo<Value>& args) {
109120 Isolate* isolate = env->isolate ();
110121
111122 CHECK (args[0 ]->IsFunction ());
112- CHECK (args[1 ]->IsFunction ());
123+ CHECK (args[1 ]->IsObject ());
124+
125+ Local<Object> constants = args[1 ].As <Object>();
126+
127+ NODE_DEFINE_CONSTANT (constants, kPromiseRejectWithNoHandler );
128+ NODE_DEFINE_CONSTANT (constants, kPromiseHandlerAddedAfterReject );
129+ NODE_DEFINE_CONSTANT (constants, kPromiseResolveAfterResolved );
130+ NODE_DEFINE_CONSTANT (constants, kPromiseRejectAfterResolved );
113131
114132 isolate->SetPromiseRejectCallback (PromiseRejectCallback);
115- env->set_promise_reject_unhandled_function (args[0 ].As <Function>());
116- env->set_promise_reject_handled_function (args[1 ].As <Function>());
133+ env->set_promise_handler_function (args[0 ].As <Function>());
117134}
118135
119136#define BOOTSTRAP_METHOD (name, fn ) env->SetMethod (bootstrapper, #name, fn)
0 commit comments