diff options
Diffstat (limited to 'node_modules/nan/nan_callbacks_pre_12_inl.h')
-rw-r--r-- | node_modules/nan/nan_callbacks_pre_12_inl.h | 520 |
1 files changed, 520 insertions, 0 deletions
diff --git a/node_modules/nan/nan_callbacks_pre_12_inl.h b/node_modules/nan/nan_callbacks_pre_12_inl.h new file mode 100644 index 0000000..c9ba499 --- /dev/null +++ b/node_modules/nan/nan_callbacks_pre_12_inl.h @@ -0,0 +1,520 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md> + ********************************************************************/ + +#ifndef NAN_CALLBACKS_PRE_12_INL_H_ +#define NAN_CALLBACKS_PRE_12_INL_H_ + +namespace imp { +template<typename T> class ReturnValueImp; +} // end of namespace imp + +template<typename T> +class ReturnValue { + v8::Isolate *isolate_; + v8::Persistent<T> *value_; + friend class imp::ReturnValueImp<T>; + + public: + template <class S> + explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent<S> *p) : + isolate_(isolate), value_(p) {} + template <class S> + explicit inline ReturnValue(const ReturnValue<S>& that) + : isolate_(that.isolate_), value_(that.value_) { + TYPE_CHECK(T, S); + } + + // Handle setters + template <typename S> inline void Set(const v8::Local<S> &handle) { + TYPE_CHECK(T, S); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(handle); + } + + template <typename S> inline void Set(const Global<S> &handle) { + TYPE_CHECK(T, S); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(handle.persistent); + const_cast<Global<S> &>(handle).Reset(); + } + + // Fast primitive setters + inline void Set(bool value) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Boolean); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::Boolean::New(value)); + } + + inline void Set(double i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Number); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::Number::New(i)); + } + + inline void Set(int32_t i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Integer); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::Int32::New(i)); + } + + inline void Set(uint32_t i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Integer); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::Uint32::NewFromUnsigned(i)); + } + + // Fast JS primitive setters + inline void SetNull() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Primitive); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::Null()); + } + + inline void SetUndefined() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Primitive); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::Undefined()); + } + + inline void SetEmptyString() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::String); + value_->Dispose(); + *value_ = v8::Persistent<T>::New(v8::String::Empty()); + } + + // Convenience getter for isolate + inline v8::Isolate *GetIsolate() const { + return isolate_; + } + + // 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::Arguments &args_; + v8::Local<v8::Value> data_; + ReturnValue<T> return_value_; + v8::Persistent<T> retval_; + + public: + explicit inline FunctionCallbackInfo( + const v8::Arguments &args + , v8::Local<v8::Value> data) : + args_(args) + , data_(data) + , return_value_(args.GetIsolate(), &retval_) + , retval_(v8::Persistent<T>::New(v8::Undefined())) {} + + inline ~FunctionCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue<T> GetReturnValue() const { + return ReturnValue<T>(return_value_); + } + + inline v8::Local<v8::Function> Callee() const { return args_.Callee(); } + inline v8::Local<v8::Value> Data() const { return data_; } + inline v8::Local<v8::Object> Holder() const { return args_.Holder(); } + inline bool IsConstructCall() const { return args_.IsConstructCall(); } + inline int Length() const { return args_.Length(); } + inline v8::Local<v8::Value> operator[](int i) const { return args_[i]; } + inline v8::Local<v8::Object> This() const { return args_.This(); } + inline v8::Isolate *GetIsolate() const { return args_.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 PropertyCallbackInfoBase { + const v8::AccessorInfo &info_; + const v8::Local<v8::Value> data_; + + public: + explicit inline PropertyCallbackInfoBase( + const v8::AccessorInfo &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(); } + + 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(PropertyCallbackInfoBase) +}; + +template<typename T> +class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> { + ReturnValue<T> return_value_; + v8::Persistent<T> retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local<v8::Value> data) : + PropertyCallbackInfoBase<T>(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent<T>::New(v8::Undefined())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue<T> GetReturnValue() const { return return_value_; } +}; + +template<> +class PropertyCallbackInfo<v8::Array> : + public PropertyCallbackInfoBase<v8::Array> { + ReturnValue<v8::Array> return_value_; + v8::Persistent<v8::Array> retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local<v8::Value> data) : + PropertyCallbackInfoBase<v8::Array>(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent<v8::Array>::New(v8::Local<v8::Array>())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue<v8::Array> GetReturnValue() const { + return return_value_; + } +}; + +template<> +class PropertyCallbackInfo<v8::Boolean> : + public PropertyCallbackInfoBase<v8::Boolean> { + ReturnValue<v8::Boolean> return_value_; + v8::Persistent<v8::Boolean> retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local<v8::Value> data) : + PropertyCallbackInfoBase<v8::Boolean>(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent<v8::Boolean>::New(v8::Local<v8::Boolean>())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue<v8::Boolean> GetReturnValue() const { + return return_value_; + } +}; + +template<> +class PropertyCallbackInfo<v8::Integer> : + public PropertyCallbackInfoBase<v8::Integer> { + ReturnValue<v8::Integer> return_value_; + v8::Persistent<v8::Integer> retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local<v8::Value> data) : + PropertyCallbackInfoBase<v8::Integer>(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent<v8::Integer>::New(v8::Local<v8::Integer>())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue<v8::Integer> GetReturnValue() const { + return return_value_; + } +}; + +namespace imp { +template<typename T> +class ReturnValueImp : public ReturnValue<T> { + public: + explicit ReturnValueImp(ReturnValue<T> that) : + ReturnValue<T>(that) {} + inline v8::Handle<T> Value() { + return *ReturnValue<T>::value_; + } +}; + +static +v8::Handle<v8::Value> FunctionCallbackWrapper(const v8::Arguments &args) { + v8::Local<v8::Object> obj = args.Data().As<v8::Object>(); + FunctionCallback callback = reinterpret_cast<FunctionCallback>( + reinterpret_cast<intptr_t>( + obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value())); + FunctionCallbackInfo<v8::Value> + cbinfo(args, obj->GetInternalField(kDataIndex)); + callback(cbinfo); + return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Value> (*NativeFunction)(const v8::Arguments &); + +static +v8::Handle<v8::Value> GetterCallbackWrapper( + v8::Local<v8::String> property, const v8::AccessorInfo &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); + return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Value> (*NativeGetter) + (v8::Local<v8::String>, const v8::AccessorInfo &); + +static +void SetterCallbackWrapper( + v8::Local<v8::String> property + , v8::Local<v8::Value> value + , const v8::AccessorInfo &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::AccessorInfo &); + +static +v8::Handle<v8::Value> PropertyGetterCallbackWrapper( + v8::Local<v8::String> property, const v8::AccessorInfo &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); + return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Value> (*NativePropertyGetter) + (v8::Local<v8::String>, const v8::AccessorInfo &); + +static +v8::Handle<v8::Value> PropertySetterCallbackWrapper( + v8::Local<v8::String> property + , v8::Local<v8::Value> value + , const v8::AccessorInfo &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); + return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Value> (*NativePropertySetter) + (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &); + +static +v8::Handle<v8::Array> PropertyEnumeratorCallbackWrapper( + const v8::AccessorInfo &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); + return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Array> (*NativePropertyEnumerator) + (const v8::AccessorInfo &); + +static +v8::Handle<v8::Boolean> PropertyDeleterCallbackWrapper( + v8::Local<v8::String> property + , const v8::AccessorInfo &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); + return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Boolean> (NativePropertyDeleter) + (v8::Local<v8::String>, const v8::AccessorInfo &); + +static +v8::Handle<v8::Integer> PropertyQueryCallbackWrapper( + v8::Local<v8::String> property, const v8::AccessorInfo &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); + return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Integer> (*NativePropertyQuery) + (v8::Local<v8::String>, const v8::AccessorInfo &); + +static +v8::Handle<v8::Value> IndexGetterCallbackWrapper( + uint32_t index, const v8::AccessorInfo &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); + return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Value> (*NativeIndexGetter) + (uint32_t, const v8::AccessorInfo &); + +static +v8::Handle<v8::Value> IndexSetterCallbackWrapper( + uint32_t index + , v8::Local<v8::Value> value + , const v8::AccessorInfo &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); + return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Value> (*NativeIndexSetter) + (uint32_t, v8::Local<v8::Value>, const v8::AccessorInfo &); + +static +v8::Handle<v8::Array> IndexEnumeratorCallbackWrapper( + const v8::AccessorInfo &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); + return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Array> (*NativeIndexEnumerator) + (const v8::AccessorInfo &); + +static +v8::Handle<v8::Boolean> IndexDeleterCallbackWrapper( + uint32_t index, const v8::AccessorInfo &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); + return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Boolean> (*NativeIndexDeleter) + (uint32_t, const v8::AccessorInfo &); + +static +v8::Handle<v8::Integer> IndexQueryCallbackWrapper( + uint32_t index, const v8::AccessorInfo &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); + return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle<v8::Integer> (*NativeIndexQuery) + (uint32_t, const v8::AccessorInfo &); +} // end of namespace imp + +#endif // NAN_CALLBACKS_PRE_12_INL_H_ |