33#include " node_external_reference.h"
44#include " node_file-inl.h"
55#include " node_process-inl.h"
6+ #include " path.h"
67#include " permission/permission.h"
78#include " util.h"
89
@@ -183,26 +184,24 @@ void AfterClose(uv_fs_t* req) {
183184void DirHandle::Close (const FunctionCallbackInfo<Value>& args) {
184185 Environment* env = Environment::GetCurrent (args);
185186
186- const int argc = args.Length ();
187- CHECK_GE (argc, 1 );
187+ CHECK_GE (args.Length (), 0 ); // [req]
188188
189189 DirHandle* dir;
190190 ASSIGN_OR_RETURN_UNWRAP (&dir, args.This ());
191191
192192 dir->closing_ = false ;
193193 dir->closed_ = true ;
194194
195- FSReqBase* req_wrap_async = GetReqWrap (args, 0 );
196- if (req_wrap_async != nullptr ) { // close(req)
195+ if (!args[0 ]->IsUndefined ()) { // close(req)
196+ FSReqBase* req_wrap_async = GetReqWrap (args, 0 );
197+ CHECK_NOT_NULL (req_wrap_async);
197198 FS_DIR_ASYNC_TRACE_BEGIN0 (UV_FS_CLOSEDIR, req_wrap_async)
198199 AsyncCall (env, req_wrap_async, args, " closedir" , UTF8, AfterClose,
199200 uv_fs_closedir, dir->dir ());
200- } else { // close(undefined, ctx)
201- CHECK_EQ (argc, 2 );
202- FSReqWrapSync req_wrap_sync;
201+ } else { // close()
202+ FSReqWrapSync req_wrap_sync (" closedir" );
203203 FS_DIR_SYNC_TRACE_BEGIN (closedir);
204- SyncCall (env, args[1 ], &req_wrap_sync, " closedir" , uv_fs_closedir,
205- dir->dir ());
204+ SyncCallAndThrowOnError (env, &req_wrap_sync, uv_fs_closedir, dir->dir ());
206205 FS_DIR_SYNC_TRACE_END (closedir);
207206 }
208207}
@@ -282,8 +281,7 @@ void DirHandle::Read(const FunctionCallbackInfo<Value>& args) {
282281 Environment* env = Environment::GetCurrent (args);
283282 Isolate* isolate = env->isolate ();
284283
285- const int argc = args.Length ();
286- CHECK_GE (argc, 3 );
284+ CHECK_GE (args.Length (), 2 ); // encoding, bufferSize, [callback]
287285
288286 const enum encoding encoding = ParseEncoding (isolate, args[0 ], UTF8);
289287
@@ -299,27 +297,25 @@ void DirHandle::Read(const FunctionCallbackInfo<Value>& args) {
299297 dir->dir_ ->dirents = dir->dirents_ .data ();
300298 }
301299
302- FSReqBase* req_wrap_async = GetReqWrap (args, 2 );
303- if (req_wrap_async != nullptr ) { // dir.read(encoding, bufferSize, req)
300+ if (!args[2 ]->IsUndefined ()) { // dir.read(encoding, bufferSize, req)
301+ FSReqBase* req_wrap_async = GetReqWrap (args, 2 );
302+ CHECK_NOT_NULL (req_wrap_async);
304303 FS_DIR_ASYNC_TRACE_BEGIN0 (UV_FS_READDIR, req_wrap_async)
305304 AsyncCall (env, req_wrap_async, args, " readdir" , encoding,
306305 AfterDirRead, uv_fs_readdir, dir->dir ());
307- } else { // dir.read(encoding, bufferSize, undefined, ctx)
308- CHECK_EQ (argc, 4 );
309- FSReqWrapSync req_wrap_sync;
306+ } else { // dir.read(encoding, bufferSize)
307+ FSReqWrapSync req_wrap_sync (" readdir" );
310308 FS_DIR_SYNC_TRACE_BEGIN (readdir);
311- int err = SyncCall (env, args[ 3 ], &req_wrap_sync, " readdir " , uv_fs_readdir,
312- dir->dir ());
309+ int err =
310+ SyncCallAndThrowOnError (env, &req_wrap_sync, uv_fs_readdir, dir->dir ());
313311 FS_DIR_SYNC_TRACE_END (readdir);
314312 if (err < 0 ) {
315- return ; // syscall failed, no need to continue, error info is in ctx
313+ return ; // syscall failed, no need to continue, error is already thrown
316314 }
317315
318316 if (req_wrap_sync.req .result == 0 ) {
319317 // Done
320- Local<Value> done = Null (isolate);
321- args.GetReturnValue ().Set (done);
322- return ;
318+ return args.GetReturnValue ().SetNull ();
323319 }
324320
325321 CHECK_GE (req_wrap_sync.req .result , 0 );
@@ -332,8 +328,9 @@ void DirHandle::Read(const FunctionCallbackInfo<Value>& args) {
332328 encoding,
333329 &error)
334330 .ToLocal (&js_array)) {
335- Local<Object> ctx = args[2 ].As <Object>();
336- USE (ctx->Set (env->context (), env->error_string (), error));
331+ // TODO(anonrig): Initializing BufferValue here is wasteful.
332+ BufferValue error_payload (isolate, error);
333+ env->ThrowError (error_payload.out ());
337334 return ;
338335 }
339336
@@ -362,16 +359,16 @@ static void OpenDir(const FunctionCallbackInfo<Value>& args) {
362359 Environment* env = Environment::GetCurrent (args);
363360 Isolate* isolate = env->isolate ();
364361
365- const int argc = args.Length ();
366- CHECK_GE (argc, 3 );
362+ CHECK_GE (args.Length (), 2 ); // path, encoding, [callback]
367363
368364 BufferValue path (isolate, args[0 ]);
369365 CHECK_NOT_NULL (*path);
370366
371367 const enum encoding encoding = ParseEncoding (isolate, args[1 ], UTF8);
372368
373- FSReqBase* req_wrap_async = GetReqWrap (args, 2 );
374- if (req_wrap_async != nullptr ) { // openDir(path, encoding, req)
369+ if (!args[2 ]->IsUndefined ()) { // openDir(path, encoding, req)
370+ FSReqBase* req_wrap_async = GetReqWrap (args, 2 );
371+ CHECK_NOT_NULL (req_wrap_async);
375372 ASYNC_THROW_IF_INSUFFICIENT_PERMISSIONS (
376373 env,
377374 req_wrap_async,
@@ -381,17 +378,16 @@ static void OpenDir(const FunctionCallbackInfo<Value>& args) {
381378 UV_FS_OPENDIR, req_wrap_async, " path" , TRACE_STR_COPY (*path))
382379 AsyncCall (env, req_wrap_async, args, " opendir" , encoding, AfterOpenDir,
383380 uv_fs_opendir, *path);
384- } else { // openDir(path, encoding, undefined, ctx)
385- CHECK_EQ (argc, 4 );
381+ } else { // openDir(path, encoding)
386382 THROW_IF_INSUFFICIENT_PERMISSIONS (
387383 env, permission::PermissionScope::kFileSystemRead , path.ToStringView ());
388- FSReqWrapSync req_wrap_sync;
384+ FSReqWrapSync req_wrap_sync ( " opendir " , *path) ;
389385 FS_DIR_SYNC_TRACE_BEGIN (opendir);
390- int result = SyncCall (env, args[ 3 ], &req_wrap_sync, " opendir " ,
391- uv_fs_opendir, *path);
386+ int result =
387+ SyncCallAndThrowOnError (env, &req_wrap_sync, uv_fs_opendir, *path);
392388 FS_DIR_SYNC_TRACE_END (opendir);
393389 if (result < 0 ) {
394- return ; // syscall failed, no need to continue, error info is in ctx
390+ return ; // syscall failed, no need to continue, error is already thrown
395391 }
396392
397393 uv_fs_t * req = &req_wrap_sync.req ;
0 commit comments