Skip to content

Commit 4c147b2

Browse files
John Haleymaxkorp
authored andcommitted
Oid's can now be either a string or an Oid object
1 parent 7659e9b commit 4c147b2

File tree

11 files changed

+334
-305
lines changed

11 files changed

+334
-305
lines changed

generate/combyne/filters/is_oid.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = function(arg) {
2+
return arg.cppClassName == "GitOid" && !arg.isSelf && !arg.isReturn;
3+
};
Lines changed: 78 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11

2-
{% partial doc . %}
2+
{%partial doc .%}
33
NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) {
44
NanScope();
5-
{% partial guardArguments . %}
6-
5+
{%partial guardArguments .%}
76
if (args.Length() == {{args|jsArgsCount}} || !args[{{args|jsArgsCount}}]->IsFunction()) {
87
return NanThrowError("Callback is required and must be a Function.");
98
}
@@ -13,85 +12,90 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) {
1312
baton->error_code = GIT_OK;
1413
baton->error = NULL;
1514

16-
{% each args|argsInfo as arg %}
17-
{% if not arg.isReturn %}
18-
{% if arg.isSelf %}
19-
baton->{{ arg.name }} = ObjectWrap::Unwrap<{{ arg.cppClassName }}>(args.This())->GetValue();
20-
{% elsif arg.name %}
21-
{% partial convertFromV8 arg %}
22-
{% if not arg.isPayload %}
23-
baton->{{ arg.name }} = from_{{ arg.name }};
24-
{% endif %}
25-
{% endif %}
26-
{% elsif arg.shouldAlloc %}
27-
baton->{{ arg.name }} = ({{ arg.cType }})malloc(sizeof({{ arg.cType|replace '*' '' }}));
28-
{% endif %}
29-
{% endeach %}
15+
{%each args|argsInfo as arg %}
16+
{%if not arg.isReturn %}
17+
{%if arg.isSelf %}
18+
baton->{{ arg.name }} = ObjectWrap::Unwrap<{{ arg.cppClassName }}>(args.This())->GetValue();
19+
{%elsif arg.name %}
20+
{%partial convertFromV8 arg%}
21+
{%if not arg.isPayload %}
22+
baton->{{ arg.name }} = from_{{ arg.name }};
23+
{%if arg.cppClassName | isOid %}
24+
baton->{{ arg.name }}NeedsFree = args[{{ arg.jsArg }}]->IsString();
25+
{%endif%}
26+
{%endif%}
27+
{%endif%}
28+
{%elsif arg.shouldAlloc %}
29+
baton->{{ arg.name }} = ({{ arg.cType }})malloc(sizeof({{ arg.cType|replace '*' '' }}));
30+
{%endif%}
31+
{%endeach%}
3032

3133
NanCallback *callback = new NanCallback(Local<Function>::Cast(args[{{args|jsArgsCount}}]));
3234
{{ cppFunctionName }}Worker *worker = new {{ cppFunctionName }}Worker(baton, callback);
33-
{% each args|argsInfo as arg %}
34-
{% if not arg.isReturn %}
35-
{% if arg.isSelf %}
35+
{%each args|argsInfo as arg %}
36+
{%if not arg.isReturn %}
37+
{%if arg.isSelf %}
3638
worker->SaveToPersistent("{{ arg.name }}", args.This());
37-
{% else %}
39+
{%else%}
3840
if (!args[{{ arg.jsArg }}]->IsUndefined() && !args[{{ arg.jsArg }}]->IsNull())
3941
worker->SaveToPersistent("{{ arg.name }}", args[{{ arg.jsArg }}]->ToObject());
40-
{% endif %}
41-
{% endif %}
42-
{% endeach %}
42+
{%endif%}
43+
{%endif%}
44+
{%endeach%}
4345

4446
NanAsyncQueueWorker(worker);
4547
NanReturnUndefined();
4648
}
4749

48-
// startexecute {{ cppFunctionName }}
4950
void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() {
50-
{% if .|hasReturnType %}
51-
{{ return.cType }} result = {{ cFunctionName }}
52-
{% else %}
53-
{{ cFunctionName }}
54-
{% endif %}
55-
(
56-
57-
{% each .args|argsInfo as arg %}
58-
{% if arg.isReturn|and arg.cType|isDoublePointer %}&{% endif %}baton->{{ arg.name }}{% if not arg.lastArg %},{% endif %}
59-
{% endeach %}
60-
);
61-
62-
{% if return.isErrorCode %}
63-
baton->error_code = result;
64-
65-
if (result != GIT_OK && giterr_last() != NULL) {
66-
baton->error = git_error_dup(giterr_last());
67-
}
68-
{% elsif not return.cType == 'void' %}
69-
baton->result = result;
70-
{% endif %}
51+
{%if .|hasReturnType %}
52+
{{ return.cType }} result = {{ cFunctionName }}(
53+
{%else%}
54+
{{ cFunctionName }}(
55+
{%endif%}
56+
{%-- Insert Function Arguments --%}
57+
{%each args|argsInfo as arg %}
58+
{%-- turn the pointer into a ref --%}
59+
{%if arg.isReturn|and arg.cType|isDoublePointer %}&{%endif%}baton->{{ arg.name }}{%if not arg.lastArg %},{%endif%}
60+
61+
{%endeach%}
62+
);
63+
64+
{%if return.isErrorCode %}
65+
baton->error_code = result;
66+
67+
if (result != GIT_OK && giterr_last() != NULL) {
68+
baton->error = git_error_dup(giterr_last());
69+
}
70+
71+
{%elsif not return.cType == 'void' %}
72+
73+
baton->result = result;
74+
75+
{%endif%}
7176
}
72-
// done
7377

7478
void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() {
7579
TryCatch try_catch;
7680

7781
if (baton->error_code == GIT_OK) {
78-
{% if not .|returnsCount %}
82+
{%if not .|returnsCount %}
7983
Handle<Value> result = NanUndefined();
80-
{% else %}
84+
{%else%}
8185
Handle<Value> to;
82-
{% if .|returnsCount > 1 %}
86+
{%if .|returnsCount > 1 %}
8387
Handle<Object> result = NanNew<Object>();
84-
{% endif %}
85-
{% each .|returnsInfo 0 1 as _return %}
86-
{% partial convertToV8 _return %}
87-
{% if .|returnsCount > 1 %}
88+
{%endif%}
89+
{%each .|returnsInfo 0 1 as _return %}
90+
{%partial convertToV8 _return %}
91+
{%if .|returnsCount > 1 %}
8892
result->Set(NanNew<String>("{{ _return.returnNameOrName }}"), to);
89-
{% endif %}
90-
{% endeach %}
91-
{% if .|returnsCount == 1 %}
93+
{%endif%}
94+
{%endeach%}
95+
{%if .|returnsCount == 1 %}
9296
Handle<Value> result = to;
93-
{% endif %}
94-
{% endif %}
97+
{%endif%}
98+
{%endif%}
9599
Handle<Value> argv[2] = {
96100
NanNull(),
97101
result
@@ -110,26 +114,30 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() {
110114
callback->Call(0, NULL);
111115
}
112116

113-
{% each args as arg %}
114-
{% if arg.shouldAlloc %}
117+
{%each args as arg %}
118+
{%if arg.shouldAlloc %}
115119
free((void*)baton->{{ arg.name }});
116-
{% endif %}
117-
{% endeach %}
120+
{%endif%}
121+
{%endeach%}
118122
}
119123

120124
if (try_catch.HasCaught()) {
121125
node::FatalException(try_catch);
122126
}
123127

124-
{% each args|argsInfo as arg %}
125-
{% if arg.isCppClassStringOrArray %}
126-
{% if arg.freeFunctionName %}
128+
{%each args|argsInfo as arg %}
129+
{%if arg.isCppClassStringOrArray %}
130+
{%if arg.freeFunctionName %}
127131
{{ arg.freeFunctionName }}(baton->{{ arg.name }});
128-
{% else %}
132+
{%else%}
129133
free((void *)baton->{{ arg.name }});
130-
{% endif %}
131-
{% endif %}
132-
{% endeach %}
134+
{%endif%}
135+
{%elsif arg.cppClassName | isOid %}
136+
if (baton->{{ arg.name}}NeedsFree) {
137+
free((void *)baton->{{ arg.name }});
138+
}
139+
{%endif%}
140+
{%endeach%}
133141

134142
delete baton;
135143
}
Lines changed: 77 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,87 @@
1-
{% if not isPayload %}
1+
{%if not isPayload %}
2+
// start convert_from_v8 block
23
{{ cType }} from_{{ name }};
3-
{% if isOptional %}
4-
if (args[{{ jsArg }}]->Is{{ cppClassName|cppToV8 }}()) {
5-
{% endif %}
4+
{%if isOptional | or isBoolean %}
65

7-
{% if cppClassName == 'String' %}
6+
if (args[{{ jsArg }}]->Is{{ cppClassName|cppToV8 }}()) {
7+
{%endif%}
8+
{%if cppClassName == 'String'%}
89

9-
String::Utf8Value {{ name }}(args[{{ jsArg }}]->ToString());
10-
from_{{ name }} = ({{ cType }}) strdup(*{{ name }});
10+
String::Utf8Value {{ name }}(args[{{ jsArg }}]->ToString());
11+
from_{{ name }} = ({{ cType }}) strdup(*{{ name }});
12+
{%elsif cppClassName == 'Wrapper'%}
1113

12-
{% elsif cppClassName == 'Wrapper' %}
14+
String::Utf8Value {{ name }}(args[{{ jsArg }}]->ToString());
15+
from_{{ name }} = ({{ cType }}) strdup(*{{ name }});
16+
{%elsif cppClassName == 'Array'%}
1317

14-
String::Utf8Value {{ name }}(args[{{ jsArg }}]->ToString());
15-
from_{{ name }} = ({{ cType }}) strdup(*{{ name }});
18+
Array *tmp_{{ name }} = Array::Cast(*args[{{ jsArg }}]);
19+
from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|replace '**' '*' }}));
20+
for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) {
21+
{%--
22+
// FIXME: should recursively call convertFromv8.
23+
--%}
24+
from_{{ name }}[i] = ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(tmp_{{ name }}->Get(NanNew<Number>(static_cast<double>(i)))->ToObject())->GetValue();
25+
}
26+
{%elsif cppClassName == 'Function'%}
27+
{%elsif cppClassName == 'Buffer'%}
1628

17-
{% elsif cppClassName == 'Array' %}
29+
from_{{ name }} = Buffer::Data(args[{{ jsArg }}]->ToObject());
30+
{%elsif cppClassName|isV8Value %}
1831

19-
Array *tmp_{{ name }} = Array::Cast(*args[{{ jsArg }}]);
20-
from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|replace '**' '*' }}));
21-
for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) {
32+
{%if cType|isPointer %}
33+
*from_{{ name }} = ({{ cType|unPointer }}) {{ cast }} {%if isEnum %}(int){%endif%} args[{{ jsArg }}]->To{{ cppClassName }}()->Value();
34+
{%else%}
35+
from_{{ name }} = ({{ cType }}) {{ cast }} {%if isEnum %}(int){%endif%} args[{{ jsArg }}]->To{{ cppClassName }}()->Value();
36+
{%endif%}
37+
{%elsif cppClassName == 'GitOid'%}
38+
if (args[{{ jsArg }}]->IsString()) {
39+
// Try and parse in a string to a git_oid
40+
String::Utf8Value oidString(args[{{ jsArg }}]->ToString());
41+
git_oid *oidOut = (git_oid *)malloc(sizeof(git_oid));
2242

23-
{%-- FIXME: should recursively call convertFromv8. --%}
24-
from_{{ name }}[i] = ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(tmp_{{ name }}->Get(NanNew<Number>(static_cast<double>(i)))->ToObject())->GetValue();
25-
}
26-
{% elsif cppClassName == 'Function' %}
27-
28-
{% elsif cppClassName == 'Buffer' %}
29-
30-
from_{{ name }} = Buffer::Data(args[{{ jsArg }}]->ToObject());
31-
32-
{% elsif cppClassName|isV8Value %}
33-
{% if cType|isPointer %}
34-
*from_{{ name }} = ({{ cType|unPointer }}) {{ cast }} {% if isEnum %}(int){% endif %} args[{{ jsArg }}]->To{{ cppClassName }}()->Value();
35-
{% else %}
36-
from_{{ name }} = ({{ cType }}) {{ cast }} {% if isEnum %}(int){% endif %} args[{{ jsArg }}]->To{{ cppClassName }}()->Value();
37-
{% endif %}
38-
{% else %}
39-
{% if cType|isDoublePointer %}
40-
from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetRefValue();
41-
{% else %}
42-
from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetValue();
43-
{% endif %}
44-
{% endif %}
45-
46-
{% if isOptional %}
47-
}
48-
else {
49-
from_{{ name }} = 0;
43+
if (git_oid_fromstr(oidOut, (const char *) strdup(*oidString)) != GIT_OK) {
44+
free(oidOut);
45+
46+
if (giterr_last()) {
47+
return NanThrowError(giterr_last()->message);
48+
} else {
49+
return NanThrowError("Unknown Error");
50+
}
5051
}
5152

52-
{% endif %}
53-
{% endif %}
53+
{%if cType|isDoublePointer %}
54+
from_{{ name }} = &oidOut;
55+
{%else%}
56+
from_{{ name }} = oidOut;
57+
{%endif%}
58+
}
59+
else {
60+
{%if cType|isDoublePointer %}
61+
from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetRefValue();
62+
{%else%}
63+
from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetValue();
64+
{%endif%}
65+
}
66+
{%else%}
67+
{%if cType|isDoublePointer %}
68+
from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetRefValue();
69+
{%else%}
70+
from_{{ name }} = ObjectWrap::Unwrap<{{ cppClassName }}>(args[{{ jsArg }}]->ToObject())->GetValue();
71+
{%endif%}
72+
{%endif%}
73+
74+
{%if isBoolean %}
75+
}
76+
else {
77+
from_{{ name }} = args[{{ jsArg }}]->IsTrue() ? 1 : 0;
78+
}
79+
{%elsif isOptional %}
80+
}
81+
else {
82+
from_{{ name }} = 0;
83+
}
84+
85+
{%endif%}
86+
// end convert_from_v8 block
87+
{%endif%}
Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
{% each args|argsInfo as arg %}
2-
{% if arg.isJsArg %}
3-
{% if not arg.isOptional %}
4-
if (args.Length() == {{arg.jsArg}} || !args[{{arg.jsArg}}]->Is{{arg.cppClassName|cppToV8}}()) {
5-
return NanThrowError("{{arg.jsClassName}} {{arg.name}} is required.");
6-
}
7-
{% endif %}
8-
{% endif %}
9-
{% endeach %}
1+
2+
{%each args|argsInfo as arg%}
3+
{%if arg.isJsArg%}
4+
{%if not arg.isOptional%}
5+
{%if arg | isOid %}
6+
if (args.Length() == {{arg.jsArg}}
7+
|| (!args[{{arg.jsArg}}]->IsObject() && !args[{{arg.jsArg}}]->IsString())) {
8+
return NanThrowError("{{arg.jsClassName}} {{arg.name}} is required.");
9+
}
10+
11+
{%else%}
12+
if (args.Length() == {{arg.jsArg}} || !args[{{arg.jsArg}}]->Is{{arg.cppClassName|cppToV8}}()) {
13+
return NanThrowError("{{arg.jsClassName}} {{arg.name}} is required.");
14+
}
15+
16+
{%endif%}
17+
{%endif%}
18+
{%endif%}
19+
{%endeach%}

0 commit comments

Comments
 (0)