Blame | Last modification | View Log | RSS feed
/********************************************************************** NAN - Native Abstractions for Node.js** Copyright (c) 2016 NAN contributors** MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>********************************************************************/#ifndef NAN_CALLBACKS_12_INL_H_#define NAN_CALLBACKS_12_INL_H_template<typename T>class ReturnValue {v8::ReturnValue<T> value_;public:template <class S>explicit inline ReturnValue(const v8::ReturnValue<S> &value) :value_(value) {}template <class S>explicit inline ReturnValue(const ReturnValue<S>& that): value_(that.value_) {TYPE_CHECK(T, S);}// Handle setterstemplate <typename S> inline void Set(const v8::Local<S> &handle) {TYPE_CHECK(T, S);value_.Set(handle);}template <typename S> inline void Set(const Global<S> &handle) {TYPE_CHECK(T, S);#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \(V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && \(V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 && \defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8))))value_.Set(handle);#elsevalue_.Set(*reinterpret_cast<const v8::Persistent<S>*>(&handle));const_cast<Global<S> &>(handle).Reset();#endif}// Fast primitive settersinline void Set(bool value) {TYPE_CHECK(T, v8::Boolean);value_.Set(value);}inline void Set(double i) {TYPE_CHECK(T, v8::Number);value_.Set(i);}inline void Set(int32_t i) {TYPE_CHECK(T, v8::Integer);value_.Set(i);}inline void Set(uint32_t i) {TYPE_CHECK(T, v8::Integer);value_.Set(i);}// Fast JS primitive settersinline void SetNull() {TYPE_CHECK(T, v8::Primitive);value_.SetNull();}inline void SetUndefined() {TYPE_CHECK(T, v8::Primitive);value_.SetUndefined();}inline void SetEmptyString() {TYPE_CHECK(T, v8::String);value_.SetEmptyString();}// Convenience getter for isolateinline v8::Isolate *GetIsolate() const {return value_.GetIsolate();}// Pointer setter: Uncompilable to prevent inadvertent misuse.template<typename S>inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }};template<typename T>class FunctionCallbackInfo {const v8::FunctionCallbackInfo<T> &info_;const v8::Local<v8::Value> data_;public:explicit inline FunctionCallbackInfo(const v8::FunctionCallbackInfo<T> &info, v8::Local<v8::Value> data) :info_(info), data_(data) {}inline ReturnValue<T> GetReturnValue() const {return ReturnValue<T>(info_.GetReturnValue());}inline v8::Local<v8::Function> Callee() const { return info_.Callee(); }inline v8::Local<v8::Value> Data() const { return data_; }inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }inline bool IsConstructCall() const { return info_.IsConstructCall(); }inline int Length() const { return info_.Length(); }inline v8::Local<v8::Value> operator[](int i) const { return info_[i]; }inline v8::Local<v8::Object> This() const { return info_.This(); }inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); }protected:static const int kHolderIndex = 0;static const int kIsolateIndex = 1;static const int kReturnValueDefaultValueIndex = 2;static const int kReturnValueIndex = 3;static const int kDataIndex = 4;static const int kCalleeIndex = 5;static const int kContextSaveIndex = 6;static const int kArgsLength = 7;private:NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)};template<typename T>class PropertyCallbackInfo {const v8::PropertyCallbackInfo<T> &info_;const v8::Local<v8::Value> data_;public:explicit inline PropertyCallbackInfo(const v8::PropertyCallbackInfo<T> &info, const v8::Local<v8::Value> data) :info_(info), data_(data) {}inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }inline v8::Local<v8::Value> Data() const { return data_; }inline v8::Local<v8::Object> This() const { return info_.This(); }inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }inline ReturnValue<T> GetReturnValue() const {return ReturnValue<T>(info_.GetReturnValue());}protected:static const int kHolderIndex = 0;static const int kIsolateIndex = 1;static const int kReturnValueDefaultValueIndex = 2;static const int kReturnValueIndex = 3;static const int kDataIndex = 4;static const int kThisIndex = 5;static const int kArgsLength = 6;private:NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo)};namespace imp {staticvoid FunctionCallbackWrapper(const v8::FunctionCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();FunctionCallback callback = reinterpret_cast<FunctionCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));FunctionCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));callback(cbinfo);}typedef void (*NativeFunction)(const v8::FunctionCallbackInfo<v8::Value> &);#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSIONstaticvoid GetterCallbackWrapper(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));GetterCallback callback = reinterpret_cast<GetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));callback(property.As<v8::String>(), cbinfo);}typedef void (*NativeGetter)(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid SetterCallbackWrapper(v8::Local<v8::Name> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<void>cbinfo(info, obj->GetInternalField(kDataIndex));SetterCallback callback = reinterpret_cast<SetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));callback(property.As<v8::String>(), value, cbinfo);}typedef void (*NativeSetter)(v8::Local<v8::Name>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void> &);#elsestaticvoid GetterCallbackWrapper(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));GetterCallback callback = reinterpret_cast<GetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));callback(property, cbinfo);}typedef void (*NativeGetter)(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid SetterCallbackWrapper(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<void>cbinfo(info, obj->GetInternalField(kDataIndex));SetterCallback callback = reinterpret_cast<SetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));callback(property, value, cbinfo);}typedef void (*NativeSetter)(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void> &);#endif#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSIONstaticvoid PropertyGetterCallbackWrapper(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyGetterIndex).As<v8::External>()->Value()));callback(property.As<v8::String>(), cbinfo);}typedef void (*NativePropertyGetter)(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid PropertySetterCallbackWrapper(v8::Local<v8::Name> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertySetterIndex).As<v8::External>()->Value()));callback(property.As<v8::String>(), value, cbinfo);}typedef void (*NativePropertySetter)(v8::Local<v8::Name>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid PropertyEnumeratorCallbackWrapper(const v8::PropertyCallbackInfo<v8::Array> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Array>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyEnumeratorCallback callback =reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyEnumeratorIndex).As<v8::External>()->Value()));callback(cbinfo);}typedef void (*NativePropertyEnumerator)(const v8::PropertyCallbackInfo<v8::Array> &);staticvoid PropertyDeleterCallbackWrapper(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Boolean> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Boolean>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyDeleterIndex).As<v8::External>()->Value()));callback(property.As<v8::String>(), cbinfo);}typedef void (NativePropertyDeleter)(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Boolean> &);staticvoid PropertyQueryCallbackWrapper(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Integer> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Integer>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyQueryIndex).As<v8::External>()->Value()));callback(property.As<v8::String>(), cbinfo);}typedef void (*NativePropertyQuery)(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Integer> &);#elsestaticvoid PropertyGetterCallbackWrapper(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyGetterIndex).As<v8::External>()->Value()));callback(property, cbinfo);}typedef void (*NativePropertyGetter)(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid PropertySetterCallbackWrapper(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertySetterIndex).As<v8::External>()->Value()));callback(property, value, cbinfo);}typedef void (*NativePropertySetter)(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid PropertyEnumeratorCallbackWrapper(const v8::PropertyCallbackInfo<v8::Array> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Array>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyEnumeratorCallback callback =reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyEnumeratorIndex).As<v8::External>()->Value()));callback(cbinfo);}typedef void (*NativePropertyEnumerator)(const v8::PropertyCallbackInfo<v8::Array> &);staticvoid PropertyDeleterCallbackWrapper(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Boolean> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Boolean>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyDeleterIndex).As<v8::External>()->Value()));callback(property, cbinfo);}typedef void (NativePropertyDeleter)(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Boolean> &);staticvoid PropertyQueryCallbackWrapper(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Integer> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Integer>cbinfo(info, obj->GetInternalField(kDataIndex));PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kPropertyQueryIndex).As<v8::External>()->Value()));callback(property, cbinfo);}typedef void (*NativePropertyQuery)(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Integer> &);#endifstaticvoid IndexGetterCallbackWrapper(uint32_t index, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kIndexPropertyGetterIndex).As<v8::External>()->Value()));callback(index, cbinfo);}typedef void (*NativeIndexGetter)(uint32_t, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid IndexSetterCallbackWrapper(uint32_t index, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Value>cbinfo(info, obj->GetInternalField(kDataIndex));IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kIndexPropertySetterIndex).As<v8::External>()->Value()));callback(index, value, cbinfo);}typedef void (*NativeIndexSetter)(uint32_t, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<v8::Value> &);staticvoid IndexEnumeratorCallbackWrapper(const v8::PropertyCallbackInfo<v8::Array> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Array>cbinfo(info, obj->GetInternalField(kDataIndex));IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kIndexPropertyEnumeratorIndex).As<v8::External>()->Value()));callback(cbinfo);}typedef void (*NativeIndexEnumerator)(const v8::PropertyCallbackInfo<v8::Array> &);staticvoid IndexDeleterCallbackWrapper(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Boolean>cbinfo(info, obj->GetInternalField(kDataIndex));IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kIndexPropertyDeleterIndex).As<v8::External>()->Value()));callback(index, cbinfo);}typedef void (*NativeIndexDeleter)(uint32_t, const v8::PropertyCallbackInfo<v8::Boolean> &);staticvoid IndexQueryCallbackWrapper(uint32_t index, const v8::PropertyCallbackInfo<v8::Integer> &info) {v8::Local<v8::Object> obj = info.Data().As<v8::Object>();PropertyCallbackInfo<v8::Integer>cbinfo(info, obj->GetInternalField(kDataIndex));IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(reinterpret_cast<intptr_t>(obj->GetInternalField(kIndexPropertyQueryIndex).As<v8::External>()->Value()));callback(index, cbinfo);}typedef void (*NativeIndexQuery)(uint32_t, const v8::PropertyCallbackInfo<v8::Integer> &);} // end of namespace imp#endif // NAN_CALLBACKS_12_INL_H_