summaryrefslogtreecommitdiff
path: root/node_modules/nan/nan_callbacks_pre_12_inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/nan/nan_callbacks_pre_12_inl.h')
-rw-r--r--node_modules/nan/nan_callbacks_pre_12_inl.h520
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_