Skip to content

Commit 96af2b7

Browse files
John Haleytbranyen
authored andcommitted
Getting close to having callbacks
1 parent 5b5ce73 commit 96af2b7

7 files changed

Lines changed: 58 additions & 13 deletions

File tree

generate/descriptor.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,10 @@
728728
"returnNoResults": 1,
729729
"returnSuccess": 0,
730730
"returnError": -1
731+
}, {
732+
"name": "payload",
733+
"cType": "void *",
734+
"payloadFor": "*"
731735
}]
732736
},
733737

generate/filters/payload_for.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module.exports = function(fields, payloadForField) {
2+
fields = fields || [];
3+
4+
var result = fields.filter(function (field) {
5+
return field.payloadFor && (field.payloadFor === payloadForField || field.payloadFor === "*");
6+
});
7+
8+
if (result.length > 0) {
9+
return result[0].name;
10+
}
11+
else {
12+
return "";
13+
}
14+
};

generate/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ var filters = {
4444
isPointer: require("./filters/is_pointer"),
4545
isDoublePointer: require("./filters/is_double_pointer"),
4646
unPointer: require("./filters/un_pointer"),
47+
payloadFor: require("./filters/payload_for"),
4748
hasReturnType: require("./filters/has_return_type"),
4849
hasReturns: require("./filters/has_returns"),
4950
returnsCount: require("./filters/returns_count"),

generate/partials/field_accessors.cc

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ NAN_GETTER({{ cppClassName }}::Get{{ field.cppFunctionName }}) {
66

77
{{ cppClassName }} *wrapper = ObjectWrap::Unwrap<{{ cppClassName }}>(args.This());
88

9-
{%if field.hasConstructor | or field.isFunction %}
9+
{%if field.hasConstructor | or field.isFunction | or field.payloadFor %}
1010
NanReturnValue(wrapper->{{ field.name }});
1111
{%elsif field.cppClassName == 'String' %}
1212
if (wrapper->GetValue()->{{ field.name }}) {
@@ -25,13 +25,19 @@ NAN_SETTER({{ cppClassName }}::Set{{ field.cppFunctionName }}) {
2525

2626
{{ cppClassName }} *wrapper = ObjectWrap::Unwrap<{{ cppClassName }}>(args.This());
2727

28-
{%if field.hasConstructor %}
28+
{%if field.hasConstructor | or field.payloadFor %}
29+
wrapper->{{ field.name }}.Dispose();
30+
wrapper->{{ field.name }}.Clear();
31+
2932
wrapper->{{ field.name }} = Persistent<Object>::New(value->ToObject());
33+
{%if field.hasConstructor %}
3034
wrapper->raw->{{ field.name }} = *ObjectWrap::Unwrap<{{ field.cppClassName }}>(value->ToObject())->GetValue();
35+
{%endif%}
3136
{%elsif field.isFunction %}
3237
if (value->IsFunction()) {
38+
wrapper->{{ field.name }}.Dispose();
39+
wrapper->{{ field.name }}.Clear();
3340
wrapper->{{ field.name }} = Persistent<Function>::Cast((Persistent<Value>)value);
34-
wrapper->raw->{{ field.name }} = ({{ field.cType }})&{{ cppClassName }}::{{ field.name}}_cppCallback;
3541
}
3642
{%elsif field.cppClassName == 'String' %}
3743
if (wrapper->GetValue()->{{ field.name }}) {
@@ -58,7 +64,9 @@ NAN_SETTER({{ cppClassName }}::Set{{ field.cppFunctionName }}) {
5864

5965
{%endeach%}
6066
) {
61-
if (!{{ field.name }}->IsFunction()) {
67+
{{ cppClassName }} *instance = ({{ cppClassName }}*)payload;
68+
69+
if (!instance->{{ field.name }}->IsFunction()) {
6270
{%if field.returnType == "int" %}
6371
return {{ field.returnNoResults }}; // no results acquired
6472
{%else%}
@@ -68,14 +76,17 @@ NAN_SETTER({{ cppClassName }}::Set{{ field.cppFunctionName }}) {
6876

6977
Local<Value> argv[{{ field.args|jsArgsCount }}] = {
7078
{%each field.args|argsInfo as arg %}
71-
{%if arg.isJsArg %}
72-
Local<Value>::New(NanNew({{ arg.name }})){%if not arg.lastArg %},{%endif%}
79+
{%if arg.name == "payload" %}
80+
{%-- payload is always the last arg --%}
81+
Local<Value>::New(NanNew(instance->{{ fields|payloadFor field.name }}))
82+
{%elsif arg.isJsArg %}
83+
Local<Value>::New(NanNew({{ arg.name }})),
7384

7485
{%endif%}
7586
{%endeach%}
7687
};
7788

78-
Persistent<Value> result = Persistent<Value>::New(this->{{ field.name }}->Call(Context::GetCurrent()->Global(), {{ field.args|jsArgsCount }}, argv));
89+
Persistent<Value> result = Persistent<Value>::New(instance->{{ field.name }}->Call(Context::GetCurrent()->Global(), {{ field.args|jsArgsCount }}, argv));
7990
{{ field.returnType }} resultStatus;
8091

8192
{%each field|returnsInfo true false as _return%}

generate/templates/binding.gyp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
"WARNING_CFLAGS": [
3636
"-Wno-unused-variable",
37+
"-Wint-conversions",
38+
"-Wmissing-field-initializers"
3739
],
3840
}
3941
}

generate/templates/struct_content.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ void {{ cppClassName }}::ConstructFields() {
5252
{%each fields|fieldsInfo as field %}
5353
{%if field.hasConstructor %}
5454
{{ field.name }} = Persistent<Object>::New({{ field.cppClassName }}::New(&this->raw->{{ field.name }})->ToObject());
55+
{%elsif field.isFunction %}
56+
{{ field.name }} = Persistent<Value>::New(NanNull());
57+
// Set the static method call and set the payload for this function to be
58+
// the current instance
59+
this->raw->{{ field.name }} = ({{ field.cType }}){{ field.name }}_cppCallback;
60+
this->raw->{{ fields|payloadFor field.name }} = (void *)this;
5561
{%endif%}
5662
{%endeach%}
5763
}

generate/templates/struct_header.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ class {{ cppClassName }} : public ObjectWrap {
2828

2929
bool selfFreeing;
3030

31+
{%each fields as field %}
32+
{%if not field.ignore %}
33+
{%if field.isFunction %}
34+
static {{ field.returnType }} {{ field.name }}_cppCallback (
35+
{%each field.args|argsInfo as arg%}
36+
{{ arg.cType }} {{ arg.name}}{%if not arg.lastArg %},{%endif%}
37+
{%endeach%}
38+
);
39+
{%endif%}
40+
{%endif%}
41+
{%endeach%}
42+
3143
private:
3244
{{ cppClassName }}();
3345
~{{ cppClassName }}();
@@ -38,15 +50,10 @@ class {{ cppClassName }} : public ObjectWrap {
3850

3951
{%each fields as field%}
4052
{%if not field.ignore%}
41-
{%if field.hasConstructor %}
53+
{%if field.hasConstructor | or field.payloadFor %}
4254
Persistent<Object> {{ field.name }};
4355
{%elsif field.isFunction %}
4456
Persistent<Function> {{ field.name }};
45-
{{ field.returnType }} {{ field.name }}_cppCallback (
46-
{%each field.args|argsInfo as arg%}
47-
{{ arg.cType }} {{ arg.name}}{%if not arg.lastArg %},{%endif%}
48-
{%endeach%}
49-
);
5057
{%endif%}
5158
static NAN_GETTER(Get{{ field.cppFunctionName }});
5259
static NAN_SETTER(Set{{ field.cppFunctionName }});

0 commit comments

Comments
 (0)