@@ -98,6 +98,8 @@ using v8::Message;
98
98
using v8::Number;
99
99
using v8::Object;
100
100
using v8::ObjectTemplate;
101
+ using v8::Promise;
102
+ using v8::PromiseRejectMessage;
101
103
using v8::PropertyCallbackInfo;
102
104
using v8::String;
103
105
using v8::TryCatch;
@@ -982,6 +984,37 @@ void SetupNextTick(const FunctionCallbackInfo<Value>& args) {
982
984
FIXED_ONE_BYTE_STRING (args.GetIsolate (), " _setupNextTick" ));
983
985
}
984
986
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
+
985
1018
986
1019
Handle <Value> MakeCallback (Environment* env,
987
1020
Handle <Value> recv,
@@ -2572,6 +2605,14 @@ void StopProfilerIdleNotifier(const FunctionCallbackInfo<Value>& args) {
2572
2605
obj->ForceSet (OneByteString (env->isolate (), str), var, v8::ReadOnly); \
2573
2606
} while (0 )
2574
2607
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
+
2575
2616
2576
2617
void SetupProcessObject (Environment* env,
2577
2618
int argc,
@@ -2632,6 +2673,20 @@ void SetupProcessObject(Environment* env,
2632
2673
" modules" ,
2633
2674
FIXED_ONE_BYTE_STRING (env->isolate (), node_modules_version));
2634
2675
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
+
2635
2690
#if HAVE_OPENSSL
2636
2691
// Stupid code to slice out the version string.
2637
2692
{ // NOLINT(whitespace/braces)
@@ -2790,6 +2845,7 @@ void SetupProcessObject(Environment* env,
2790
2845
env->SetMethod (process, " _linkedBinding" , LinkedBinding);
2791
2846
2792
2847
env->SetMethod (process, " _setupNextTick" , SetupNextTick);
2848
+ env->SetMethod (process, " _setupPromises" , SetupPromises);
2793
2849
env->SetMethod (process, " _setupDomainUse" , SetupDomainUse);
2794
2850
2795
2851
// pre-set _events object for faster emit checks
0 commit comments