@@ -176,6 +176,10 @@ void AsyncWrap::EmitAfter(Environment* env, double async_id) {
176176
177177class PromiseWrap : public AsyncWrap {
178178 public:
179+ enum InternalFields {
180+ kIsChainedPromiseField = AsyncWrap::kInternalFieldCount ,
181+ kInternalFieldCount
182+ };
179183 PromiseWrap (Environment* env, Local<Object> object, bool silent)
180184 : AsyncWrap(env, object, PROVIDER_PROMISE, kInvalidAsyncId , silent) {
181185 MakeWeak ();
@@ -185,9 +189,6 @@ class PromiseWrap : public AsyncWrap {
185189 SET_MEMORY_INFO_NAME (PromiseWrap)
186190 SET_SELF_SIZE (PromiseWrap)
187191
188- static constexpr int kIsChainedPromiseField = 1 ;
189- static constexpr int kInternalFieldCount = 2 ;
190-
191192 static PromiseWrap* New (Environment* env,
192193 Local<Promise> promise,
193194 PromiseWrap* parent_wrap,
@@ -214,15 +215,16 @@ PromiseWrap* PromiseWrap::New(Environment* env,
214215void PromiseWrap::getIsChainedPromise (Local<String> property,
215216 const PropertyCallbackInfo<Value>& info) {
216217 info.GetReturnValue ().Set (
217- info.Holder ()->GetInternalField (kIsChainedPromiseField ));
218+ info.Holder ()->GetInternalField (PromiseWrap:: kIsChainedPromiseField ));
218219}
219220
220221static PromiseWrap* extractPromiseWrap (Local<Promise> promise) {
221- Local<Value> resource_object_value = promise->GetInternalField (0 );
222- if (resource_object_value->IsObject ()) {
223- return Unwrap<PromiseWrap>(resource_object_value.As <Object>());
224- }
225- return nullptr ;
222+ // This check is imperfect. If the internal field is set, it should
223+ // be an object. If it's not, we just ignore it. Ideally v8 would
224+ // have had GetInternalField returning a MaybeLocal but this works
225+ // for now.
226+ Local<Value> obj = promise->GetInternalField (0 );
227+ return obj->IsObject () ? Unwrap<PromiseWrap>(obj.As <Object>()) : nullptr ;
226228}
227229
228230static void PromiseHook (PromiseHookType type, Local<Promise> promise,
@@ -560,7 +562,7 @@ void AsyncWrap::Initialize(Local<Object> target,
560562 function_template->SetClassName (class_name);
561563 function_template->Inherit (AsyncWrap::GetConstructorTemplate (env));
562564 auto instance_template = function_template->InstanceTemplate ();
563- instance_template->SetInternalFieldCount (1 );
565+ instance_template->SetInternalFieldCount (AsyncWrap:: kInternalFieldCount );
564566 auto function =
565567 function_template->GetFunction (env->context ()).ToLocalChecked ();
566568 target->Set (env->context (), class_name, function).Check ();
0 commit comments