diff --git a/src/node_file.cc b/src/node_file.cc index abba5765dd2..fd9be59b75f 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -70,8 +70,11 @@ namespace node { using namespace v8; #define MIN(a,b) ((a) < (b) ? (a) : (b)) -#define THROW_BAD_ARGS \ - ThrowException(Exception::TypeError(String::New("Bad argument"))) + +#define TYPE_ERROR(msg) \ + ThrowException(Exception::TypeError(String::New(msg))); + +#define THROW_BAD_ARGS TYPE_ERROR("Bad argument") typedef class ReqWrap FSReqWrap; @@ -339,9 +342,8 @@ Local BuildStatsObject(NODE_STAT_STRUCT *s) { static Handle Stat(const Arguments& args) { HandleScope scope; - if (args.Length() < 1 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } + if (args.Length() < 1) return TYPE_ERROR("path required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); String::Utf8Value path(args[0]->ToString()); @@ -356,9 +358,8 @@ static Handle Stat(const Arguments& args) { static Handle LStat(const Arguments& args) { HandleScope scope; - if (args.Length() < 1 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } + if (args.Length() < 1) return TYPE_ERROR("path required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); String::Utf8Value path(args[0]->ToString()); @@ -390,9 +391,11 @@ static Handle FStat(const Arguments& args) { static Handle Symlink(const Arguments& args) { HandleScope scope; - if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsString()) { - return THROW_BAD_ARGS; - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("dest path required"); + if (len < 2) return TYPE_ERROR("src path required"); + if (!args[0]->IsString()) return TYPE_ERROR("dest path must be a string"); + if (!args[1]->IsString()) return TYPE_ERROR("src path must be a string"); String::Utf8Value dest(args[0]->ToString()); String::Utf8Value path(args[1]->ToString()); @@ -416,9 +419,11 @@ static Handle Symlink(const Arguments& args) { static Handle Link(const Arguments& args) { HandleScope scope; - if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsString()) { - return THROW_BAD_ARGS; - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("dest path required"); + if (len < 2) return TYPE_ERROR("src path required"); + if (!args[0]->IsString()) return TYPE_ERROR("dest path must be a string"); + if (!args[1]->IsString()) return TYPE_ERROR("src path must be a string"); String::Utf8Value orig_path(args[0]->ToString()); String::Utf8Value new_path(args[1]->ToString()); @@ -434,9 +439,8 @@ static Handle Link(const Arguments& args) { static Handle ReadLink(const Arguments& args) { HandleScope scope; - if (args.Length() < 1 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } + if (args.Length() < 1) return TYPE_ERROR("path required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); String::Utf8Value path(args[0]->ToString()); @@ -451,10 +455,12 @@ static Handle ReadLink(const Arguments& args) { static Handle Rename(const Arguments& args) { HandleScope scope; - if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsString()) { - return THROW_BAD_ARGS; - } - + int len = args.Length(); + if (len < 1) return TYPE_ERROR("old path required"); + if (len < 2) return TYPE_ERROR("new path required"); + if (!args[0]->IsString()) return TYPE_ERROR("old path must be a string"); + if (!args[1]->IsString()) return TYPE_ERROR("new path must be a string"); + String::Utf8Value old_path(args[0]->ToString()); String::Utf8Value new_path(args[1]->ToString()); @@ -537,9 +543,8 @@ static Handle Fsync(const Arguments& args) { static Handle Unlink(const Arguments& args) { HandleScope scope; - if (args.Length() < 1 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } + if (args.Length() < 1) return TYPE_ERROR("path required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); String::Utf8Value path(args[0]->ToString()); @@ -554,9 +559,8 @@ static Handle Unlink(const Arguments& args) { static Handle RMDir(const Arguments& args) { HandleScope scope; - if (args.Length() < 1 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } + if (args.Length() < 1) return TYPE_ERROR("path required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); String::Utf8Value path(args[0]->ToString()); @@ -613,9 +617,8 @@ static Handle SendFile(const Arguments& args) { static Handle ReadDir(const Arguments& args) { HandleScope scope; - if (args.Length() < 1 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } + if (args.Length() < 1) return TYPE_ERROR("path required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); String::Utf8Value path(args[0]->ToString()); @@ -647,12 +650,13 @@ static Handle ReadDir(const Arguments& args) { static Handle Open(const Arguments& args) { HandleScope scope; - if (args.Length() < 3 || - !args[0]->IsString() || - !args[1]->IsInt32() || - !args[2]->IsInt32()) { - return THROW_BAD_ARGS; - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("path required"); + if (len < 2) return TYPE_ERROR("flags required"); + if (len < 3) return TYPE_ERROR("mode required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); + if (!args[1]->IsInt32()) return TYPE_ERROR("flags must be an int"); + if (!args[2]->IsInt32()) return TYPE_ERROR("mode must be an int"); String::Utf8Value path(args[0]->ToString()); int flags = args[1]->Int32Value(); @@ -847,13 +851,13 @@ static Handle FChmod(const Arguments& args) { static Handle Chown(const Arguments& args) { HandleScope scope; - if (args.Length() < 3 || !args[0]->IsString()) { - return THROW_BAD_ARGS; - } - - if (!args[1]->IsInt32() || !args[2]->IsInt32()) { - return ThrowException(Exception::Error(String::New("User and Group IDs must be an integer."))); - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("path required"); + if (len < 2) return TYPE_ERROR("uid required"); + if (len < 3) return TYPE_ERROR("gid required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); + if (!args[1]->IsInt32()) return TYPE_ERROR("uid must be an int"); + if (!args[2]->IsInt32()) return TYPE_ERROR("gid must be an int"); String::Utf8Value path(args[0]->ToString()); int uid = static_cast(args[1]->Int32Value()); @@ -874,13 +878,13 @@ static Handle Chown(const Arguments& args) { static Handle FChown(const Arguments& args) { HandleScope scope; - if (args.Length() < 3 || !args[0]->IsInt32()) { - return THROW_BAD_ARGS; - } - - if (!args[1]->IsInt32() || !args[2]->IsInt32()) { - return ThrowException(Exception::Error(String::New("User and Group IDs must be an integer."))); - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("path required"); + if (len < 2) return TYPE_ERROR("uid required"); + if (len < 3) return TYPE_ERROR("gid required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); + if (!args[1]->IsInt32()) return TYPE_ERROR("uid must be an int"); + if (!args[2]->IsInt32()) return TYPE_ERROR("gid must be an int"); int fd = args[0]->Int32Value(); int uid = static_cast(args[1]->Int32Value()); @@ -898,13 +902,13 @@ static Handle FChown(const Arguments& args) { static Handle UTimes(const Arguments& args) { HandleScope scope; - if (args.Length() < 3 - || !args[0]->IsString() - || !args[1]->IsNumber() - || !args[2]->IsNumber()) - { - return THROW_BAD_ARGS; - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("path required"); + if (len < 2) return TYPE_ERROR("atime required"); + if (len < 3) return TYPE_ERROR("mtime required"); + if (!args[0]->IsString()) return TYPE_ERROR("path must be a string"); + if (!args[1]->IsNumber()) return TYPE_ERROR("atime must be a number"); + if (!args[2]->IsNumber()) return TYPE_ERROR("mtime must be a number"); const String::Utf8Value path(args[0]->ToString()); const double atime = static_cast(args[1]->NumberValue()); @@ -921,13 +925,13 @@ static Handle UTimes(const Arguments& args) { static Handle FUTimes(const Arguments& args) { HandleScope scope; - if (args.Length() < 3 - || !args[0]->IsInt32() - || !args[1]->IsNumber() - || !args[2]->IsNumber()) - { - return THROW_BAD_ARGS; - } + int len = args.Length(); + if (len < 1) return TYPE_ERROR("fd required"); + if (len < 2) return TYPE_ERROR("atime required"); + if (len < 3) return TYPE_ERROR("mtime required"); + if (!args[0]->IsInt32()) return TYPE_ERROR("fd must be an int"); + if (!args[1]->IsNumber()) return TYPE_ERROR("atime must be a number"); + if (!args[2]->IsNumber()) return TYPE_ERROR("mtime must be a number"); const int fd = args[0]->Int32Value(); const double atime = static_cast(args[1]->NumberValue());