|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- /*********************************************************************
- * 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_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 setters
- template <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);
- #else
- value_.Set(*reinterpret_cast<const v8::Persistent<S>*>(&handle));
- const_cast<Global<S> &>(handle).Reset();
- #endif
- }
-
- // Fast primitive setters
- inline 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 setters
- inline 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 isolate
- inline 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());
- }
-
- #if NODE_MAJOR_VERSION < 10
- inline v8::Local<v8::Function> Callee() const { return info_.Callee(); }
- #endif
- 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 {
- static
- void 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_VERSION
- static
- void 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> &);
-
- static
- void 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> &);
- #else
- static
- void 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> &);
-
- static
- void 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_VERSION
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
- #else
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
- #endif
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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> &);
-
- static
- void 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_
|