Skip to content

Commit 530290d

Browse files
author
John Haley
committed
Handle global payloads in functions
1 parent 0a7ac52 commit 530290d

5 files changed

Lines changed: 53 additions & 30 deletions

File tree

generate/scripts/helpers.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ var Helpers = {
121121
processPayload: function(field, allFields) {
122122
if (field.name === "payload") {
123123
field.payloadFor = "*";
124+
field.globalPayload = true;
124125
field.isOptional = true;
125126
}
126127
else {

generate/templates/partials/async_function.cc

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) {
1212
baton->error_code = GIT_OK;
1313
baton->error = NULL;
1414

15+
{%each args|argsInfo as arg %}
16+
{%if arg.globalPayload %}
17+
{{ cppFunctionName }}_globalPayload* globalPayload = new {{ cppFunctionName }}_globalPayload;
18+
{%endif%}
19+
{%endeach%}
20+
1521
{%each args|argsInfo as arg %}
1622
{%if not arg.isReturn %}
1723
{%if arg.isSelf %}
@@ -23,10 +29,16 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) {
2329
}
2430
else {
2531
baton->{{ arg.name}} = {{ cppFunctionName }}_{{ arg.name }}_cppCallback;
32+
{%if arg.payload.globalPayload %}
33+
globalPayload->{{ arg.name }} = new NanCallback(args[{{ arg.jsArg }}].As<Function>());
34+
{%else%}
2635
baton->{{ arg.payload.name }} = new NanCallback(args[{{ arg.jsArg }}].As<Function>());
36+
{%endif%}
2737
}
2838
{%elsif arg.payloadFor %}
29-
{%-- payloads are ignored --%}
39+
{%if arg.globalPayload %}
40+
baton->{{ arg.name }} = globalPayload;
41+
{%endif%}
3042
{%elsif arg.name %}
3143
{%partial convertFromV8 arg%}
3244
{%if not arg.payloadFor %}
@@ -134,7 +146,16 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() {
134146
free((void*)baton->{{ arg.name }});
135147
}
136148
{%elsif arg.isCallbackFunction %}
149+
{%if not arg.payload.globalPayload %}
137150
delete baton->{{ arg.payload.name }};
151+
{%endif%}
152+
{%elsif arg.globalPayload %}
153+
{%each args|argsInfo as cbArg %}
154+
{%if cbArg.isCallbackFunction %}
155+
delete (({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }})->{{ cbArg.name }};
156+
{%endif%}
157+
{%endeach%}
158+
free((void *)baton->{{ arg.name }});
138159
{%else%}
139160
free((void*)baton->{{ arg.name }});
140161
{%endif%}
@@ -159,7 +180,16 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() {
159180
free((void *)baton->{{ arg.name }});
160181
}
161182
{%elsif arg.isCallbackFunction %}
183+
{%if not arg.payload.globalPayload %}
162184
delete (NanCallback *)baton->{{ arg.payload.name }};
185+
{%endif%}
186+
{%elsif arg.globalPayload %}
187+
{%each args|argsInfo as cbArg %}
188+
{%if cbArg.isCallbackFunction %}
189+
delete (({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }})->{{ cbArg.name }};
190+
{%endif%}
191+
{%endeach%}
192+
free((void *)baton->{{ arg.name }});
163193
{%endif%}
164194
{%endeach%}
165195

generate/templates/partials/callback_helpers.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncAfter(
4444

4545
{% each cbFunction.args|argsInfo as arg %}
4646
{% if arg | isPayload %}
47+
{% if cbFunction.payload.globalPayload %}
48+
NanCallback* callback = (({{ cppFunctionName }}_globalPayload*)baton->{{ arg.name }})->{{ cbFunction.name }};
49+
{% else %}
4750
NanCallback* callback = (NanCallback *)baton->{{ arg.name }};
51+
{% endif %}
4852
{% endif %}
4953
{% endeach %}
5054

generate/templates/partials/sync_function.cc

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,20 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) {
1515
{%each args|argsInfo as arg %}
1616
{%if not arg.isSelf %}
1717
{%if not arg.isReturn %}
18-
{%if not arg.isCallbackFunction %}
19-
{%if not arg.payloadFor %}
20-
{%partial convertFromV8 arg %}
21-
{%if arg.saveArg %}
18+
{%partial convertFromV8 arg %}
19+
{%if arg.saveArg %}
2220
Handle<Object> {{ arg.name }}(args[{{ arg.jsArg }}]->ToObject());
2321
{{ cppClassName }} *thisObj = ObjectWrap::Unwrap<{{ cppClassName }}>(args.This());
2422

2523
NanDisposePersistent(thisObj->{{ cppFunctionName }}_{{ arg.name }});
2624

2725
NanAssignPersistent(thisObj->{{ cppFunctionName }}_{{ arg.name }}, {{ arg.name }});
28-
{%endif%}
29-
{%endif%}
3026
{%endif%}
3127
{%endif%}
3228
{%endif%}
3329
{%endeach%}
3430

3531
{%each args|argsInfo as arg %}
36-
{%if arg.isCallbackFunction %}
37-
NanCallback* {{ arg.name }}_callback = new NanCallback(args[{{ arg.jsArg }}].As<Function>());
38-
{%endif%}
3932
{%endeach%}
4033
{%if .|hasReturns %}
4134
{{ return.cType }} result = {%endif%}{{ cFunctionName }}(
@@ -47,24 +40,13 @@ NanCallback* {{ arg.name }}_callback = new NanCallback(args[{{ arg.jsArg }}].As<
4740
ObjectWrap::Unwrap<{{ arg.cppClassName }}>(args.This())->GetValue()
4841
{%elsif arg.isReturn %}
4942
{{ arg.name }}
50-
{%elsif arg.isCallbackFunction %}
51-
{{ cppFunctionName }}_{{ arg.name }}_cppCallback,
52-
{{ arg.name }}_callback
53-
{%elsif arg.payloadFor %}
54-
{%-- payloads are handled inside of the callback condition --%}
5543
{%else%}
5644
from_{{ arg.name }}
5745
{%endif%}
5846
{%if not arg.lastArg %},{%endif%}
5947
{%endeach%}
6048
);
6149

62-
{%each args|argsInfo as arg %}
63-
{%if arg.isCallbackFunction %}
64-
delete {{ arg.name }}_callback;
65-
{%endif%}
66-
{%endeach%}
67-
6850
{%if return.isErrorCode %}
6951
if (result != GIT_OK) {
7052
{%each args|argsInfo as arg %}
@@ -120,5 +102,3 @@ delete {{ arg.name }}_callback;
120102
{%endif%}
121103
{%endif%}
122104
}
123-
124-
{%partial callbackHelpers .%}

generate/templates/templates/class_header.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,25 @@ class {{ cppClassName }} : public ObjectWrap {
135135
};
136136
{%endif%}
137137

138-
{%each function.args as arg %}
139-
{%if arg.payloadFor %}
140-
141-
Persistent<Value> {{ function.cppFunctionName }}_{{ arg.name }};
142-
{%endif%}
143-
{%endeach%}
144-
145138
static NAN_METHOD({{ function.cppFunctionName }});
146139
{%endif%}
147140
{%endeach%}
148141

142+
{%each functions as function%}
143+
{%each function.args as arg %}
144+
{% if arg.globalPayload %}
145+
146+
struct {{ function.cppFunctionName }}_globalPayload {
147+
{%each function.args as arg %}
148+
{%if arg.isCallbackFunction %}
149+
NanCallback * {{ arg.name }};
150+
{%endif%}
151+
{%endeach%}
152+
};
153+
{%endif%}
154+
{%endeach%}
155+
{%endeach%}
156+
149157
{%if cType%}
150158
{{ cType }} *raw;
151159
{%endif%}

0 commit comments

Comments
 (0)