Skip to content

Commit 3e8ba52

Browse files
committed
fixup! fs: fix FileHandle::ClosePromise to return persisted Promise
1 parent 489b6c5 commit 3e8ba52

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/node_file.cc

+7-4
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,12 @@ MaybeLocal<Promise> FileHandle::ClosePromise() {
346346
EscapableHandleScope scope(isolate);
347347
Local<Context> context = env()->context();
348348

349-
Local<Promise::Resolver> close_resolver = close_promise_.Get(isolate);
350-
if (!close_resolver.IsEmpty())
349+
Local<Value> close_resolver =
350+
object()->GetInternalField(FileHandle::kClosingPromiseSlot);
351+
if (!close_resolver.IsEmpty() && !close_resolver->IsUndefined()) {
352+
CHECK(close_resolver->IsPromise());
351353
return close_resolver.As<Promise>();
354+
}
352355

353356
CHECK(!closed_);
354357
CHECK(!closing_);
@@ -365,7 +368,7 @@ MaybeLocal<Promise> FileHandle::ClosePromise() {
365368
return MaybeLocal<Promise>();
366369
}
367370
closing_ = true;
368-
close_promise_.Reset(isolate, resolver);
371+
object()->SetInternalField(FileHandle::kClosingPromiseSlot, promise);
369372

370373
CloseReq* req = new CloseReq(env(), close_req_obj, promise, object());
371374
auto AfterClose = uv_fs_callback_t{[](uv_fs_t* req) {
@@ -2542,7 +2545,7 @@ void Initialize(Local<Object> target,
25422545
env->SetProtoMethod(fd, "close", FileHandle::Close);
25432546
env->SetProtoMethod(fd, "releaseFD", FileHandle::ReleaseFD);
25442547
Local<ObjectTemplate> fdt = fd->InstanceTemplate();
2545-
fdt->SetInternalFieldCount(StreamBase::kInternalFieldCount);
2548+
fdt->SetInternalFieldCount(FileHandle::kInternalFieldCount);
25462549
StreamBase::AddMethods(env, fd);
25472550
env->SetConstructorFunction(target, "FileHandle", fd);
25482551
env->set_fd_constructor_template(fdt);

src/node_file.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,12 @@ class FileHandleReadWrap final : public ReqWrap<uv_fs_t> {
234234
// the object is garbage collected
235235
class FileHandle final : public AsyncWrap, public StreamBase {
236236
public:
237+
enum InternalFields {
238+
kModuleWrapBaseField = StreamBase::kInternalFieldCount,
239+
kClosingPromiseSlot,
240+
kInternalFieldCount
241+
};
242+
237243
static FileHandle* New(BindingData* binding_data,
238244
int fd,
239245
v8::Local<v8::Object> obj = v8::Local<v8::Object>());
@@ -351,8 +357,6 @@ class FileHandle final : public AsyncWrap, public StreamBase {
351357
BaseObjectPtr<FileHandleReadWrap> current_read_;
352358

353359
BaseObjectPtr<BindingData> binding_data_;
354-
355-
v8::Global<v8::Promise::Resolver> close_promise_{};
356360
};
357361

358362
int MKDirpSync(uv_loop_t* loop,

0 commit comments

Comments
 (0)