diff --git a/include/addon-tools.hpp b/include/addon-tools.hpp index fb333eb..f37c9ee 100644 --- a/include/addon-tools.hpp +++ b/include/addon-tools.hpp @@ -15,8 +15,10 @@ typedef v8::Local V8_VAR_VAL; typedef v8::Local V8_VAR_OBJ; typedef v8::Local V8_VAR_ARR; +typedef v8::Local V8_VAR_ABV; typedef v8::Local V8_VAR_STR; typedef v8::Local V8_VAR_FUNC; +typedef v8::Local V8_VAR_EXT; typedef v8::Local V8_VAR_FT; typedef v8::Local V8_VAR_OT; @@ -124,29 +126,28 @@ typedef Nan::Persistent V8_STORE_VAL; #define REQ_EXT_ARG(I, VAR) \ CHECK_REQ_ARG(I, IsExternal(), "void*"); \ - v8::Local VAR = v8::Local::Cast(info[I]); + V8_VAR_EXT VAR = V8_VAR_EXT::Cast(info[I]); #define LET_EXT_ARG(I, VAR) \ CHECK_LET_ARG(I, IsExternal(), "number"); \ - v8::Local VAR = IS_ARG_EMPTY(I) ? JS_EXT(nullptr) : \ - v8::Local::Cast(info[I]); + V8_VAR_EXT VAR = IS_ARG_EMPTY(I) ? JS_EXT(nullptr) : V8_VAR_EXT::Cast(info[I]); #define REQ_FUN_ARG(I, VAR) \ CHECK_REQ_ARG(I, IsFunction(), "function"); \ - v8::Local VAR = v8::Local::Cast(info[I]); + V8_VAR_FUNC VAR = V8_VAR_FUNC::Cast(info[I]); #define REQ_OBJ_ARG(I, VAR) \ CHECK_REQ_ARG(I, IsObject(), "object"); \ - v8::Local VAR = v8::Local::Cast(info[I]); + V8_VAR_OBJ VAR = V8_VAR_OBJ::Cast(info[I]); #define REQ_ARRV_ARG(I, VAR) \ REQ_OBJ_ARG(I, _obj_##VAR); \ if( ! _obj_##VAR->IsArrayBufferView() ) \ return Nan::ThrowTypeError("Argument " #I " must be an array buffer");\ - v8::Local VAR = v8::Local::Cast(_obj_##VAR); + V8_VAR_ABV VAR = V8_VAR_ABV::Cast(_obj_##VAR); #define SET_PROP(OBJ, KEY, VAL) OBJ->Set(JS_STR(KEY), VAL); @@ -206,22 +207,22 @@ typedef Nan::Persistent V8_STORE_VAL; #define SETTER_EXT_ARG \ SETTER_CHECK(IsExternal(), "void*"); \ - v8::Local v = v8::Local::Cast(value); + V8_VAR_EXT v = V8_VAR_EXT::Cast(value); #define SETTER_FUN_ARG \ SETTER_CHECK(IsFunction(), "function"); \ - v8::Local v = v8::Local::Cast(value); + V8_VAR_FUNC v = V8_VAR_FUNC::Cast(value); #define SETTER_OBJ_ARG \ SETTER_CHECK(IsObject(), "object"); \ - v8::Local v = v8::Local::Cast(value); + V8_VAR_OBJ v = V8_VAR_OBJ::Cast(value); #define SETTER_ARRV_ARG \ SETTER_CHECK(IsObject(), "object"); \ - v8::Local _obj_v = v8::Local::Cast(value); \ + V8_VAR_OBJ _obj_v = V8_VAR_OBJ::Cast(value); \ if( ! _obj_v->IsArrayBufferView() ) \ return Nan::ThrowTypeError("The value must be an array buffer"); \ - v8::Local v = v8::Local::Cast(_obj_v); + V8_VAR_ABV v = V8_VAR_ABV::Cast(_obj_v); @@ -239,7 +240,7 @@ inline Type* getArrayData(V8_VAR_OBJ obj, int *num = nullptr) { return data; } - v8::Local arr = v8::Local::Cast(obj); + V8_VAR_ABV arr = V8_VAR_ABV::Cast(obj); if (num) { *num = arr->ByteLength() / sizeof(Type); } @@ -257,9 +258,10 @@ inline void *getData(V8_VAR_OBJ obj) { if (obj->IsArrayBufferView()) { pixels = getArrayData(obj); } else if (obj->Has(JS_STR("data"))) { - pixels = node::Buffer::Data(Nan::Get(obj, JS_STR("data")).ToLocalChecked()); - } else { - Nan::ThrowError("Bad argument"); + V8_VAR_VAL data = Nan::Get(obj, JS_STR("data")).ToLocalChecked(); + if ( ! data->IsNullOrUndefined() ) { + pixels = node::Buffer::Data(data); + } } return pixels;