Skip to content

Commit b9f3a07

Browse files
committed
Implement currying in node port for callbacks, solve more memory leaks.
1 parent 97a6e04 commit b9f3a07

File tree

3 files changed

+65
-42
lines changed

3 files changed

+65
-42
lines changed

source/ports/node_port/source/node_port.cpp

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ static void * metacall_node_callback_value_to_napi(size_t argc, void * args[], v
4848

4949
static napi_value metacall_node_callback_napi_to_value(napi_env env, napi_callback_info info);
5050

51+
static void metacall_node_finalizer(napi_env env, napi_value v, void * data);
52+
5153
typedef struct metacall_node_callback_closure_type
5254
{
5355
napi_env env;
@@ -148,11 +150,58 @@ napi_value metacall_node_callback_napi_to_value(napi_env env, napi_callback_info
148150

149151
napi_value result = metacall_node_value_to_napi(env, ret);
150152

151-
metacall_value_destroy(ret);
153+
metacall_node_finalizer(env, result, ret);
152154

153155
return result;
154156
}
155157

158+
void metacall_node_finalizer(napi_env env, napi_value v, void * data)
159+
{
160+
napi_status status;
161+
162+
auto finalizer = [](napi_env, void * finalize_data, void *)
163+
{
164+
metacall_value_destroy(finalize_data);
165+
};
166+
167+
// Create a finalizer for the value
168+
#if (NAPI_VERSION < 5)
169+
{
170+
napi_value symbol, external;
171+
172+
status = napi_create_symbol(env, nullptr, &symbol);
173+
174+
metacall_node_exception(env, status);
175+
176+
status = napi_create_external(env, data, finalizer, nullptr, &external);
177+
178+
metacall_node_exception(env, status);
179+
180+
napi_property_descriptor desc =
181+
{
182+
nullptr,
183+
symbol,
184+
nullptr,
185+
nullptr,
186+
nullptr,
187+
external,
188+
napi_default,
189+
nullptr
190+
};
191+
192+
status = napi_define_properties(env, v, 1, &desc);
193+
194+
metacall_node_exception(env, status);
195+
}
196+
#else // NAPI_VERSION >= 5
197+
{
198+
status = napi_add_finalizer(env, v, data, finalizer, nullptr, nullptr);
199+
200+
metacall_node_exception(env, status);
201+
}
202+
#endif
203+
}
204+
156205
/* END-TODO */
157206

158207
/* BEGIN-TODO: Remove this, it is duplicated code copied from node loader */
@@ -695,47 +744,7 @@ napi_value metacall_node_call(napi_env env, napi_callback_info info)
695744

696745
napi_value result = metacall_node_value_to_napi(env, ret);
697746

698-
auto finalizer = [](napi_env, void * finalize_data, void *)
699-
{
700-
metacall_value_destroy(finalize_data);
701-
};
702-
703-
// Create a finalizer for the value
704-
#if (NAPI_VERSION < 5)
705-
{
706-
napi_value symbol, external;
707-
708-
status = napi_create_symbol(env, nullptr, &symbol);
709-
710-
metacall_node_exception(env, status);
711-
712-
status = napi_create_external(env, ret, finalizer, nullptr, &external);
713-
714-
metacall_node_exception(env, status);
715-
716-
napi_property_descriptor desc =
717-
{
718-
nullptr,
719-
symbol,
720-
nullptr,
721-
nullptr,
722-
nullptr,
723-
external,
724-
napi_default,
725-
nullptr
726-
};
727-
728-
status = napi_define_properties(env, result, 1, &desc);
729-
730-
metacall_node_exception(env, status);
731-
}
732-
#else // NAPI_VERSION >= 5
733-
{
734-
status = napi_add_finalizer(env, result, ret, finalizer, nullptr, nullptr);
735-
736-
metacall_node_exception(env, status);
737-
}
738-
#endif
747+
metacall_node_finalizer(env, result, ret);
739748

740749
return result;
741750
}

source/ports/node_port/test/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ describe('metacall', () => {
127127
const callback = f.function_ret_lambda(10);
128128
assert.notStrictEqual(callback, undefined);
129129
assert.strictEqual(callback(3), 30);
130+
131+
// Currying
132+
const currying = f.function_currying(10);
133+
assert.notStrictEqual(currying, undefined);
134+
assert.strictEqual(currying(2)(3), 60);
135+
136+
// Currying more
137+
assert.strictEqual(f.function_currying_more(5)(4)(3)(2)(1), 120);
130138
});
131139
});
132140
});

source/scripts/python/function/source/function.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,9 @@ def function_print_and_return(x):
1818
def function_ret_lambda(y):
1919
print('Returning lambda with captured arg:', y);
2020
return lambda x: function_print_and_return(x) * y
21+
22+
def function_currying(y):
23+
return lambda x: lambda z: x * z * y
24+
25+
def function_currying_more(y):
26+
return lambda x: lambda z: lambda w: lambda n: x * z * w * n * y

0 commit comments

Comments
 (0)