Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nogcmacro #489

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
102 changes: 68 additions & 34 deletions nan.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,34 @@ namespace Nan {

//=== RegistrationFunction =====================================================

typedef void (*addon_reg_func_t)(v8::Local<v8::Object> target);

#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION
namespace imp {
template<addon_reg_func_t F>
static inline void addon_reg_func(v8::Handle<v8::Object> target) {
v8::HandleScope scope;
F(v8::Local<v8::Object>::New(target));
}
}
#elif NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
namespace imp {
template<addon_reg_func_t F>
static inline void addon_reg_func(v8::Handle<v8::Object> target) {
v8::Isolate *isolate = v8::Isolate::GetCurrent();
v8::HandleScope scope(isolate);
F(v8::Local<v8::Object>::New(isolate, target));
}
}
#endif

#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
typedef v8::Handle<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
# define NAN_MODULE(modname, regfunc) \
NODE_MODULE(modname, Nan::imp::addon_reg_func<regfunc>)
#else
typedef v8::Local<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
# define NAN_MODULE(modname, regfunc) NODE_MODULE(modname, regfunc)
#endif

#define NAN_MODULE_INIT(name) \
void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target)

//=== CallbackInfo =============================================================

#include "nan_callbacks.h" // NOLINT(build/include)
Expand Down Expand Up @@ -595,29 +614,43 @@ class TryCatch {
object->SetAlignedPointerInInternalField(index, value);
}

# define NAN_GC_CALLBACK(name) \
void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags)
typedef void (*GCCallback)(v8::GCType type, v8::GCCallbackFlags flags);

namespace imp {
template<GCCallback F>
class GCCallback {
public:
static void call(
v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags) {
F(type, flags);
}
};
}

template<GCCallback F>
NAN_INLINE void AddGCEpilogueCallback(
v8::Isolate::GCEpilogueCallback callback
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter);
v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::Isolate::GetCurrent()->AddGCEpilogueCallback(
imp::GCCallback<F>::call, gc_type_filter);
}

NAN_INLINE void RemoveGCEpilogueCallback(
v8::Isolate::GCEpilogueCallback callback) {
v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback);
template<GCCallback F>
NAN_INLINE void RemoveGCEpilogueCallback() {
v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(
imp::GCCallback<F>::call);
}

template<GCCallback F>
NAN_INLINE void AddGCPrologueCallback(
v8::Isolate::GCPrologueCallback callback
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter);
v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::Isolate::GetCurrent()->AddGCPrologueCallback(
imp::GCCallback<F>::call, gc_type_filter);
}

NAN_INLINE void RemoveGCPrologueCallback(
v8::Isolate::GCPrologueCallback callback) {
v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback);
template<GCCallback F>
NAN_INLINE void RemoveGCPrologueCallback() {
v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(
imp::GCCallback<F>::call);
}

NAN_INLINE void GetHeapStatistics(
Expand Down Expand Up @@ -981,26 +1014,25 @@ class Utf8String {
object->SetPointerInInternalField(index, value);
}

# define NAN_GC_CALLBACK(name) \
void name(v8::GCType type, v8::GCCallbackFlags flags)
typedef void (*GCCallback)(v8::GCType type, v8::GCCallbackFlags flags);

template<GCCallback F>
NAN_INLINE void AddGCEpilogueCallback(
v8::GCEpilogueCallback callback
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::V8::AddGCEpilogueCallback(callback, gc_type_filter);
v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::V8::AddGCEpilogueCallback(F, gc_type_filter);
}
NAN_INLINE void RemoveGCEpilogueCallback(
v8::GCEpilogueCallback callback) {
v8::V8::RemoveGCEpilogueCallback(callback);
template<GCCallback F>
NAN_INLINE void RemoveGCEpilogueCallback() {
v8::V8::RemoveGCEpilogueCallback(F);
}
template<GCCallback F>
NAN_INLINE void AddGCPrologueCallback(
v8::GCPrologueCallback callback
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::V8::AddGCPrologueCallback(callback, gc_type_filter);
v8::GCType gc_type_filter = v8::kGCTypeAll) {
v8::V8::AddGCPrologueCallback(F, gc_type_filter);
}
NAN_INLINE void RemoveGCPrologueCallback(
v8::GCPrologueCallback callback) {
v8::V8::RemoveGCPrologueCallback(callback);
template<GCCallback F>
NAN_INLINE void RemoveGCPrologueCallback() {
v8::V8::RemoveGCPrologueCallback(F);
}
NAN_INLINE void GetHeapStatistics(
v8::HeapStatistics *heap_statistics) {
Expand Down Expand Up @@ -1341,6 +1373,8 @@ typedef void NAN_INDEX_QUERY_RETURN_TYPE;
Nan::NAN_INDEX_QUERY_RETURN_TYPE name( \
uint32_t index \
, Nan::NAN_INDEX_QUERY_ARGS_TYPE info)
# define NAN_GC_CALLBACK(name) \
void name(v8::GCType type, v8::GCCallbackFlags flags)

class Callback {
public:
Expand Down Expand Up @@ -2156,7 +2190,7 @@ inline void SetCallAsFunctionHandler(

inline
void
Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name,
Export(v8::Local<v8::Object> target, const char *name,
FunctionCallback f) {
Set(target, New<v8::String>(name).ToLocalChecked(),
GetFunction(New<v8::FunctionTemplate>(f)).ToLocalChecked());
Expand Down
6 changes: 3 additions & 3 deletions test/cpp/accessors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ using namespace Nan; // NOLINT(build/namespaces)

class SetterGetter : public ObjectWrap {
public:
static NAN_MODULE_INIT(Init);
static void Init(v8::Local<v8::Object> target);
static v8::Local<v8::Value> NewInstance ();
static NAN_METHOD(New);
static NAN_METHOD(Log);
Expand Down Expand Up @@ -41,7 +41,7 @@ SetterGetter::SetterGetter() {
prop2[0] = '\0';
}

NAN_MODULE_INIT(SetterGetter::Init) {
void SetterGetter::Init(v8::Local<v8::Object> target) {
v8::Local<v8::FunctionTemplate> tpl =
Nan::New<v8::FunctionTemplate>(SetterGetter::New);
settergetter_constructor.Reset(tpl);
Expand Down Expand Up @@ -162,4 +162,4 @@ NAN_METHOD(SetterGetter::Log) {
info.GetReturnValue().Set(Nan::New(settergetter->log).ToLocalChecked());
}

NODE_MODULE(accessors, SetterGetter::Init)
NAN_MODULE(accessors, SetterGetter::Init)
6 changes: 3 additions & 3 deletions test/cpp/accessors2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ using namespace Nan; // NOLINT(build/namespaces)

class SetterGetter : public ObjectWrap {
public:
static NAN_MODULE_INIT(Init);
static void Init(v8::Local<v8::Object> target);
static v8::Local<v8::Value> NewInstance ();
static NAN_METHOD(New);
static NAN_METHOD(Log);
Expand Down Expand Up @@ -41,7 +41,7 @@ SetterGetter::SetterGetter() {
prop2[0] = '\0';
}

NAN_MODULE_INIT(SetterGetter::Init) {
void SetterGetter::Init(v8::Local<v8::Object> target) {
v8::Local<v8::FunctionTemplate> tpl =
Nan::New<v8::FunctionTemplate>(SetterGetter::New);
settergetter_constructor.Reset(tpl);
Expand Down Expand Up @@ -160,4 +160,4 @@ NAN_METHOD(SetterGetter::Log) {
info.GetReturnValue().Set(Nan::New(settergetter->log).ToLocalChecked());
}

NODE_MODULE(accessors2, SetterGetter::Init)
NAN_MODULE(accessors2, SetterGetter::Init)
4 changes: 2 additions & 2 deletions test/cpp/asyncprogressworker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ NAN_METHOD(DoProgress) {
, To<uint32_t>(info[1]).FromJust()));
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New<v8::String>("a").ToLocalChecked()
, New<v8::FunctionTemplate>(DoProgress)->GetFunction());
}

NODE_MODULE(asyncprogressworker, Init)
NAN_MODULE(asyncprogressworker, Init)
4 changes: 2 additions & 2 deletions test/cpp/asyncworker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ NAN_METHOD(DoSleep) {
new SleepWorker(callback, To<uint32_t>(info[0]).FromJust()));
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New<v8::String>("a").ToLocalChecked()
, New<v8::FunctionTemplate>(DoSleep)->GetFunction());
}

NODE_MODULE(asyncworker, Init)
NAN_MODULE(asyncworker, Init)
4 changes: 2 additions & 2 deletions test/cpp/asyncworkererror.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ NAN_METHOD(Work) {
info.GetReturnValue().SetUndefined();
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New("a").ToLocalChecked()
, New<v8::FunctionTemplate>(Work)->GetFunction());
}

NODE_MODULE(asyncworkererror, Init)
NAN_MODULE(asyncworkererror, Init)
4 changes: 2 additions & 2 deletions test/cpp/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ NAN_METHOD(Copy) {
}


NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
for (unsigned char i = 0; i < DATA_SIZE; i++) {
data[i] = 'a' + i;
}
Expand All @@ -72,4 +72,4 @@ NAN_MODULE_INIT(Init) {
);
}

NODE_MODULE(buffer, Init)
NAN_MODULE(buffer, Init)
4 changes: 2 additions & 2 deletions test/cpp/bufferworkerpersistent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ NAN_METHOD(DoSleep) {
, bufferHandle));
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New<v8::String>("a").ToLocalChecked()
, New<v8::FunctionTemplate>(DoSleep)->GetFunction());
}

NODE_MODULE(bufferworkerpersistent, Init)
NAN_MODULE(bufferworkerpersistent, Init)
4 changes: 2 additions & 2 deletions test/cpp/converters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ NAN_METHOD(Int32Value) {
info.GetReturnValue().Set(New(To<int32_t>(info[0]).FromJust()));
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New<v8::String>("toBoolean").ToLocalChecked()
, New<v8::FunctionTemplate>(ToBoolean)->GetFunction()
Expand Down Expand Up @@ -127,4 +127,4 @@ NAN_MODULE_INIT(Init) {
);
}

NODE_MODULE(converters, Init)
NAN_MODULE(converters, Init)
4 changes: 2 additions & 2 deletions test/cpp/error.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ X(TypeError)
, Nan::New<v8::FunctionTemplate>(NAME)->GetFunction());


NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
EXPORT_ERROR_FUNCTIONS(Error)
EXPORT_ERROR_FUNCTIONS(RangeError)
EXPORT_ERROR_FUNCTIONS(ReferenceError)
Expand All @@ -59,4 +59,4 @@ NAN_MODULE_INIT(Init) {
#undef EXPORT_ERROR_FUNCTIONS
#undef X

NODE_MODULE(error, Init)
NAN_MODULE(error, Init)
14 changes: 8 additions & 6 deletions test/cpp/gc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,28 @@ NAN_GC_CALLBACK(gcEpilogueCallback) {
}

NAN_METHOD(Hook) {
AddGCPrologueCallback(gcPrologueCallback);
AddGCEpilogueCallback(gcEpilogueCallback);
AddGCPrologueCallback<gcPrologueCallback>();
AddGCEpilogueCallback<gcEpilogueCallback>();
info.GetReturnValue().SetUndefined();
}

NAN_METHOD(Check) {
HandleScope scope;
info.GetReturnValue().Set(
New(prologue_called && epilogue_called));
RemoveGCPrologueCallback<gcPrologueCallback>();
RemoveGCEpilogueCallback<gcEpilogueCallback>();
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New<v8::String>("hook").ToLocalChecked()
, New<v8::FunctionTemplate>(Hook)->GetFunction()
, GetFunction(New<v8::FunctionTemplate>(Hook)).ToLocalChecked()
);
Set(target
, New<v8::String>("check").ToLocalChecked()
, New<v8::FunctionTemplate>(Check)->GetFunction()
, GetFunction(New<v8::FunctionTemplate>(Check)).ToLocalChecked()
);
}

NODE_MODULE(gc, Init)
NAN_MODULE(gc, Init)
6 changes: 3 additions & 3 deletions test/cpp/indexedinterceptors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class IndexedInterceptor : public ObjectWrap {

public:
IndexedInterceptor() { std::strncpy(this->buf, "foo", sizeof (this->buf)); }
static NAN_MODULE_INIT(Init);
static void Init(v8::Local<v8::Object> target);
static v8::Local<v8::Value> NewInstance ();
static NAN_METHOD(New);

Expand All @@ -33,7 +33,7 @@ NAN_METHOD(CreateNew) {
info.GetReturnValue().Set(IndexedInterceptor::NewInstance());
}

NAN_MODULE_INIT(IndexedInterceptor::Init) {
void IndexedInterceptor::Init(v8::Local<v8::Object> target) {
v8::Local<v8::FunctionTemplate> tpl =
Nan::New<v8::FunctionTemplate>(IndexedInterceptor::New);
indexedinterceptors_constructor.Reset(tpl);
Expand Down Expand Up @@ -113,4 +113,4 @@ NAN_INDEX_QUERY(IndexedInterceptor::PropertyQuery) {
}
}

NODE_MODULE(indexedinterceptors, IndexedInterceptor::Init)
NAN_MODULE(indexedinterceptors, IndexedInterceptor::Init)
4 changes: 2 additions & 2 deletions test/cpp/isolatedata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ NAN_METHOD(SetAndGet) {
info.GetReturnValue().Set(New<v8::Boolean>(d0 == d1));
}

NAN_MODULE_INIT(Init) {
void Init(v8::Local<v8::Object> target) {
Set(target
, New<v8::String>("setAndGet").ToLocalChecked()
, New<v8::FunctionTemplate>(SetAndGet)->GetFunction()
);
}

NODE_MODULE(isolatedata, Init)
NAN_MODULE(isolatedata, Init)
6 changes: 3 additions & 3 deletions test/cpp/makecallback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ using namespace Nan; // NOLINT(build/namespaces)

class MyObject : public node::ObjectWrap {
public:
static NAN_MODULE_INIT(Init);
static void Init(v8::Local<v8::Object> target);

private:
MyObject();
Expand All @@ -31,7 +31,7 @@ MyObject::MyObject() {
MyObject::~MyObject() {
}

NAN_MODULE_INIT(MyObject::Init) {
void MyObject::Init(v8::Local<v8::Object> target) {
// Prepare constructor template
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
tpl->SetClassName(Nan::New<v8::String>("MyObject").ToLocalChecked());
Expand Down Expand Up @@ -63,4 +63,4 @@ NAN_METHOD(MyObject::CallEmit) {
info.GetReturnValue().SetUndefined();
}

NODE_MODULE(makecallback, MyObject::Init)
NAN_MODULE(makecallback, MyObject::Init)