Skip to content

Commit 522aa35

Browse files
committed
Removed need for NAN_GC_CALLBACK
1 parent 9f42b4c commit 522aa35

File tree

2 files changed

+49
-32
lines changed

2 files changed

+49
-32
lines changed

nan.h

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -595,29 +595,43 @@ class TryCatch {
595595
object->SetAlignedPointerInInternalField(index, value);
596596
}
597597

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

600+
namespace imp {
601+
template<GCCallback F>
602+
class GCCallback {
603+
public:
604+
static void call(
605+
v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags) {
606+
F(type, flags);
607+
}
608+
};
609+
}
610+
611+
template<GCCallback F>
601612
NAN_INLINE void AddGCEpilogueCallback(
602-
v8::Isolate::GCEpilogueCallback callback
603-
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
604-
v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter);
613+
v8::GCType gc_type_filter = v8::kGCTypeAll) {
614+
v8::Isolate::GetCurrent()->AddGCEpilogueCallback(
615+
imp::GCCallback<F>::call, gc_type_filter);
605616
}
606617

607-
NAN_INLINE void RemoveGCEpilogueCallback(
608-
v8::Isolate::GCEpilogueCallback callback) {
609-
v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback);
618+
template<GCCallback F>
619+
NAN_INLINE void RemoveGCEpilogueCallback() {
620+
v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(
621+
imp::GCCallback<F>::call);
610622
}
611623

624+
template<GCCallback F>
612625
NAN_INLINE void AddGCPrologueCallback(
613-
v8::Isolate::GCPrologueCallback callback
614-
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
615-
v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter);
626+
v8::GCType gc_type_filter = v8::kGCTypeAll) {
627+
v8::Isolate::GetCurrent()->AddGCPrologueCallback(
628+
imp::GCCallback<F>::call, gc_type_filter);
616629
}
617630

618-
NAN_INLINE void RemoveGCPrologueCallback(
619-
v8::Isolate::GCPrologueCallback callback) {
620-
v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback);
631+
template<GCCallback F>
632+
NAN_INLINE void RemoveGCPrologueCallback() {
633+
v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(
634+
imp::GCCallback<F>::call);
621635
}
622636

623637
NAN_INLINE void GetHeapStatistics(
@@ -981,26 +995,25 @@ class Utf8String {
981995
object->SetPointerInInternalField(index, value);
982996
}
983997

984-
# define NAN_GC_CALLBACK(name) \
985-
void name(v8::GCType type, v8::GCCallbackFlags flags)
998+
typedef void (*GCCallback)(v8::GCType type, v8::GCCallbackFlags flags);
986999

1000+
template<GCCallback F>
9871001
NAN_INLINE void AddGCEpilogueCallback(
988-
v8::GCEpilogueCallback callback
989-
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
990-
v8::V8::AddGCEpilogueCallback(callback, gc_type_filter);
1002+
v8::GCType gc_type_filter = v8::kGCTypeAll) {
1003+
v8::V8::AddGCEpilogueCallback(F, gc_type_filter);
9911004
}
992-
NAN_INLINE void RemoveGCEpilogueCallback(
993-
v8::GCEpilogueCallback callback) {
994-
v8::V8::RemoveGCEpilogueCallback(callback);
1005+
template<GCCallback F>
1006+
NAN_INLINE void RemoveGCEpilogueCallback() {
1007+
v8::V8::RemoveGCEpilogueCallback(F);
9951008
}
1009+
template<GCCallback F>
9961010
NAN_INLINE void AddGCPrologueCallback(
997-
v8::GCPrologueCallback callback
998-
, v8::GCType gc_type_filter = v8::kGCTypeAll) {
999-
v8::V8::AddGCPrologueCallback(callback, gc_type_filter);
1011+
v8::GCType gc_type_filter = v8::kGCTypeAll) {
1012+
v8::V8::AddGCPrologueCallback(F, gc_type_filter);
10001013
}
1001-
NAN_INLINE void RemoveGCPrologueCallback(
1002-
v8::GCPrologueCallback callback) {
1003-
v8::V8::RemoveGCPrologueCallback(callback);
1014+
template<GCCallback F>
1015+
NAN_INLINE void RemoveGCPrologueCallback() {
1016+
v8::V8::RemoveGCPrologueCallback(F);
10041017
}
10051018
NAN_INLINE void GetHeapStatistics(
10061019
v8::HeapStatistics *heap_statistics) {
@@ -1341,6 +1354,8 @@ typedef void NAN_INDEX_QUERY_RETURN_TYPE;
13411354
Nan::NAN_INDEX_QUERY_RETURN_TYPE name( \
13421355
uint32_t index \
13431356
, Nan::NAN_INDEX_QUERY_ARGS_TYPE info)
1357+
# define NAN_GC_CALLBACK(name) \
1358+
void name(v8::GCType type, v8::GCCallbackFlags flags)
13441359

13451360
class Callback {
13461361
public:

test/cpp/gc.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,27 @@ NAN_GC_CALLBACK(gcEpilogueCallback) {
2222
}
2323

2424
NAN_METHOD(Hook) {
25-
AddGCPrologueCallback(gcPrologueCallback);
26-
AddGCEpilogueCallback(gcEpilogueCallback);
25+
AddGCPrologueCallback<gcPrologueCallback>();
26+
AddGCEpilogueCallback<gcEpilogueCallback>();
2727
info.GetReturnValue().SetUndefined();
2828
}
2929

3030
NAN_METHOD(Check) {
3131
HandleScope scope;
3232
info.GetReturnValue().Set(
3333
New(prologue_called && epilogue_called));
34+
RemoveGCPrologueCallback<gcPrologueCallback>();
35+
RemoveGCEpilogueCallback<gcEpilogueCallback>();
3436
}
3537

3638
NAN_MODULE_INIT(Init) {
3739
Set(target
3840
, New<v8::String>("hook").ToLocalChecked()
39-
, New<v8::FunctionTemplate>(Hook)->GetFunction()
41+
, GetFunction(New<v8::FunctionTemplate>(Hook)).ToLocalChecked()
4042
);
4143
Set(target
4244
, New<v8::String>("check").ToLocalChecked()
43-
, New<v8::FunctionTemplate>(Check)->GetFunction()
45+
, GetFunction(New<v8::FunctionTemplate>(Check)).ToLocalChecked()
4446
);
4547
}
4648

0 commit comments

Comments
 (0)