@@ -12,8 +12,13 @@ using v8::Context;
12
12
using v8::Function;
13
13
using v8::FunctionCallbackInfo;
14
14
using v8::Isolate;
15
+ using v8::kPromiseHandlerAddedAfterReject ;
16
+ using v8::kPromiseRejectAfterResolved ;
17
+ using v8::kPromiseRejectWithNoHandler ;
18
+ using v8::kPromiseResolveAfterResolved ;
15
19
using v8::Local;
16
20
using v8::MaybeLocal;
21
+ using v8::Number;
17
22
using v8::Object;
18
23
using v8::Promise;
19
24
using v8::PromiseRejectEvent;
@@ -61,34 +66,40 @@ void PromiseRejectCallback(PromiseRejectMessage message) {
61
66
PromiseRejectEvent event = message.GetEvent ();
62
67
63
68
Environment* env = Environment::GetCurrent (isolate);
69
+
64
70
if (env == nullptr ) return ;
65
- Local<Function> callback;
71
+
72
+ Local<Function> callback = env->promise_handler_function ();
66
73
Local<Value> value;
74
+ Local<Value> type = Number::New (env->isolate (), event);
67
75
68
- if (event == v8::kPromiseRejectWithNoHandler ) {
69
- callback = env->promise_reject_unhandled_function ();
76
+ if (event == kPromiseRejectWithNoHandler ) {
70
77
value = message.GetValue ();
71
-
72
- if (value.IsEmpty ())
73
- value = Undefined (isolate);
74
-
75
78
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 ) {
78
84
value = Undefined (isolate);
79
-
80
85
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 ();
81
94
} else {
82
95
return ;
83
96
}
84
97
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
+ }
90
101
91
- Local<Value> args[] = { promise, value };
102
+ Local<Value> args[] = { type, promise, value };
92
103
MaybeLocal<Value> ret = callback->Call (env->context (),
93
104
Undefined (isolate),
94
105
arraysize (args),
@@ -103,11 +114,17 @@ void SetupPromises(const FunctionCallbackInfo<Value>& args) {
103
114
Isolate* isolate = env->isolate ();
104
115
105
116
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 );
107
125
108
126
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>());
111
128
}
112
129
113
130
#define BOOTSTRAP_METHOD (name, fn ) env->SetMethod (bootstrapper, #name, fn)
0 commit comments