/********************************************************************* * NAN - Native Abstractions for Node.js * * Copyright (c) 2018 NAN contributors * * MIT License ********************************************************************/ #ifndef NAN_NEW_H_ #define NAN_NEW_H_ namespace imp { // scnr // TODO(agnat): Generalize template v8::Local To(v8::Local i); template <> inline v8::Local To(v8::Local i) { return Nan::To(i).ToLocalChecked(); } template <> inline v8::Local To(v8::Local i) { return Nan::To(i).ToLocalChecked(); } template <> inline v8::Local To(v8::Local i) { return Nan::To(i).ToLocalChecked(); } template struct FactoryBase { typedef v8::Local return_t; }; template struct MaybeFactoryBase { typedef MaybeLocal return_t; }; template struct Factory; template <> struct Factory : FactoryBase { static inline return_t New(); static inline return_t New(int length); }; template <> struct Factory : FactoryBase { static inline return_t New(bool value); }; template <> struct Factory : FactoryBase { static inline return_t New(bool value); }; template <> struct Factory : FactoryBase { static inline return_t New( v8::ExtensionConfiguration* extensions = NULL , v8::Local tmpl = v8::Local() , v8::Local obj = v8::Local()); }; template <> struct Factory : MaybeFactoryBase { static inline return_t New(double value); }; template <> struct Factory : FactoryBase { static inline return_t New(void *value); }; template <> struct Factory : FactoryBase { static inline return_t New( FunctionCallback callback , v8::Local data = v8::Local()); }; template <> struct Factory : FactoryBase { static inline return_t New( FunctionCallback callback = NULL , v8::Local data = v8::Local() , v8::Local signature = v8::Local()); }; template <> struct Factory : FactoryBase { static inline return_t New(double value); }; template <> struct Factory : FactoryBase { static inline return_t New(double value); }; template struct IntegerFactory : FactoryBase { typedef typename FactoryBase::return_t return_t; static inline return_t New(int32_t value); static inline return_t New(uint32_t value); }; template <> struct Factory : IntegerFactory {}; template <> struct Factory : IntegerFactory {}; template <> struct Factory : FactoryBase { static inline return_t New(int32_t value); static inline return_t New(uint32_t value); }; template <> struct Factory : FactoryBase { static inline return_t New(); }; template <> struct Factory : FactoryBase { static inline return_t New(); }; template <> struct Factory : MaybeFactoryBase { static inline return_t New( v8::Local pattern, v8::RegExp::Flags flags); }; template <> struct Factory : MaybeFactoryBase { static inline return_t New( v8::Local source); static inline return_t New( v8::Local source , v8::ScriptOrigin const& origin); }; template <> struct Factory : FactoryBase { typedef v8::Local FTH; static inline return_t New(FTH receiver = FTH()); }; template <> struct Factory : MaybeFactoryBase { static inline return_t New(); static inline return_t New(const char *value, int length = -1); static inline return_t New(const uint16_t *value, int length = -1); static inline return_t New(std::string const& value); static inline return_t New(v8::String::ExternalStringResource * value); static inline return_t New(ExternalOneByteStringResource * value); }; template <> struct Factory : FactoryBase { static inline return_t New(v8::Local value); }; } // end of namespace imp #if (NODE_MODULE_VERSION >= 12) namespace imp { template <> struct Factory : MaybeFactoryBase { static inline return_t New( v8::Local source); static inline return_t New( v8::Local source , v8::ScriptOrigin const& origin); }; } // end of namespace imp # include "nan_implementation_12_inl.h" #else // NODE_MODULE_VERSION >= 12 # include "nan_implementation_pre_12_inl.h" #endif //=== API ====================================================================== template typename imp::Factory::return_t New() { return imp::Factory::New(); } template typename imp::Factory::return_t New(A0 arg0) { return imp::Factory::New(arg0); } template typename imp::Factory::return_t New(A0 arg0, A1 arg1) { return imp::Factory::New(arg0, arg1); } template typename imp::Factory::return_t New(A0 arg0, A1 arg1, A2 arg2) { return imp::Factory::New(arg0, arg1, arg2); } template typename imp::Factory::return_t New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) { return imp::Factory::New(arg0, arg1, arg2, arg3); } // Note(agnat): When passing overloaded function pointers to template functions // as generic arguments the compiler needs help in picking the right overload. // These two functions handle New and New with // all argument variations. // v8::Function and v8::FunctionTemplate with one or two arguments template typename imp::Factory::return_t New( FunctionCallback callback , v8::Local data = v8::Local()) { return imp::Factory::New(callback, data); } // v8::Function and v8::FunctionTemplate with three arguments template typename imp::Factory::return_t New( FunctionCallback callback , v8::Local data = v8::Local() , A2 a2 = A2()) { return imp::Factory::New(callback, data, a2); } // Convenience #if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION template inline v8::Local New(v8::Handle h); #endif #if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION template inline v8::Local New(v8::Persistent const& p); #else template inline v8::Local New(v8::Persistent const& p); #endif template inline v8::Local New(Persistent const& p); template inline v8::Local New(Global const& p); inline imp::Factory::return_t New(bool value) { return New(value); } inline imp::Factory::return_t New(int32_t value) { return New(value); } inline imp::Factory::return_t New(uint32_t value) { return New(value); } inline imp::Factory::return_t New(double value) { return New(value); } inline imp::Factory::return_t New(std::string const& value) { // NOLINT(build/include_what_you_use) return New(value); } inline imp::Factory::return_t New(const char * value, int length) { return New(value, length); } inline imp::Factory::return_t New(const uint16_t * value, int length) { return New(value, length); } inline imp::Factory::return_t New(const char * value) { return New(value); } inline imp::Factory::return_t New(const uint16_t * value) { return New(value); } inline imp::Factory::return_t New(v8::String::ExternalStringResource * value) { return New(value); } inline imp::Factory::return_t New(ExternalOneByteStringResource * value) { return New(value); } inline imp::Factory::return_t New(v8::Local pattern, v8::RegExp::Flags flags) { return New(pattern, flags); } #endif // NAN_NEW_H_