@@ -98,6 +98,8 @@ using v8::Message;
9898using v8::Number;
9999using v8::Object;
100100using v8::ObjectTemplate;
101+ using v8::Promise;
102+ using v8::PromiseRejectMessage;
101103using v8::PropertyCallbackInfo;
102104using v8::String;
103105using v8::TryCatch;
@@ -982,6 +984,37 @@ void SetupNextTick(const FunctionCallbackInfo<Value>& args) {
982984 FIXED_ONE_BYTE_STRING (args.GetIsolate (), " _setupNextTick" ));
983985}
984986
987+ void PromiseRejectCallback (PromiseRejectMessage message) {
988+ Local<Promise> promise = message.GetPromise ();
989+ Isolate* isolate = promise->GetIsolate ();
990+ Local<Value> value = message.GetValue ();
991+ Local<Integer> event = Integer::New (isolate, message.GetEvent ());
992+
993+ Environment* env = Environment::GetCurrent (isolate);
994+ Local<Function> callback = env->promise_reject_function ();
995+
996+ if (value.IsEmpty ())
997+ value = Undefined (isolate);
998+
999+ Local<Value> args[] = { event, promise, value };
1000+ Local<Object> process = env->process_object ();
1001+
1002+ callback->Call (process, ARRAY_SIZE (args), args);
1003+ }
1004+
1005+ void SetupPromises (const FunctionCallbackInfo<Value>& args) {
1006+ Environment* env = Environment::GetCurrent (args);
1007+ Isolate* isolate = env->isolate ();
1008+
1009+ CHECK (args[0 ]->IsFunction ());
1010+
1011+ isolate->SetPromiseRejectCallback (PromiseRejectCallback);
1012+ env->set_promise_reject_function (args[0 ].As <Function>());
1013+
1014+ env->process_object ()->Delete (
1015+ FIXED_ONE_BYTE_STRING (args.GetIsolate (), " _setupPromises" ));
1016+ }
1017+
9851018
9861019Handle<Value> MakeCallback (Environment* env,
9871020 Handle<Value> recv,
@@ -2572,6 +2605,14 @@ void StopProfilerIdleNotifier(const FunctionCallbackInfo<Value>& args) {
25722605 obj->ForceSet (OneByteString (env->isolate (), str), var, v8::ReadOnly); \
25732606 } while (0 )
25742607
2608+ #define READONLY_DONT_ENUM_PROPERTY (obj, str, var ) \
2609+ do { \
2610+ obj->ForceSet (OneByteString (env->isolate (), str), \
2611+ var, \
2612+ static_cast <v8::PropertyAttribute>(v8::ReadOnly | \
2613+ v8::DontEnum)); \
2614+ } while (0 )
2615+
25752616
25762617void SetupProcessObject (Environment* env,
25772618 int argc,
@@ -2632,6 +2673,20 @@ void SetupProcessObject(Environment* env,
26322673 " modules" ,
26332674 FIXED_ONE_BYTE_STRING (env->isolate (), node_modules_version));
26342675
2676+ // process._promiseRejectEvent
2677+ Local<Object> promiseRejectEvent = Object::New (env->isolate ());
2678+ READONLY_DONT_ENUM_PROPERTY (process,
2679+ " _promiseRejectEvent" ,
2680+ promiseRejectEvent);
2681+ READONLY_PROPERTY (promiseRejectEvent,
2682+ " unhandled" ,
2683+ Integer::New (env->isolate (),
2684+ v8::kPromiseRejectWithNoHandler ));
2685+ READONLY_PROPERTY (promiseRejectEvent,
2686+ " handled" ,
2687+ Integer::New (env->isolate (),
2688+ v8::kPromiseHandlerAddedAfterReject ));
2689+
26352690#if HAVE_OPENSSL
26362691 // Stupid code to slice out the version string.
26372692 { // NOLINT(whitespace/braces)
@@ -2790,6 +2845,7 @@ void SetupProcessObject(Environment* env,
27902845 env->SetMethod (process, " _linkedBinding" , LinkedBinding);
27912846
27922847 env->SetMethod (process, " _setupNextTick" , SetupNextTick);
2848+ env->SetMethod (process, " _setupPromises" , SetupPromises);
27932849 env->SetMethod (process, " _setupDomainUse" , SetupDomainUse);
27942850
27952851 // pre-set _events object for faster emit checks
0 commit comments