diff --git a/nan.h b/nan.h index 49921e0f..5f9ba9e3 100644 --- a/nan.h +++ b/nan.h @@ -1601,6 +1601,22 @@ class NanCallback { return !this->operator==(other); } + NAN_INLINE + v8::Local operator*() const { return this->GetFunction(); } + + NAN_INLINE v8::Local operator()( + v8::Handle target + , int argc = 0 + , v8::Handle argv[] = 0) const { + return this->Call(target, argc, argv); + } + + NAN_INLINE v8::Local operator()( + int argc = 0 + , v8::Handle argv[] = 0) const { + return this->Call(argc, argv); + } + NAN_INLINE void SetFunction(const v8::Handle &fn) { NanScope(); NanNew(handle)->Set(kCallbackIndex, fn); @@ -1617,7 +1633,7 @@ class NanCallback { return NanNew(handle)->Get(kCallbackIndex)->IsUndefined(); } - NAN_INLINE v8::Handle + NAN_INLINE v8::Local Call(v8::Handle target , int argc , v8::Handle argv[]) const { @@ -1629,7 +1645,7 @@ class NanCallback { #endif } - NAN_INLINE v8::Handle + NAN_INLINE v8::Local Call(int argc, v8::Handle argv[]) const { #if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) v8::Isolate *isolate = v8::Isolate::GetCurrent(); @@ -1645,7 +1661,7 @@ class NanCallback { static const uint32_t kCallbackIndex = 0; #if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) - v8::Handle Call_(v8::Isolate *isolate + v8::Local Call_(v8::Isolate *isolate , v8::Handle target , int argc , v8::Handle argv[]) const { @@ -1653,16 +1669,16 @@ class NanCallback { v8::Local callback = NanNew(handle)-> Get(kCallbackIndex).As(); - return NanEscapeScope(node::MakeCallback( + return NanEscapeScope(NanNew(node::MakeCallback( isolate , target , callback , argc , argv - )); + ))); } #else - v8::Handle Call_(v8::Handle target + v8::Local Call_(v8::Handle target , int argc , v8::Handle argv[]) const { NanEscapableScope(); @@ -1670,12 +1686,12 @@ class NanCallback { #if NODE_VERSION_AT_LEAST(0, 8, 0) v8::Local callback = handle-> Get(kCallbackIndex).As(); - return NanEscapeScope(node::MakeCallback( + return NanEscapeScope(NanNew(node::MakeCallback( target , callback , argc , argv - )); + ))); #else v8::Local callback = handle-> Get(kCallbackIndex).As(); diff --git a/test/cpp/nancallback.cpp b/test/cpp/nancallback.cpp index b25bf876..9989befc 100644 --- a/test/cpp/nancallback.cpp +++ b/test/cpp/nancallback.cpp @@ -42,6 +42,18 @@ NAN_METHOD(CompareCallbacks) { NanReturnValue(NanNew(cb1 == cb2 && cb1 != cb3)); } +NAN_METHOD(CallDirect) { + NanScope(); + + NanCallback cb(args[0].As()); + (*cb)->Call(NanGetCurrentContext()->Global(), 0, NULL); + NanReturnUndefined(); +} + +NAN_METHOD(CallAsFunction) { + NanCallback(args[0].As())(); +} + void Init (v8::Handle target) { target->Set( NanNew("globalContext") @@ -59,6 +71,14 @@ void Init (v8::Handle target) { NanNew("compareCallbacks") , NanNew(CompareCallbacks)->GetFunction() ); + target->Set( + NanNew("callDirect") + , NanNew(CallDirect)->GetFunction() + ); + target->Set( + NanNew("callAsFunction") + , NanNew(CallAsFunction)->GetFunction() + ); } NODE_MODULE(nancallback, Init) diff --git a/test/js/nancallback-test.js b/test/js/nancallback-test.js index 7c8cc2d1..f766f2ec 100644 --- a/test/js/nancallback-test.js +++ b/test/js/nancallback-test.js @@ -12,16 +12,20 @@ const test = require('tap').test , round = Math.round; test('nancallback', function (t) { - t.plan(9) + t.plan(13) var persistent = bindings; t.type(persistent.globalContext, 'function'); t.type(persistent.specificContext, 'function'); t.type(persistent.customReceiver, 'function'); t.type(persistent.compareCallbacks, 'function'); + t.type(persistent.callDirect, 'function'); + t.type(persistent.callAsFunction, 'function'); persistent.globalContext(function () { t.ok(true); }); persistent.specificContext(function () { t.ok(true); }); persistent.customReceiver(function () { t.equal(this, process); }, process); + persistent.callDirect(function () { t.ok(true); }); + persistent.callAsFunction(function () { t.ok(true); }); var round2 = Math.round , x = function(param) { return param + 1; }