@@ -28,6 +28,7 @@ void DoAsync(uv_work_t* r) {
28
28
req->output = req->input * 2 ;
29
29
}
30
30
31
+ template <bool use_makecallback>
31
32
void AfterAsync (uv_work_t * r) {
32
33
async_req* req = reinterpret_cast <async_req*>(r->data );
33
34
v8::Isolate* isolate = req->isolate ;
@@ -40,9 +41,18 @@ void AfterAsync(uv_work_t* r) {
40
41
41
42
v8::TryCatch try_catch (isolate);
42
43
44
+ v8::Local<v8::Object> global = isolate->GetCurrentContext ()->Global ();
43
45
v8::Local<v8::Function> callback =
44
46
v8::Local<v8::Function>::New (isolate, req->callback );
45
- callback->Call (isolate->GetCurrentContext ()->Global (), 2 , argv);
47
+
48
+ if (use_makecallback) {
49
+ v8::Local<v8::Value> ret =
50
+ node::MakeCallback (isolate, global, callback, 2 , argv);
51
+ // This should be changed to an empty handle.
52
+ assert (!ret.IsEmpty ());
53
+ } else {
54
+ callback->Call (global, 2 , argv);
55
+ }
46
56
47
57
// cleanup
48
58
req->callback .Reset ();
@@ -53,6 +63,7 @@ void AfterAsync(uv_work_t* r) {
53
63
}
54
64
}
55
65
66
+ template <bool use_makecallback>
56
67
void Method (const v8::FunctionCallbackInfo<v8::Value>& args) {
57
68
v8::Isolate* isolate = args.GetIsolate ();
58
69
@@ -69,11 +80,12 @@ void Method(const v8::FunctionCallbackInfo<v8::Value>& args) {
69
80
uv_queue_work (uv_default_loop (),
70
81
&req->req ,
71
82
DoAsync,
72
- (uv_after_work_cb)AfterAsync);
83
+ (uv_after_work_cb)AfterAsync<use_makecallback> );
73
84
}
74
85
75
86
void init (v8::Local<v8::Object> exports, v8::Local<v8::Object> module) {
76
- NODE_SET_METHOD (module, " exports" , Method);
87
+ NODE_SET_METHOD (exports, " runCall" , Method<false >);
88
+ NODE_SET_METHOD (exports, " runMakeCallback" , Method<true >);
77
89
}
78
90
79
91
NODE_MODULE (binding, init)
0 commit comments