diff --git a/include/addon-tools.hpp b/include/addon-tools.hpp index e417a1e..0cefc4f 100644 --- a/include/addon-tools.hpp +++ b/include/addon-tools.hpp @@ -6,13 +6,15 @@ #define RET_VALUE(VAL) info.GetReturnValue().Set(VAL); -#define RET_UNDEFINED info.GetReturnValue().Set(Nan::Undefined()); +#define RET_UNDEFINED RET_VALUE(Nan::Undefined()); #define JS_STR(...) Nan::New(__VA_ARGS__).ToLocalChecked() #define JS_INT(val) Nan::New(val) #define JS_NUM(val) Nan::New(val) #define JS_BOOL(val) (val) ? Nan::True() : Nan::False() + + #define JS_RETHROW(tc) v8::Local::New(tc.Exception()); @@ -21,87 +23,90 @@ Nan::ThrowTypeError("Expected at least " #N " arguments"); -#define REQ_STR_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsString()) \ - Nan::ThrowTypeError("Argument " #I " must be a string"); \ - String::Utf8Value _v8_##VAR(info[I]->ToString()); \ - std::string _std_##VAR = std::string(*_v8_##VAR); \ - const char *VAR = _std_##VAR.c_str(); +#define CHECK_REQ_ARG(I, C, T) \ + if (info.Length() <= (I) || ! info[I]->C) \ + Nan::ThrowTypeError("Argument " #I " must be " T); + +#define CHECK_LET_ARG(I, C, T) \ + if ( ! (info[I]->IsNull() || info[I]->C) ) \ + Nan::ThrowTypeError("Argument " #I " must be " T " or null"); #define REQ_UTF8_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsString()) \ - Nan::ThrowTypeError("Argument " #I " must be a string"); \ + CHECK_REQ_ARG(I, IsString(), "string"); \ String::Utf8Value VAR(info[I]); +#define LET_UTF8_ARG(I, VAR) \ + CHECK_LET_ARG(I, IsString(), "string"); \ + String::Utf8Value VAR(info[I]->IsNull() ? JS_STR("") : info[I]); + #define REQ_INT32_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsInt32()) \ - Nan::ThrowTypeError("Argument " #I " must be an int32"); \ + CHECK_REQ_ARG(I, IsInt32(), "int32"); \ int VAR = info[I]->Int32Value(); - #define LET_INT32_ARG(I, VAR) \ - if ( ! (info[I]->IsNull() || info[I]->IsInt32()) ) \ - Nan::ThrowTypeError("Argument " #I " must be an int32 or null");\ + CHECK_LET_ARG(I, IsInt32(), "int32"); \ int VAR = info[I]->IsNull() ? 0 : info[I]->Int32Value(); #define REQ_BOOL_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsBoolean()) \ - Nan::ThrowTypeError("Argument " #I " must be a bool"); \ + CHECK_REQ_ARG(I, IsBoolean(), "bool"); \ int VAR = info[I]->BooleanValue(); +#define LET_BOOL_ARG(I, VAR) \ + CHECK_LET_ARG(I, IsBoolean(), "bool"); \ + int VAR = info[I]->IsNull() ? false : info[I]->BooleanValue(); + #define REQ_UINT32_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsUint32()) \ - Nan::ThrowTypeError("Argument " #I " must be a uint32"); \ + CHECK_REQ_ARG(I, IsUint32(), "uint32"); \ unsigned int VAR = info[I]->Uint32Value(); - -#define USE_UINT32_ARG(I, VAR, DEF) \ - if ( ! (info[I]->IsNull() || info[I]->IsUint32()) ) \ - Nan::ThrowTypeError("Argument " #I " must be an uint32 or null");\ - unsigned int VAR = info[I]->IsNull() ? (DEF) : info[I]->Uint32Value(); - - #define LET_UINT32_ARG(I, VAR) \ - USE_UINT32_ARG(I, VAR, 0) + CHECK_LET_ARG(I, IsUint32(), "uint32"); \ + unsigned int VAR = info[I]->IsNull() ? 0 : info[I]->Uint32Value(); -#define REQ_INT_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsNumber()) \ - Nan::ThrowTypeError("Argument " #I " must be a int"); \ +#define REQ_OFFS_ARG(I, VAR) \ + CHECK_REQ_ARG(I, IsNumber(), "number"); \ size_t VAR = static_cast(info[I]->IntegerValue()); +#define LET_OFFS_ARG(I, VAR) \ + CHECK_LET_ARG(I, IsNumber(), "number"); \ + size_t VAR = info[I]->IsNull() ? 0 : static_cast(info[I]->IntegerValue()); + #define REQ_DOUBLE_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsNumber()) \ - Nan::ThrowTypeError("Argument " #I " must be a int"); \ - double VAR = static_cast(info[I]->NumberValue()); + CHECK_REQ_ARG(I, IsNumber(), "number"); \ + double VAR = info[I]->NumberValue(); + +#define LET_DOUBLE_ARG(I, VAR) \ + CHECK_LET_ARG(I, IsNumber(), "number"); \ + double VAR = info[I]->IsNull() ? 0.0 : info[I]->NumberValue(); #define REQ_FLOAT_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsNumber()) \ - Nan::ThrowTypeError("Argument " #I " must be a int"); \ + CHECK_REQ_ARG(I, IsNumber(), "number"); \ float VAR = static_cast(info[I]->NumberValue()); +#define LET_FLOAT_ARG(I, VAR) \ + CHECK_LET_ARG(I, IsNumber(), "number"); \ + float VAR = info[I]->IsNull() ? 0.f : static_cast(info[I]->NumberValue()); + #define REQ_EXT_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsExternal()) \ - Nan::ThrowTypeError("Argument " #I " invalid"); \ + CHECK_REQ_ARG(I, IsExternal(), "void*"); \ Local VAR = Local::Cast(info[I]); #define REQ_FUN_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsFunction()) \ - Nan::ThrowTypeError("Argument " #I " must be a function"); \ + CHECK_REQ_ARG(I, IsFunction(), "function"); \ Local VAR = Local::Cast(info[I]); #define REQ_OBJ_ARG(I, VAR) \ - if (info.Length() <= (I) || ! info[I]->IsObject()) \ - Nan::ThrowTypeError("Argument " #I " must be an object"); \ + CHECK_REQ_ARG(I, IsObject(), "object"); \ Local VAR = Local::Cast(info[I]); @@ -112,9 +117,7 @@ Local VAR = Local::Cast(_obj_##VAR); -#define REQ_ERROR_THROW(error) \ - if (ret == error) \ - Nan::ThrowError(String::New(#error)); +#define SET_PROP(OBJ, KEY, VAL) OBJ->Set(JS_STR(KEY), VAL); #endif // _ADDON_TOOLS_HPP_ diff --git a/package.json b/package.json index cf070f6..475eb76 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "node-addon-tools-raub", "author": "Luis Blanco ", "description": "A set of extra macros for node addons, shipped as C++ header file.", - "version": "0.0.3", + "version": "0.0.4", "main": "index.js", "keywords": [ "node",