|
11 | 11 | info.GetReturnValue().Set(Nan::New(wrapper->{{ field.name }})); |
12 | 12 |
|
13 | 13 | {% elsif field.isCallbackFunction %} |
14 | | - if (wrapper->{{field.name}}.HasCallback()) { |
15 | | - info.GetReturnValue().Set(wrapper->{{ field.name }}.GetCallback()->GetFunction()); |
| 14 | + if (wrapper->{{field.name}} != NULL) { |
| 15 | + info.GetReturnValue().Set(wrapper->{{ field.name }}->GetFunction()); |
16 | 16 | } else { |
17 | 17 | info.GetReturnValue().SetUndefined(); |
18 | 18 | } |
|
31 | 31 | } |
32 | 32 |
|
33 | 33 | NAN_SETTER({{ cppClassName }}::Set{{ field.cppFunctionName }}) { |
34 | | - Nan::HandleScope scope; |
35 | 34 |
|
36 | 35 | {{ cppClassName }} *wrapper = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This()); |
37 | 36 |
|
|
48 | 47 | wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert({{ field.name }}->ToObject()){% else %}Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>({{ field.name }}->ToObject())->GetValue(){% endif %}; |
49 | 48 |
|
50 | 49 | {% elsif field.isCallbackFunction %} |
51 | | - Nan::Callback *callback = NULL; |
52 | | - int throttle = {%if field.return.throttle %}{{ field.return.throttle }}{%else%}0{%endif%}; |
| 50 | + if (wrapper->{{ field.name }} != NULL) { |
| 51 | + delete wrapper->{{ field.name }}; |
| 52 | + } |
53 | 53 |
|
54 | 54 | if (value->IsFunction()) { |
55 | | - callback = new Nan::Callback(value.As<Function>()); |
56 | | - } else if (value->IsObject()) { |
57 | | - Local<Object> object = value.As<Object>(); |
58 | | - Local<String> callbackKey; |
59 | | - Nan::MaybeLocal<Value> maybeObjectCallback = Nan::Get(object, Nan::New("callback").ToLocalChecked()); |
60 | | - if (!maybeObjectCallback.IsEmpty()) { |
61 | | - Local<Value> objectCallback = maybeObjectCallback.ToLocalChecked(); |
62 | | - if (objectCallback->IsFunction()) { |
63 | | - callback = new Nan::Callback(objectCallback.As<Function>()); |
64 | | - Nan::MaybeLocal<Value> maybeObjectThrottle = Nan::Get(object, Nan::New("throttle").ToLocalChecked()); |
65 | | - if(!maybeObjectThrottle.IsEmpty()) { |
66 | | - Local<Value> objectThrottle = maybeObjectThrottle.ToLocalChecked(); |
67 | | - if (objectThrottle->IsNumber()) { |
68 | | - throttle = (int)objectThrottle.As<Number>()->Value(); |
69 | | - } |
70 | | - } |
71 | | - } |
72 | | - } |
73 | | - } |
74 | | - if (callback) { |
75 | 55 | if (!wrapper->raw->{{ field.name }}) { |
76 | 56 | wrapper->raw->{{ field.name }} = ({{ field.cType }}){{ field.name }}_cppCallback; |
77 | 57 | } |
78 | 58 |
|
79 | | - wrapper->{{ field.name }}.SetCallback(callback, throttle); |
| 59 | + wrapper->{{ field.name }} = new Nan::Callback(value.As<Function>()); |
80 | 60 | } |
81 | 61 |
|
82 | 62 | {% elsif field.payloadFor %} |
|
102 | 82 | } |
103 | 83 |
|
104 | 84 | {% if field.isCallbackFunction %} |
105 | | - {{ cppClassName }}* {{ cppClassName }}::{{ field.name }}_getInstanceFromBaton({{ field.name|titleCase }}Baton* baton) { |
106 | | - return static_cast<{{ cppClassName }}*>(baton->{% each field.args|argsInfo as arg %} |
107 | | - {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} |
108 | | - {% endeach %}); |
109 | | - } |
110 | | - |
111 | 85 | {{ field.return.type }} {{ cppClassName }}::{{ field.name }}_cppCallback ( |
112 | 86 | {% each field.args|argsInfo as arg %} |
113 | 87 | {{ arg.cType }} {{ arg.name}}{% if not arg.lastArg %},{% endif %} |
114 | 88 | {% endeach %} |
115 | 89 | ) { |
116 | | - {{ field.name|titleCase }}Baton* baton = |
117 | | - new {{ field.name|titleCase }}Baton({{ field.return.noResults }}); |
| 90 | + {{ field.name|titleCase }}Baton* baton = new {{ field.name|titleCase }}Baton(); |
118 | 91 |
|
119 | 92 | {% each field.args|argsInfo as arg %} |
120 | 93 | baton->{{ arg.name }} = {{ arg.name }}; |
121 | 94 | {% endeach %} |
122 | 95 |
|
123 | | - {{ cppClassName }}* instance = {{ field.name }}_getInstanceFromBaton(baton); |
| 96 | + baton->result = 0; |
| 97 | + baton->req.data = baton; |
| 98 | + baton->done = false; |
| 99 | + |
| 100 | + uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ field.name }}_async); |
| 101 | + { |
| 102 | + LockMaster::TemporaryUnlock temporaryUnlock; |
| 103 | + |
| 104 | + uv_async_send(&baton->req); |
124 | 105 |
|
125 | | - if (instance->{{ field.name }}.WillBeThrottled()) { |
126 | | - return baton->defaultResult; |
| 106 | + while(!baton->done) { |
| 107 | + sleep_for_ms(1); |
| 108 | + } |
127 | 109 | } |
128 | 110 |
|
129 | | - return baton->ExecuteAsync((uv_async_cb) {{ field.name }}_async); |
| 111 | + return baton->result; |
130 | 112 | } |
131 | 113 |
|
132 | 114 | void {{ cppClassName }}::{{ field.name }}_async(uv_async_t* req, int status) { |
133 | 115 | Nan::HandleScope scope; |
134 | 116 |
|
135 | 117 | {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(req->data); |
136 | | - {{ cppClassName }}* instance = {{ field.name }}_getInstanceFromBaton(baton); |
| 118 | + {{ cppClassName }}* instance = static_cast<{{ cppClassName }}*>(baton->{% each field.args|argsInfo as arg %} |
| 119 | + {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} |
| 120 | + {% endeach %}); |
137 | 121 |
|
138 | | - if (instance->{{ field.name }}.GetCallback()->IsEmpty()) { |
| 122 | + if (instance->{{ field.name }}->IsEmpty()) { |
139 | 123 | {% if field.return.type == "int" %} |
140 | | - baton->result = baton->defaultResult; // no results acquired |
| 124 | + baton->result = {{ field.return.noResults }}; // no results acquired |
141 | 125 | {% endif %} |
142 | 126 |
|
143 | 127 | baton->done = true; |
|
179 | 163 | }; |
180 | 164 |
|
181 | 165 | Nan::TryCatch tryCatch; |
182 | | - Local<v8::Value> result = instance->{{ field.name }}.GetCallback()->Call({{ field.args|jsArgsCount }}, argv); |
| 166 | + Local<v8::Value> result = instance->{{ field.name }}->Call({{ field.args|jsArgsCount }}, argv); |
183 | 167 |
|
184 | 168 | uv_close((uv_handle_t*) &baton->req, NULL); |
185 | 169 |
|
|
203 | 187 | baton->result = (int)result->ToNumber()->Value(); |
204 | 188 | } |
205 | 189 | else { |
206 | | - baton->result = baton->defaultResult; |
| 190 | + baton->result = {{ field.return.noResults }}; |
207 | 191 | } |
208 | 192 | {% endif %} |
209 | 193 | } |
210 | 194 | else { |
211 | | - baton->result = baton->defaultResult; |
| 195 | + baton->result = {{ field.return.noResults }}; |
212 | 196 | } |
213 | 197 | {% endeach %} |
214 | 198 | baton->done = true; |
|
236 | 220 | baton->result = (int)result->ToNumber()->Value(); |
237 | 221 | } |
238 | 222 | else{ |
239 | | - baton->result = baton->defaultResult; |
| 223 | + baton->result = {{ field.return.noResults }}; |
240 | 224 | } |
241 | 225 | {% endif %} |
242 | 226 | } |
243 | 227 | else { |
244 | | - baton->result = baton->defaultResult; |
| 228 | + baton->result = {{ field.return.noResults }}; |
245 | 229 | } |
246 | 230 | {% endeach %} |
247 | 231 | } |
|
0 commit comments