Skip to content

Commit bf406ea

Browse files
committed
Merge pull request #546 from nodegit/fix-promises-in-callbacks
This fixes polling sync promises in callbacks.
2 parents ef4d5e2 + 96b39b0 commit bf406ea

3 files changed

Lines changed: 16 additions & 7 deletions

File tree

generate/templates/partials/callback_helpers.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(uv_as
8080

8181
NanAssignPersistent(baton->promise, promise);
8282

83+
uv_close((uv_handle_t*) &baton->req, NULL);
8384
uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromisePolling);
8485
uv_async_send(&baton->req);
8586
return;
@@ -110,7 +111,9 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(uv_as
110111
baton->result = {{ cbFunction.return.noResults }};
111112
}
112113
{% endeach %}
114+
113115
baton->done = true;
116+
uv_close((uv_handle_t*) &baton->req, NULL);
114117
}
115118

116119
void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromisePolling(uv_async_t* req, int status) {
@@ -120,19 +123,19 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromis
120123
Local<Object> promise = NanNew<Object>(baton->promise);
121124
NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As<Function>());
122125
Local<Value> argv[1]; // MSBUILD won't assign an array of length 0
123-
Local<Boolean> isPending = isPendingFn->Call(0, argv)->ToBoolean();
126+
Local<Boolean> isPending = isPendingFn->Call(promise, 0, argv)->ToBoolean();
124127

125128
if (isPending->Value()) {
126129
uv_async_send(&baton->req);
127130
return;
128131
}
129132

130133
NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As<Function>());
131-
Local<Boolean> isFulfilled = isFulfilledFn->Call(0, argv)->ToBoolean();
134+
Local<Boolean> isFulfilled = isFulfilledFn->Call(promise, 0, argv)->ToBoolean();
132135

133136
if (isFulfilled->Value()) {
134137
NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As<Function>());
135-
Handle<v8::Value> result = resultFn->Call(0, argv);
138+
Handle<v8::Value> result = resultFn->Call(promise, 0, argv);
136139

137140
{% each cbFunction|returnsInfo false true as _return %}
138141
if (result.IsEmpty() || result->IsNativeError()) {
@@ -165,6 +168,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromis
165168
baton->result = {{ cbFunction.return.error }};
166169
baton->done = false;
167170
}
171+
172+
uv_close((uv_handle_t*) &baton->req, NULL);
168173
}
169174
{%endif%}
170175
{%endeach%}

generate/templates/partials/field_accessors.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173

174174
NanAssignPersistent(baton->promise, promise);
175175

176+
uv_close((uv_handle_t*) &baton->req, NULL);
176177
uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ field.name }}_asyncPromisePolling);
177178
uv_async_send(&baton->req);
178179
return;
@@ -204,6 +205,7 @@
204205
}
205206
{% endeach %}
206207
baton->done = true;
208+
uv_close((uv_handle_t*) &baton->req, NULL);
207209
}
208210

209211
void {{ cppClassName }}::{{ field.name }}_asyncPromisePolling(uv_async_t* req, int status) {
@@ -213,19 +215,19 @@
213215
Local<Object> promise = NanNew<Object>(baton->promise);
214216
NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As<Function>());
215217
Local<Value> argv[1]; // MSBUILD won't assign an array of length 0
216-
Local<Boolean> isPending = isPendingFn->Call(0, argv)->ToBoolean();
218+
Local<Boolean> isPending = isPendingFn->Call(promise, 0, argv)->ToBoolean();
217219

218220
if (isPending->Value()) {
219221
uv_async_send(&baton->req);
220222
return;
221223
}
222224

223225
NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As<Function>());
224-
Local<Boolean> isFulfilled = isFulfilledFn->Call(0, argv)->ToBoolean();
226+
Local<Boolean> isFulfilled = isFulfilledFn->Call(promise, 0, argv)->ToBoolean();
225227

226228
if (isFulfilled->Value()) {
227229
NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As<Function>());
228-
Handle<v8::Value> result = resultFn->Call(0, argv);
230+
Handle<v8::Value> result = resultFn->Call(promise, 0, argv);
229231

230232
{% each field|returnsInfo false true as _return %}
231233
if (result.IsEmpty() || result->IsNativeError()) {
@@ -258,6 +260,8 @@
258260
baton->result = {{ field.return.error }};
259261
baton->done = false;
260262
}
263+
264+
uv_close((uv_handle_t*) &baton->req, NULL);
261265
}
262266
{% endif %}
263267
{% endif %}

test/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ var args = cov.concat([
1515
"--expose-gc"
1616
]);
1717

18-
fork(bin, args, { cwd: path.join(__dirname, "../") }).on("close", process.exit);
18+
fork(bin, args, { cwd: path.join(__dirname, "../") });

0 commit comments

Comments
 (0)